我有以下代码,它逐步遍历一串位并将它们重新排列成20字节的块。我使用32 * 8块,每块40个线程。然而,我的GT630M上的过程需要36毫秒。我可以做进一步的优化吗?特别是关于在最内层循环中删除if-else。
__global__ void test(unsigned char *data)
{
__shared__ unsigned char dataBlock[20];
__shared__ int count;
count = 0;
unsigned char temp = 0x00;
for(count=0; count<(streamSize/8); count++)
{
for(int i=0; i<8; i++)
{
if(blockIdx.y >= i)
temp |= (*(data + threadIdx.x*(blockIdx.x + gridDim.x*(i+count)))&(0x01<<blockIdx.y))>>(blockIdx.y - i);
else
temp |= (*(data + threadIdx.x*(blockIdx.x + gridDim.x*(i+count)))&(0x01<<blockIdx.y))<<(i - blockIdx.y);
}
dataBlock[threadIdx.x] = temp;
//do something
}
}
答案 0 :(得分:1)
目前还不清楚你的代码想要完成什么,但有几个明显的机会是:
1)如果可能,使用32位字而不是unsigned char。
2)使用32的倍数的块大小。
3)条件代码可能不会像你期望的那样花费你。您可以通过编译--cubin --gpu-architecture sm_xx(其中xx是目标硬件的SM版本)进行检查,并在生成的cubin文件上使用cuobjdump --dump-sass来查看生成的程序集。您可能必须修改源代码以将公共子表达式放入单独的变量中,和/或使用三元运算符? :提示编译器使用预测。