2012-08-30 54 views
0

我想從主機到CUDA中的設備複製結構數組。例如:CUDA中從主機到設備的結構數組複製

#define N 1000; 
#define M 100000; 

typedef struct { 
    int i; 
    float L[N];  
}t ; 

__global__ void kernel() { 
    //do something 
} 

main() { 
    t *B, *B_d; // Pointer to host & device arrays of structure 
    int size = M * sizeof(t); 

    B=(t*)calloc(M,sizeof(t)); 
    cudaMalloc((void **) &B_d, size); // Allocate array of structure on device 
    // readind B from file ... 
    cudaMemcpy(B_d, B, size, cudaMemcpyHostToDevice); 
    kernel<<<1, 1 >>>(); 

} 

這是正確與否?我怎樣才能使用內核功能?

回答

1

現在您可以聲明您的內核接受類型爲(t *)的參數並將您的B傳遞給內核調用。

一些評論: 1.在內核調用中僅使用1個線程是非常無效的。爲了獲得最佳結果,您需要在塊中具有32個線程的倍數。 2.具有結構數組不會讓您的代碼有效地使用內存帶寬。爲獲得最佳效果,您需要進行合併讀取。

+0

1 - 我可以將B_d傳遞給類型(t *)的內核而不是B嗎? 2 - 我怎樣才能使聯合閱讀? – user1285050

+0

您應該將指針傳遞給GPU內存(即B-d)。要執行合併內存訪問以獲得最佳GPU內存性能,您應該從結構陣列切換到由數組組成的結構(例如,其字段爲原始陣列)。請注意,此類結構構件應該正確對齊。 – Eugene

相關問題