2016-06-20 64 views
0

我在.CU文件如何用結構來工作的內部結構CUDA中

typedef struct 
{ 
    int leg_id; 
    int contract_id; 
} CudaLeg; 

typedef struct 
{ 
    CudaLeg* legs; 
    int no_legs; 
} CudaPortfolio; 

extern "C" 
__global__ void kernel(CudaPortfolio* o_portfolios_cuda, const int no_portfolios) 
{ 
// fill o_portfolios_cuda with data 
} 

void cudaFunction(CudaPortfolio* o_portfolios, unsigned long long no_portfolios) 
{ 
    CudaPortfolio* o_portfolios_cuda; 
    cudaMalloc((void **)& o_portfolios_cuda, sizeof(CudaPortfolio) * no_portfolios); 

    kernel<<<32, 32>>>(o_portfolios_cuda, no_portfolios); 

    cudaMemcpy(o_portfolios, o_portfolios_cuda, sizeof(CudaPortfolio) * no_portfolios, cudaMemcpyDeviceToHost); 

    //printf below works 
    printf("CPU no legs strike output portfolio: %d\n", o_portfolios[0].no_legs); 
    //printf below crashes the program 
    printf("CPU Leg 1 multiplier output portfolio: %d\n", o_portfolios[0].legs[0].multiplier); 

    cudaFree(o_portfolios_cuda); 
} 

的GPU以下(簡化)代碼是GTX580,SM2.0。 GPU可以使用o_portfolios_cuda正常工作並填充數據並對其進行計算。 o_portfolios [0] .no_legs的第一個printf返回正確的功能。但是,當我嘗試訪問某些投資組合(o_portfolios [0] .legs [0] .multiplier)時,程序崩潰。任何想法如何解決這個問題?謝謝。

@Robert Crovella我已經試過類似的東西,但它沒有奏效。我又試了一次,並添加

CudaLeg* o_portfolios_legs_cuda; 
    cudaMalloc((void **)& o_portfolios_legs_cuda, sizeof(CudaLeg)); 
    cudaMemcpy(o_portfolios_legs_cuda, o_portfolios->legs, sizeof(CudaLeg), cudaMemcpyHostToDevice); 
    cudaMemcpy(&(o_portfolios_cuda->legs), &o_portfolios_legs_cuda, sizeof(CudaLeg *), cudaMemcpyHostToDevice); 

但現在我只是說3號線的程序崩潰(cudaMemcpy(o_portfolios_legs_cuda,...)

@MarkoR的CudaLeg對象沒有一個固定的數。

+5

這個話題已經覆蓋了很多次,這就是所謂的深拷貝,例如看看[這裏](http://stackoverflow.com/questions/16024087/copy-an-object-to-device/16024373# 16024373) –

+0

@RobertCrovella感謝您的鏈接。我試過了,但是現在我的程序在帖子建議添加的第一個cudaMemcpy上崩潰了。我用添加的代碼修改了我的問題。你能告訴我我做錯了什麼嗎?謝謝。 –

回答

1

您分配了CudaPortfolio結構,它有一個int和一個CudaLeg指針的空間。但是你不分配的什麼CudaLeg點。所以,當您嘗試訪問它,它崩潰的空間。

如何解決它:如果你是o只要有1個CudaLeg,你可以放下指針,然後在CudaPortfolio中放置CudaLeg腿。如果你將有固定數量的CudaLeg對象,你可以在CudaPortfolio裏面有例如「CudaLeg [5]腿」。如果您沒有固定數量的CudaLeg對象,並且希望保持它現在的狀態,那麼您需要針對多條腿進行額外的malloc並將其分配給每個組合。查看Robert Crovella在評論中發佈的鏈接,瞭解它是如何完成的。

0

當您將指向某個設備內存地址的指針legs複製到主機內存時,還需要將指針更改爲主機地址,該主機地址存儲原始設備數據的主機副本。