[英]Canonical ways to perform host-side malloc and asynchronous host-to-device memcpy
假設我有一個使用設備指針並對其執行操作的函數。 但是,這項工作更適合於CPU,因此我在CPU上分配了一塊內存,對CPU內存執行了一些操作,然后將其復制到gpu。 像這樣:
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
。 提前致謝。
要回答您的問題:
這是完成此任務的規范方法嗎?
據我所知,這是唯一無需顯式同步調用就可以執行此操作的唯一方法。
如果我希望將host_ptr
分配在堆棧而不是堆上怎么辦? 我不想在這里引入不必要的cudaStreamSynchronize
。
您不會引入不必要的cudaStreamSynchronize
調用,而是會引入必要的調用。 在這種情況下,阻止堆棧變量超出范圍的唯一方法是阻塞,而正確的阻塞方法是調用cudaStreamSynchronize
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.