我在玩一个内核,它用一个函数映射一个带有浮点数的数组。我不知道为什么,但每次运行程序时,旧结果都会添加到新结果中(听起来 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;
}
我不知道我的代码是错误的,还是其他问题。我更喜欢第一个。