我有以下代碼,它逐步遍歷一串位並將它們重新排列爲20個字節的塊。我使用32 * 8塊,每塊有40個線程。然而這個過程在我的GT630M上需要36ms。我可以做什麼進一步的優化?特別是關於刪除最內層循環中的if-else。優化Bit-Wise操縱內核
__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
}
}
您可以從*始終*開始,使用大小爲整經倍數的塊大小。每塊使用40個線程會浪費GPU上所有可用週期的37%。 – talonmies 2012-07-15 15:19:58
此外,您可能希望同時啓動多個線程以隱藏更新。 – 2012-07-15 21:19:50
你的外循環在每次迭代時寫入'dataBlock [threadIdx.x] = temp;'所以你覆蓋了'streamSize/8'的同一個位置。將該線移到循環外部。 – harrism 2012-09-12 00:24:22