私は CUDA の学習を開始し、いくつかのデータを GPU にコピーして変更し、元に戻す単純なプログラムを書きたいと思いました。私はすでにグーグルで調べて、自分の間違いを見つけようとしました。問題がカーネルにあることは確かですが、何が問題なのか完全にはわかりません。
これが私のカーネルです:
__global__ void doStuff(float* data, float* result)
{
if (threadIdx.x < 9) // take the first 9 threads
{
int index = threadIdx.x;
result[index] = (float) index;
}
}
そして、これが my の関連部分ですmain
:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
/*
Setup
*/
float simple[] = {-1.0, -2.0, -3.0, -4.0, -5.0, -6.0, -7.0, -8.0, -9.0};
float* data_array;
float* result_array;
size_t data_array_pitch, result_array_pitch;
int width_in_bytes = 3 * sizeof(float);
int height = 3;
/*
Initialize GPU arrays
*/
cudaMallocPitch(&data_array, &data_array_pitch, width_in_bytes, height);
cudaMallocPitch(&result_array, &result_array_pitch, width_in_bytes, height);
/*
Copy data to GPU
*/
cudaMemcpy2D(data_array, data_array_pitch, simple, width_in_bytes, width_in_bytes, height, cudaMemcpyHostToDevice);
dim3 threads_per_block(16, 16);
dim3 num_blocks(1,1);
/*
Do stuff
*/
doStuff<<<num_blocks, threads_per_blocks>>>(data_array, result_array);
/*
Get the results
*/
cudaMemcpy2D(simple, width_in_bytes, result_array, result_array_pitch, width_in_bytes, height, cudaMemcpyDeviceToHost);
for (int i = 1; i <= 9; ++i)
{
printf("%f ", simple[i-1]);
if(!(i%3))
printf("\n");
}
return 0;
}
これを実行する0.000000 1.000000 2.00000
と、最初の行が取得され、残りの 2 行がガベージになります。