应用CUDA内核后损坏的数据
我在玩一个内核,它用一个函数映射一个带有浮点数的数组。我不知道为什么,但每次我运行程序时,旧结果都会添加到新结果中(听起来好像cudaFree没有设置释放内存,但函数的返回值为0) 例如,第一次内核执行后的原始数字0.758846为-0.123258,但在一些新执行后,结果为-9.996812 这是内核和主要功能:应用CUDA内核后损坏的数据,c,cuda,C,Cuda,我在玩一个内核,它用一个函数映射一个带有浮点数的数组。我不知道为什么,但每次我运行程序时,旧结果都会添加到新结果中(听起来好像cudaFree没有设置释放内存,但函数的返回值为0) 例如,第一次内核执行后的原始数字0.758846为-0.123258,但在一些新执行后,结果为-9.996812 这是内核和主要功能: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <cud
#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;
}
#包括
#包括
#包括
#包括
#定义PI 3.1415926
/*f(x)=从i=1到m sin(2*PI*i*x)的和*/
__全局无效映射(浮点*数据,整数样本大小,整数m){
int i;
int tid=blockIdx.x;
浮点数;
if(tid<样本大小){
对于(i=1;i(数据,样本大小,3);
cudaMemcpy(数据、数据、样本大小*大小(整数),
cudaMemcpyDeviceToHost);
printf(“----------\n”);
对于(i=0;i<样本大小;i++)
printf(“%f\n”,数据[i]);
/*使用的可用内存*/
cudaFree(数据);
免费(数据);
返回0;
}
我不知道我的代码是错的,还是超出了我的理解范围。我会先输入第一个。在您开始将其添加到内核之前,您没有初始化
sum
。我将很快退休。。。顺便问一下,为什么会发生这种情况?这只是一个巧合,在执行之后存储的执行值是相同的结果。如果您认为在每次运行程序时,代码“>和”/代码>很可能被分配到GPU内存中,那么您所描述的结果似乎是不初始化内存的逻辑结果。有趣!我没有注意到。谢谢你的帮助