网站更换备案吗,中国网建设频道网站logo,汕头免费建站哪里有,本机建的网站打开却很慢问题#xff1a;GPU显卡提高后#xff0c;代码总体运行效率没有提高
原先显卡NIVIDA T400换成NVIDIA RTX A4000#xff0c;CUDA核心#xff08;物理GPU线程单位#xff09;从三百多提升到了六千多#xff0c;但是程序总体运行的时间没有变化。
原因分析
显卡没用上或者…问题GPU显卡提高后代码总体运行效率没有提高
原先显卡NIVIDA T400换成NVIDIA RTX A4000CUDA核心物理GPU线程单位从三百多提升到了六千多但是程序总体运行的时间没有变化。
原因分析
显卡没用上或者没有配置好实际上还是用CPU在跑。GPU跑了但是GPU和CPU并行效率没有对齐。
检查是否有用上GPU
任务管理器
在任务管理器中看程序运行后CUDA调用GPU的情况。
nvidia-smi
打开cmd命令行输入nvidia-smi即可查看NVIDIA GPU使用状况。
NIVIDA性能分析工具nvprof、nvvp和Nsight Systems
前面任务管理器都只能看某些时刻电脑整体GPU占用情况但接下来介绍的三个性能分析工具能够显示程序很详细的GPU、CPU使用情况甚至能精确到某个函数。
在Windows机器环境下在安装好CUDA Toolkit后则自带了nvprof / nvvp等工具。nvprof / nvvp等工具能够计算GPU和CPU使用情况以此来实现对程序的性能分析。
两者区别nvprof是命令行测试CUDA程序nvvp则是带有界面的测试CUDA程序。
对于CUDA版本比较低的可以使用nvprof / nvvp工具做性能测试但是版本高了之后就会报错。 原因在于官方把更高版本的cuda从nvprof和nvvp迁移到了Nsight Systems。
上述工具可能会遇到的问题
nvprof报错找不到cupti64_2021.2.0.dll无法继续执行代码… 方法路径NVIDIA GPU Computing Toolkit\CUDA\v11.4\extras\CUPTI\lib64下面找到cupti64_2021.2.0.dll复制到NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin中。nvvp报错An error has occurred.See the log file… 方法原因是电脑没有安装JDK8去网上搜索一下JDK8然后安装就行。nvvp使用打开后进行create new sessionFile选择你要进行测性能的可执行文件exe一般VS程序Debug文件夹下会有程序对应可执行的exe。
代码断点
在CUDA选中显卡信息和分配GPU内存部分打断点或者输出一下信息看看显卡信息是否正确以及内存是否有正确分配。
// 查看选中GPU的信息
cudaDeviceProp prop;
cudaSetDevice(device_id);// 选中编号为device_id的GPU设备
cudaGetDeviceProperties(prop, device_id);// 获取device_id的GPU设备信息可以在这里打个断点看看选中的GPU信息是否正确// 分配GPU内存
status cudaMalloc((void**) data, sizeof(int)*n);// 为data分配长度为n的int类型GPU内存查看status是否为success判断是否使用了GPU检查GPU和CPU并行效率是否对齐
通过在代码设置时间戳来记录CPU和GPU运行的时间来判断是否达成并行的条件。
举例子一个程序需要完成获取、处理、输出数据的工作处理数据的部分可以交给GPU完成其余交给CPUGPU和CPU之间能够并行工作。如果CPU获取数据的时间GPU处理数据的时间那么GPU处理的速度再快整体的运行时间也不会有多少改变因为GPU每次处理完数据都要先等CPU获取完数据。但是如果CPU获取数据的时间GPU处理数据的时间那么GPU处理的速度提高就会降低整体运行时间。最理想的情况就是两个时间相等CPU获取到数据的时候GPU刚好处理完上一个数据这样两者的性能都不会有冗余。
GPU显卡提高后代码总体运行效率没有提高可能原因就是“CPU获取数据的时间GPU处理数据的时间”。
C通过时间戳GetTickCount()获取运行时间来计算GPU和CPU部分代码的时间来判断是否有上述情况
#includeiostream
#includewindows.h
int main(){DWORD start_timeGetTickCount();{//此处为被测试代码}DWORD end_timeGetTickCount();coutThe run time is:(end_time-start_time)ms!endl;//输出运行时间return 0;
}