为何CUDA程序性能极差?RTX 3050运行代码远慢于CPU
问题本质:你的代码完全没利用GPU的并行优势
这既不是驱动问题,也不是编译标志的锅,完全是代码设计的问题导致GPU性能发挥不出来。
- GPU的核心优势是大规模并行计算,单线程性能天生不如CPU。RTX3050的流处理器是为同时跑成百上千个线程优化的,单线程的运算单元精简,缓存、分支预测这些单线程性能相关的设计远不如CPU。你用2.1GHz的GPU单线程去跟2.4GHz的CPU单线程比串行循环,GPU输是正常的。
- 你的代码只启动了1个CUDA线程(
<<<1,1>>>),相当于把GPU当成了一个性能更弱的单核心CPU用,完全浪费了它的并行能力。 - 另外,设备端的
printf开销极大,比CPU端的printf慢得多,循环里的这个打印操作进一步拖慢了GPU的执行速度。
正确测试GPU性能的方式
如果要验证GPU的性能,得写并行化的代码:比如启动几千甚至几万个线程,让每个线程处理一部分计算任务(比如向量加法、矩阵元素运算)。举个简单例子,把循环拆成多个线程并行执行:
__global__ void testcuda(int n, uint* result) { int idx = threadIdx.x + blockIdx.x * blockDim.x; if (idx < n) { uint counter = 0; do { counter++; } while (counter != 0); result[idx] = counter; } } // 启动1024个线程块,每个块256个线程,总共262144个线程 testcuda<<<1024, 256>>>(262144, d_result);
这种情况下,GPU能同时跑大量线程,性能才会远超CPU。
内容的提问来源于stack exchange,提问作者AlexDem
相关产品推荐
相关产品推荐

