我試着搜索類似的問題,但找不到一個,雖然有一對夫婦有一個類似的標題。CUDA在相同的參數上多次調用內核函數
我對主機像這樣的代碼:
handle_error(cudaMalloc((void**)&ret_dev, FLOAT_SIZE*no_kstrings*M));
for(int div=0;div<no_kstrings/threads;div++){
kernel<<<grid_dim,block_dim>>>(ret_dev, v_freq_vectors, &no_kstrings[threads]);
handle_error(cudaMemcpy(&exp_freq[threads], ret_dev, FLOAT_SIZE*threads*M,
cudaMemcpyDeviceToHost));
}
基本上我有運行在循環中的代碼爲最大無的倍數。每塊的線程數。內核函數只是做一些事情,並將數據放入ret_dev
。所以我想知道,在每次迭代之後我需要做cudaMemcpy()
還是我可以在循環之外做到這一點?事情是這樣的:
handle_error(cudaMalloc((void**)&ret_dev, FLOAT_SIZE*no_kstrings*M));
for(int div=0;div<no_kstrings/threads;div++){
kernel<<<grid_dim,block_dim>>>(ret_dev, v_freq_vectors, &no_kstrings[threads]);
}
handle_error(cudaMemcpy(exp_freq, ret_dev, FLOAT_SIZE*no_kstrings*M,
cudaMemcpyDeviceToHost));
我想我要問的是什麼,莫非是調用內核函數論腐敗在某種程度上這些參數相同的參數多次?
由於
你是否反轉了你發佈的兩個代碼示例? – talonmies
如果您正在將數據寫入'ret_dev'的相同位置,則下一次內核調用將覆蓋先前的數據。所以是的,你必須在每次迭代中複製數據。 – sgarizvi
好吧,因爲我不是在'ret_dev'的同一位置上寫的,所以我不需要在每次迭代中都複製它,對吧? – vegeta