2013-03-28 66 views
0

我認爲一個數組可以分配在gpu前。 __device__ int device_array[100];而不使用cudaMalloc作爲長度是已知的。但是,當我運行下面的代碼顯示一些不相關的數字。我研究了一本關於cuda的流行書,其中的所有示例都使用了cudaMalloc。一個固定大小的數組可以像這樣使用,或者它必須分配給cudaMalloc?cuda固定大小的全局數組

__device__ int device_array[100]; 

__global__ void kernel() { 

    device_array[blockIdx.x] = blockIdx.x; 
} 

void call_kernel(int *host_array) { 

    kernel<<<100,1>>>(); 

    cudaMemcpy(host_array, device_array, 100 * sizeof(int), cudaMemcpyDeviceToHost); 
} 

int main() { 

    int host_array[100]; 

    call_kernel(host_array); 

    for (int i = 0; i < 100; i++) 
     cout << host_array[i] << endl; 
} 
+0

你的代碼沒有錯誤檢查。可能是'cudaMemcpy'調用失敗,但您不知道它,因爲您沒有檢查返回狀態。一旦確認運行時發生了錯誤,問題的根源就會變得明顯。 – talonmies

+0

更多[線索](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-variable-qualifier)。如何做錯誤檢查很好地討論[這裏](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime- API)。 –

回答

1

正如羅伯特在他的評論中提到,您在訪問主機上的__device__符號時使用cudaMemcpyFromSymbol。因此,您現在的調用應該給出「無效參數」的錯誤。如果你想看到這一點,請嘗試更改cudaMemcpy行:

cudaError_t cuda_status = cudaMemcpy(...); 
std::cout << cudaGetErrorString(cuda_status) << std::endl; 

不管怎麼說,如果你想找到正確答案,你應該改變你的cudaMemcpy線爲:

cudaMemcpyFromSymbol(host_array, device_array, 100 * sizeof(int), 0, cudaMemcpyDeviceToHost); 

簽名爲cudaMemcpyFromSymbol是:

cudaError_t cudaMemcpyFromSymbol (void* dst, const void* symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost) 

偏移的默認值爲0和內存拷貝方向默認爲cudaMemcpyDeviceToHost,所以這些都是TECHN在你的情況下是可選的。所有這一切的主要內容是始終檢查您的cuda電話的返回值,因爲它們通常會引導您朝着正確的方向前進。

+0

如果你想以同樣的方式從主機複製到設備,那麼你可能會更好地使用函數「cudaMemcpyToSymbol」。我建議通過http://docs.nvidia.com/cuda/cuda-runtime-api/index.html#group__CUDART__MEMORY查看可用的CUDA運行時API函數 – alrikai