我正在尝试从CUDA中分配的数组中访问数据。第一步是分配我定义的结构。将分配的结构传递给内核函数后,该函数更改结构中的值。最后,我将struct和数组传递给宿主变量,因此请阅读它们。但实际上我在阅读分配的矢量时遇到了问题。
#include <stdio.h>
#include <stdlib.h>
typedef struct x{
float *y;
float v;
}x_t;
__global__ void initTeste(x_t *param){
param->v = 10;
param->y[0] = 10;
param->y[1] = 10;
}
int main(void) {
x_t *hvar;
x_t hvarBackup;
float *temp = (float*)malloc(10*sizeof(float));
cudaError_t result;
cudaMalloc(&hvar , sizeof(x_t) );
cudaMalloc(&hvarBackup.y, 10*sizeof(float) );
cudaMemcpy(hvar, &hvarBackup, sizeof(x_t), cudaMemcpyHostToDevice);
initTeste<<<1,1>>>(hvar);
cudaMemcpy(&hvarBackup, hvar, sizeof(x_t), cudaMemcpyDeviceToHost);
cudaMemcpy(temp, &hvar->y, 10*sizeof(float), cudaMemcpyDeviceToHost);
printf("%f",(hvarBackup.v)); //here ok
printf("%f",(temp[0])); //here's the problem
return 0;
}
答案 0 :(得分:1)
cudaMemcpy(temp, &hvar->y, 10*sizeof(float), cudaMemcpyDeviceToHost);
应该是
cudaMemcpy(temp, hvar->y, 10*sizeof(float), cudaMemcpyDeviceToHost);
因为hvar-&gt; y已经是一个指针,你不想得到指向该指针的指针。
答案 1 :(得分:1)
你不能这样做,因为你没有为设备分配y
,因此从y
内容复制到主机时,它只会给你分段错误。除此之外,你必须为设备分配y
,其数量为10*sizeof(float)
,这对于**工作来说真的很痛苦,特别是当你的结构成为一个巨大的数组容器时(并且你应该总是知道,在CUDA中总是必须避免结构内部的数组。
以下是您可以使用当前代码
执行的操作int main(void) {
x_t *h_hvar = (x_t*)malloc(sizeof(x_t));
x_t *d_hvar;
float *h_y = (float*)malloc(10*sizeof(float));
float *d_y;
cudaMalloc(&d_hvar, sizeof(x_t) );
cudaMalloc(&d_y, 10*sizeof(float) );
// Insert the float pointer you allocated in CUDA
// to the host pointer first, and then copy the whole thing
// to the device area
h_hvar->y = d_y;
cudaMemcpy(d_hvar, h_hvar, sizeof(x_t), cudaMemcpyHostToDevice);
initTeste<<<1,1>>>(d_hvar);
cudaMemcpy(h_hvar, d_hvar, sizeof(x_t), cudaMemcpyDeviceToHost);
cudaMemcpy(h_y, d_y, 10*sizeof(float), cudaMemcpyDeviceToHost);
printf("%f",h_hvar->v);
printf("%f",h_y[0]);
return 0;
}
这应该给你正确的价值..