Cuda 内核函数中结构中的指针已更改

Cuda 内核函数中结构中的指针已更改,cuda,Cuda,我正在尝试从CUDA中分配的阵列访问数据。第一步是分配我定义的结构。在我将分配的结构传递给更改结构中的值的内核函数之后。最后,我将结构和数组传递给主机变量,以便读取它们。但实际上我在读取分配的向量时遇到了一个问题 #include <stdio.h> #include <stdlib.h> typedef struct x{ float *y; float v; }x_t; __global__ void initTeste(x_t *para

我正在尝试从CUDA中分配的阵列访问数据。第一步是分配我定义的结构。在我将分配的结构传递给更改结构中的值的内核函数之后。最后,我将结构和数组传递给主机变量,以便读取它们。但实际上我在读取分配的向量时遇到了一个问题

#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;
}
#包括
#包括
类型定义结构x{
浮动*y;
浮动v;
}x_t;
__全局无效初始测试(x_t*param){
参数->v=10;
参数->y[0]=10;
参数->y[1]=10;
}
内部主(空){
x_t*hvar;
x_t hvarBackup;
float*temp=(float*)malloc(10*sizeof(float));
错误结果;
Cudamaloc(和hvar,sizeof(x_t));
cudaMalloc(&hvarBackup.y,10*sizeof(浮动));
cudaMemcpy(hvar和hvarBackup,sizeof(x_t),cudamemcpyhostodevice);
初始测试(hvar);
cudaMemcpy(和hvarBackup、hvar、sizeof(x_t)、cudamemcpydevicetoost);
cudaMemcpy(温度,&hvar->y,10*sizeof(浮动),cudaMemcpyDeviceToHost);
printf(“%f”,(hvarBackup.v));//这里可以
printf(“%f”,(temp[0]);//问题出在这里
返回0;
}
应该是

cudaMemcpy(temp, hvar->y, 10*sizeof(float), cudaMemcpyDeviceToHost);

因为hvar->y已经是一个指针,您不想获取指向该指针的指针。

您不能这样做,因为您没有为设备分配
y
,因此从
y
内容复制到主机时,它只会给您分段错误。除此之外,您必须为设备分配
y
,数量为
10*sizeof(float)
,这确实是a**工作中的一个难题,尤其是当您的结构成为一个巨大的数组容器时(您应该始终知道,在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;
}
int main(无效){
x_t*h_hvar=(x_t*)malloc(sizeof(x_t));
x_t*d_hvar;
float*h_y=(float*)malloc(10*sizeof(float));
浮动*d_y;
库达马洛克(d_hvar,sizeof(x_t));
Cudamaloc(和d_y,10*sizeof(浮动));
//插入在CUDA中分配的浮点指针
//首先指向主机指针,然后复制整个内容
//到设备区域
h_hvar->y=d_y;
cudaMemcpy(d_hvar,h_hvar,sizeof(x_t),cudamemcpyhostodevice);
初始测试(d_hvar);
cudaMemcpy(h_hvar、d_hvar、sizeof(x_t)、cudaMemcpyDeviceToHost);
cudaMemcpy(h_y,d_y,10*sizeof(float),cudamemcpydevicetoost);
printf(“%f”,h_hvar->v);
printf(“%f”,h_y[0]);
返回0;
}

这将为您提供正确的值。

使用上述示例中的数组的最佳解决方案是什么?
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;
}