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割り当てる必要があります。これは、特に構造体が配列の巨大なコンテナーになる場合に、a** ジョブの正直なところ苦痛です (構造体内の配列は常に知っておく必要があります)。 CUDA では常に回避する必要があります)。y10*sizeof(float)

現在のコードでできることは次のとおりです

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 に答える