0
說我有一個函數,它需要一個設備指針並對它執行一些操作。然而這個工作更適合cpu,所以我在cpu上分配了一塊內存,在cpu內存上執行一些操作,然後將它複製到gpu。事情是這樣的:執行主機端malloc和異步主機到設備memcpy的典型方法
void func(void *dev_ptr, cudaStream_t stream)
{
void *host_ptr = malloc(100);
// do something on host_ptr
cudaMemcpyAsync(dev_ptr, host_ptr, 100, cudaMemcpyHostToDevice, stream);
free(host_ptr);
}
的free
調用是這裏危險,因爲memcpy的是異步複製可能不會在該點free
被稱爲完成。我弄清楚,存在CUDA回調機制,所以我覺得下面的代碼可能更合適:
void CUDART_CB callback_free(cudaStream_t, cudaError_t, void *userData)
{
free(userData);
}
void func(void *dev_ptr, cudaStream_t stream)
{
void *host_ptr = malloc(100);
// do something on host_ptr
cudaMemcpyAsync(dev_ptr, host_ptr, 100, cudaMemcpyHostToDevice, stream);
cudaStreamAddCallback(stream, callback_free, static_cast<void *>(host_ptr), 0);
}
問:
- 是它的規範的方法來完成這個任務?
- 如果我想
host_ptr
分配在堆棧而不是堆上怎麼辦?我不想在這裏介紹不必要的cudaStreamSynchronize
。
在此先感謝。
爲什麼你甚至在C++中使用'malloc'和'free'? –
@AngryLettuce沒關係......只是爲了與'cudaMalloc'和'cudaFree'一致 –