我对CUDA编程比较陌生,我正在测试不同的简单内核,以查看执行时间的差异。
我有两个内核,对我也这样做:
__global__ void mathKernel2(float *c)
{
int tid = blockIdx.x * blockDim.x + threadIdx.x;
float ia, ib;
ia = ib = 0.0f;
if ((tid / warpSize) % 2 == 0)
{
ia = 100.0f;
}
else
{
ib = 200.0f;
}
c[tid] = ia + ib;
}
另一个:
__global__ void mathKernel4(float *c)
{
int tid = blockIdx.x * blockDim.x + threadIdx.x;
float ia, ib;
ia = ib = 0.0f;
int itid = tid >> 5;
if (itid & 0x01 == 0)
{
ia = 100.0f;
}
else
{
ib = 200.0f;
}
c[tid] = ia + ib;
}
我用-g -G编译它以摆脱优化并得到:
mathKernel2 <<< 8192 32 >>> elapsed 0.000259 sec
mathKernel4 <<< 8192 32 >>> elapsed 0.000103 sec
为什么差异如此之大?
答案 0 :(得分:3)
这一行:
if (itid & 0x01 == 0)
读作:
if (itid & (0x01 == 0))
在编译时评估到false
,其中一个分支被删除。
按位二元运算符在C / C ++和CUDA中具有相当低的优先级。