0

我正在尝试从 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;
}
4

2 回答 2

1

你不能那样做,因为你没有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;
}

那应该给你正确的价值..

于 2013-05-24T01:27:32.070 回答
1
cudaMemcpy(temp, &hvar->y, 10*sizeof(float), cudaMemcpyDeviceToHost);

应该

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

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

于 2013-05-24T01:02:34.303 回答