簡體   English   中英

執行主機端malloc和異步主機到設備memcpy的規范方法

[英]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);
}

題:

  1. 這是完成此任務的規范方法嗎?
  2. 如果我希望將host_ptr分配在堆棧而不是堆上怎么辦? 我不想在這里引入不必要的cudaStreamSynchronize

提前致謝。

要回答您的問題:

  1. 這是完成此任務的規范方法嗎?
    據我所知,這是唯一無需顯式同步調用就可以執行此操作的唯一方法。

  2. 如果我希望將host_ptr分配在堆棧而不是堆上怎么辦? 我不想在這里引入不必要的cudaStreamSynchronize
    您不會引入不必要的cudaStreamSynchronize調用,而是會引入必要的調用。 在這種情況下,阻止堆棧變量超出范圍的唯一方法是阻塞,而正確的阻塞方法是調用cudaStreamSynchronize

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM