簡體   English   中英

如何在 kernel 啟動后讓 CUDA 返回控制?

[英]How can I make CUDA return control after kernel launch?

這可能是一個愚蠢的問題,但有沒有辦法從 kernel 異步返回? 例如,我有這個 kernel 執行第一次 stream 壓縮,輸出給用戶,但在它必須執行第二次 stream 壓縮之前更新其內部結構。

在 GPU 在后台繼續其第二次 stream 壓縮完成后,有沒有辦法將控制權返回給用戶? 當然,第二個 stream 壓縮僅適用於共享 memory 和全局 memory,但用戶不應檢索任何內容。

我不能使用推力。

GPU kernel 本身並不從“用戶”那里獲得控制權,即從系統上的 CPU 線程與 GPU 進行控制。

但是,對於 CUDA 的運行時,調用 GPU kernel 的默認方式讓您的線程等待內核執行結束:

my_kernel<<<my_grid_dims,my_block_dims,dynamic_shared_memory_size>>>(args,go,here);

但您也可以使用 這些是硬件支持的執行隊列,您可以在其中異步排隊工作(內存復制、kernel 執行等),就像您問的那樣。

在這種情況下,您的啟動可能如下所示:

cudaStream_t my_stream;
cudaError_t result = cudaStreamCreateWithFlags(&my_stream, cudaStreamNonBlocking);  
if (result != cudaSuccess) { /* error handling */ }

my_kernel<<<my_grid_dims,my_block_dims,dynamic_shared_memory_size,my_stream>>>(args,go,here);

有很多關於使用流的資源; 試試這個博客文章作為初學者。 CUDA 編程指南有很大一部分是關於異步執行的。

流和各種庫

Thrust提供異步功能已經有一段時間了,使用了thrust::future和其他結構。 這里

My own Modern-C++ CUDA API wrappers make it somewhat easier to work with streams, relieving you of the need to check for errors all the time and to remember to destroy streams and release memory before it goes out of scope. 使使用流更容易一些。 這個例子 語法看起來像這樣:

auto stream = device.create_stream(cuda::stream::async);
stream.enqueue.copy(d_a.get(), a.get(), nbytes);
stream.enqueue.kernel_launch(my_kernel, launch_config, d_a.get(), more, args);

(並且錯誤引發異常)

暫無
暫無

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

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