CUDAで最小、最大、合計、平均を使用して並列削減を実装しようとしています。
これは、現時点での私のメインコードスニペットです。
int main()
{
const auto count = 8;
const int size = count * sizeof(int);
int h[] = {13, 27, 15, 14, 33, 2, 24, 6};
int* d;
int choice = 0;
do{
cout <<"\n ---MENU--- \n";
cout <<"1. Find Sum of Numbers in Array\n";
cout <<"2. Find Max of Array\n";
cout <<"3. Find Min of Array\n";
cout <<"4. Find Average of Array\n";
cout <<"5. Exit\n";
cout <<"Enter your Choice : ";
cin >> choice;
switch(choice){
case 1:
cudaMalloc(&d, size);
cudaMemcpy(d, h, size, cudaMemcpyHostToDevice);
sum <<<1, count / 2 >>>(d);
int result;
cudaMemcpy(&result, d, sizeof(int), cudaMemcpyDeviceToHost);
cout << "Sum is " << result << endl;
getchar();
cudaFree(d);
delete[] h;
break;
case 5:
break;
default:
cout<<"Wrong Input!! Try Again!";
break;
}
}while(choice != 5);
return 0;
}
これはSUM用の私のCUDAカーネルです:
__global__ void sum(int* input)
{
const int tid = threadIdx.x;
auto step_size = 1;
int number_of_threads = blockDim.x;
while (number_of_threads > 0)
{
if (tid < number_of_threads) // still alive?
{
const auto fst = tid * step_size * 2;
const auto snd = fst + step_size;
input[fst] += input[snd];
}
step_size <<= 1;
number_of_threads >>= 1;
}
}
プログラムを実行すると、これがOUTPUTとして取得されます。
この問題を解決するにはどうすればよいですか?私を助けてください。
コンパイラの警告を無視しないでください。delete[]
動的に割り当てられていない配列を呼び出しています。これは未定義の動作であり、コアダンプの原因である可能性があります。
delete[]
スタック上の配列を呼び出す必要はありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加