私は、フロートを持つ配列を関数にマップするカーネルで遊んでいました。理由はわかりませんが、プログラムを実行するたびに、古い結果が新しい結果に追加されます (cudaFree が空きメモリを設定していないように思えますが、関数の戻り値は 0 です)。
たとえば、最初のカーネル実行後の元の数値 0.758846 は -0.123258 でしたが、いくつかの新しい実行後の結果は -9.996812 です。
これはカーネルとメインです:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <cuda.h>
#define PI 3.1415926
/* f(x) = sum from i = 1 to m sin(2 * PI * i * x) */
__global__ void mapping(float *data_d, int sample_size, int m) {
int i;
int tid = blockIdx.x;
float sum;
if(tid < sample_size) {
for(i = 1; i < m + 1; i++)
sum += sin(2 * PI * i * data_d[tid]);
data_d[tid] = sum;
}
}
int main(void) {
int i;
int sample_size;
float *data_h, *data_d;
float num;
FILE *fp;
/* Get data fom file */
if((fp = fopen("data.txt", "r")) != NULL) {
fscanf(fp, "%d", &sample_size);
data_h = (float*)malloc(sample_size * sizeof(float));
for(i = 0; fscanf(fp, "%f", &num) != EOF; i++)
data_h[i] = num;
fclose(fp);
} else {
perror("data.txt");
return 0;
}
for(i = 0; i < sample_size; i++)
printf("%f\n", data_h[i]);
/* Allocate memory on device */
cudaMalloc((void**)&data_d, sample_size * sizeof(int));
/* Copy data from host to device */
cudaMemcpy(data_d, data_h, sample_size * sizeof(int), cudaMemcpyHostToDevice);
/* kernel */
mapping <<< sample_size, 1 >>> (data_d, sample_size, 3);
cudaMemcpy(data_h, data_d, sample_size * sizeof(int),
cudaMemcpyDeviceToHost);
printf("--------\n");
for(i = 0; i < sample_size; i++)
printf("%f\n", data_h[i]);
/* Free memory used */
cudaFree(data_d);
free(data_h);
return 0;
}
私のコードが間違っているのか、それともそれ以上のものなのかわかりません。私は最初のものを好みます。