如何提高CUDA内核的计算利用率?

时间:2014-02-02 05:23:58

标签: cuda profiler

好的,所以我的内核A正在从设备内存中读取两个变量。执行Ex-OR并将它们存储回设备存储器。

然而,其他一些对这些变量执行大量额外计算然后将它们存储回设备内存的内核B的性能优于内核A.我明白如果计算利用率很低,大多数情况下所有的warp都将是等待内存访问完成而不是做一些计算。但是内核B怎么会有相同的没有。每个线程的内存访问和额外的计算更快地完成所有事情?

另外,我尝试在内核A中添加了很多合成算术运算,但是分析器仍然显示相同的计算利用率?那里到底发生了什么?

__global__ void A(int *dr,int p,int  q,int NORi)
{
    const int tid = blockDim.x * blockIdx.x + threadIdx.x;
    const int N = blockDim.x*gridDim.x;
    for(int i=0;i<NORi;i++)
    {
        dr[(i+p)*N +tid] = dr[i*N+tid] ^ dr[(i+q)*N+tid];
    }
}

内存访问已合并。内核B是相同的,但它在存储结果之前对两个操作数执行更多的算术计算,而不是仅执行异或运算。

1 个答案:

答案 0 :(得分:1)

内核B是否也在执行XOR?如果不是,则可能是各种操作的吞吐量问题。检查“CUDA C编程指南”中的“本机算术指令吞吐量”表。例如,在Kepler上,XOR的吞吐量仅为整数乘法吞吐量的1/5。