このカーネルは正しいことを行っており、正しい結果が得られています。パフォーマンスを向上させたい場合、私の問題は while ループの正確性にあります。ブロックとスレッドの構成をいくつか試しましたが、それらを変更しようとすると、while ループで正しい結果が得られません。カーネルの構成を変更して得た結果は、firstArray と secondArray が完全に埋められないことです (セル内に 0 があります)。両方の配列には、 if ループから取得した curValue を入力する必要があります。
どんなアドバイスも大歓迎です:)
前もって感謝します
#define N 65536
__global__ void whileLoop(int* firstArray_device, int* secondArray_device)
{
int curValue = 0;
int curIndex = 1;
int i = (threadIdx.x)+2;
while(i < N) {
if (i % curIndex == 0) {
curValue = curValue + curIndex;
curIndex *= 2;
}
firstArray_device[i] = curValue;
secondArray_device[i] = curValue;
i += blockDim.x * gridDim.x;
}
}
int main(){
firstArray_host[0] = 0;
firstArray_host[1] = 1;
secondArray_host[0] = 0;
secondArray_host[1] = 1;
// memory allocation + copy on GPU
// definition number of blocks and threads
dim3 dimBlock(1, 1);
dim3 dimGrid(1, 1);
whileLoop<<<dimGrid, dimBlock>>>(firstArray_device, secondArray_device);
// copy back to CPU + free memory
}