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