2013-05-29 16 views
0

聲明一個結構,內帶動態數組如何聲明在裝置一個結構即它的一個成員,是該數組,然後動態分配的內存。例如在下面的代碼中,編譯器說:error : calling a __host__ function("malloc") from a __global__ function("kernel_ScoreMatrix") is not allowed。有沒有另一種方法來執行此操作?如何在設備

dev_size_idx_threads的類型是int*和它的值,發送給內核並用於分配內存。

struct struct_matrix 
{ 
    int *idx_threads_x; 
    int *idx_threads_y; 
    int thread_diag_length; 
    int idx_length; 
}; 

struct struct_matrix matrix[BLOCK_SIZE_Y]; 

matrix->idx_threads_x= (int *) malloc ((*(dev_size_idx_threads) * sizeof(int))); 

回答

4

從設備代碼,動態存儲器分配(mallocnew)負載only with devices of cc2.0 and greater。如果您有cc2.0設備或更高版本,並且您將適當的標誌傳遞給nvcc(例如-arch=sm_20),則不應該看到此錯誤。請注意,如果您傳遞多個編譯目標(sm_10,sm_20等),如果即使其中一個目標不符合cc2.0 +要求,您也會看到此錯誤。

如果您有cc1.x設備,則需要從主機執行這些類型的分配(例如,使用cudaMalloc)並將適當的指針傳遞到內核。

如果你選擇這條路線(從主機分配),你也可能有興趣在我的回答類似這樣的問題one

編輯:回答以下問題:

  1. 在Visual Studio(2008年快遞,應該是其他版本類似),您可以設置編譯目標如下:打開項目,選擇項目..的.properties,選擇配置屬性... CUDA運行時API ... GPU現在,在右側窗格中,你會看到這樣GPU Architecture (1)(和(2)等)的條目這是下拉菜單,你可以點擊並選擇目標(s)你想編譯。如果您的GPU是sm_21,我會選擇(1),並將其他設置留空,或者選擇兼容版本,如sm_20。
  2. 要查看工作示例,請按照上面給出的鏈接。從我的回答here連接一對夫婦工作的例子以及如何完成的描述。
+0

謝謝。我的設備CC是2.1,如何在Nsight visual studio中設置這個參數?從主機分配,你能舉一個簡單的例子嗎? – mahdimb

+0

我在[link]中找到了更改'sm'參數的答案(http://stackoverflow.com/questions/14411435/how-to-set-cuda-compiler-flags-in-visual-studio-2010) – mahdimb