CUDA快速数学运算

时间:2011-07-25 08:21:42

标签: cuda

这是我的代码,

    __device__ void calculateDT(float *devD, int *devImg, int cntVoxelLi, int *neighVoxels)
   {
    float minV = devD[cntVoxelLi];
   int cv = devImg[cntVoxelLi];
   float v = 0,cuVal = 0;
   int c1=0,d1=0,r1=0;
   GetInd2Sub(cntVoxelLi, r1,c1,d1);

   for(int ind=0;ind<9;ind++)
   {
    v = pow(float(cv - devImg[neighVoxels[ind]]),2);
    cuVal = devD[neighVoxels[ind]]  + (1-exp(-v/100));
    minV = min(minV, cuVal);
   }
   devD[cntVoxelLi] = minV;
   }

当我运行整个程序时,大约需要15秒。但是当我删除

     exp(-v/100)

只需7秒钟。似乎这个exp操作需要很长时间。我也尝试使用expf函数。如何提高性能?

1 个答案:

答案 0 :(得分:4)

您看到的性能差异主要是编译器优化的结果。当您删除exp表达式时,变量v将被取消,编译器将删除v的计算,因为它实际上是死代码。因此,执行时间的大幅下降是由于消除了内核循环的所有浮点计算,而不是单独删除exp函数。

对于性能优化,显而易见的是消除使用pow来计算一个简单的正方形(编译器可能自己这样做),并整理所有浮点表达式以消除数字隐式整数浮点转换(提示:0是整数,0是双精度,0.f是单精度)。

很难从您发布的代码中评论内核中的内存事务性能。 CUDA 4可视化分析器具有一些有用的诊断功能,可以显示一段代码是内存还是算术限制。您可能会发现分析代码并查看其报告的内容非常有用。