gpt4 book ai didi

应用 CUDA 内核后数据损坏

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:56 25 4
gpt4 key购买 nike

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

我不知道我的代码是否有误,或者超出了范围。我更喜欢第一个。

最佳答案

在内核中开始向它添加内容之前,您没有初始化 sum

关于应用 CUDA 内核后数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com