このカーネルは正しい結果を得ています。パフォーマンスを向上させたい場合、私の問題はwhileループの正確さです。私はブロックとスレッドのいくつかの設定を試みたが、私はそれらを変更するつもりなら、whileループは私に正しい結果を与えません。 カーネルの設定を変更して得た結果は、firstArrayとsecondArrayが完全には満たされない(セル内に0が入る)ということです。ループの場合、両方の配列はから取得されたcurValueで埋められる必要があります。CUDA:whileループの正確さ
何かアドバイスは歓迎される:)
をあなたはいくつかの意味の最適化を行うことを妨げ、ここでデータ依存性の問題を持って事前に
#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
}
これは本当に最適化問題ではありません - それはそれは、正しさの一つではないでしょうか? – talonmies
私はあなたが正しいと思います。投稿のタイトルを変更します。 – davideberdin
私は本当に質問を理解していません...あなたはアドバイスが必要なのですか?あなたのカーネルは正しく動作しますが、 "正確さ"に問題があると言いますか? –