这是我的代码,
__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函数。如何提高性能?
答案 0 :(得分:4)
您看到的性能差异主要是编译器优化的结果。当您删除exp
表达式时,变量v
将被取消,编译器将删除v
的计算,因为它实际上是死代码。因此,执行时间的大幅下降是由于消除了内核循环的所有浮点计算,而不是单独删除exp
函数。
对于性能优化,显而易见的是消除使用pow
来计算一个简单的正方形(编译器可能自己这样做),并整理所有浮点表达式以消除数字隐式整数浮点转换(提示:0是整数,0是双精度,0.f是单精度)。
很难从您发布的代码中评论内核中的内存事务性能。 CUDA 4可视化分析器具有一些有用的诊断功能,可以显示一段代码是内存还是算术限制。您可能会发现分析代码并查看其报告的内容非常有用。