结构中的指针在内核函数中发生了变化

时间:2013-05-24 00:32:20

标签: cuda

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

2 个答案:

答案 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;
}

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