应用CUDA内核后损坏的数据

应用CUDA内核后损坏的数据,c,cuda,C,Cuda,我在玩一个内核,它用一个函数映射一个带有浮点数的数组。我不知道为什么,但每次我运行程序时,旧结果都会添加到新结果中(听起来好像cudaFree没有设置释放内存,但函数的返回值为0) 例如,第一次内核执行后的原始数字0.758846为-0.123258,但在一些新执行后,结果为-9.996812 这是内核和主要功能: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <cud

我在玩一个内核,它用一个函数映射一个带有浮点数的数组。我不知道为什么,但每次我运行程序时,旧结果都会添加到新结果中(听起来好像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;
}
#包括
#包括
#包括
#包括
#定义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内存中,那么您所描述的结果似乎是不初始化内存的逻辑结果。有趣!我没有注意到。谢谢你的帮助