我在.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對象沒有一個固定的數。
這個話題已經覆蓋了很多次,這就是所謂的深拷貝,例如看看[這裏](http://stackoverflow.com/questions/16024087/copy-an-object-to-device/16024373# 16024373) –
@RobertCrovella感謝您的鏈接。我試過了,但是現在我的程序在帖子建議添加的第一個cudaMemcpy上崩潰了。我用添加的代碼修改了我的問題。你能告訴我我做錯了什麼嗎?謝謝。 –