私はCUDA並列プログラミングチュートリアルの紹介に従っています。有効な回答を得るのが難しいです。Cudaを使用してポインタ配列を追加する。最初の値だけが正しいです
チュートリアル - >http://www.nvidia.com/docs/IO/116711/sc11-cuda-c-basics.pdf
私のコードは、コンパイルされ、ただし、配列の最初の整数が正しく計算されて実行される、チュートリアルに似ている、下記掲載しました。
データ整列の問題があるようですが、なぜか分かりません。また、この方法で配列上で数学演算を行ったことはありませんでした(インデックスなしで追加し、ビット境界を定義するためにブロックサイズに依存しています)。
私はそれがうまくいくことを理解しており、それはチュートリアルで動作しますので、私は何か見落としていると思います。誰かが私を正しい方向に向けることができますか?
#include <iostream>
#include <cstdlib>
#include <ctime>
__global__ void add(int* a, int* b, int* c) {
*c = *a + *b;
}
int main(){
srand(time(NULL));
int n = 100;
int size = n * sizeof(int);
int* inputA;
int* inputB;
int* output;
int* d_inputA;
int* d_inputB;
int* d_output;
inputA = (int*)malloc(size);
inputB = (int*)malloc(size);
output = (int*)malloc(size);
cudaMalloc((void**)&d_inputA, size);
cudaMalloc((void**)&d_inputB, size);
cudaMalloc((void**)&d_output, size);
for(int i = 0; i < n; i++) {
inputA[i] = rand() % 100 + 1;
inputB[i] = rand() % 500 +1;
}
cudaMemcpy(d_inputA, inputA, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_inputB, inputB, size, cudaMemcpyHostToDevice);
add<<<n,1>>>(d_inputA, d_inputB, d_output);
cudaMemcpy(output, d_output, size, cudaMemcpyDeviceToHost);
for(int i = 0; i < n; i++) {
std::cout << i << ": "
<< inputA[i] << " + " << inputB[i] << " = "
<< output[i] << std::endl;
}
free(inputA);
free(inputB);
free(output);
cudaFree(d_inputA);
cudaFree(d_inputB);
cudaFree(d_output);
return 0;
}
これは意味があります。私はそれを見たが、それらの変更を忘れてしまった。 – mreff555