1

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

我不知道我的代码是错误的,还是其他问题。我更喜欢第一个。

4

1 回答 1

2

sum在开始将其添加到内核中之前,您没有进行初始化。

于 2013-11-03T02:14:45.097 回答