簡體   English   中英

並發CUDA內核執行的優先級

[英]Priority of concurrent CUDA kernel execution

我有兩個可以同時執行的內核(A和B)。 我需要內核A盡快完成(進行結果的MPI交換)。 所以我可以在一個流中執行它們:A然后B.

但是,內核A的線程塊很少,所以如果我按順序運行A和B,則在A運行時GPU沒有被充分利用。

是否可以與具有更高優先級的A同時執行A和B?

例如,我希望內核B的線程塊只有在內核A 沒有未啟動的塊時才開始執行。

據我所知,如果我在一個流中啟動內核A,並且在主機代碼中的下一行,在另一個流中啟動內核B,我不保證B中的線程塊實際上不會先執行?

NVIDIA現在提供了一種優先處理CUDA內核的方法。 這是一個相當新的功能,因此您需要升級到CUDA 5.5才能使用。

對於您的情況,您將在高優先級CUDA流中啟動kernel A ,並在低優先級CUDA流中啟動kernel B 你可能想要的功能是cudaStreamCreateWithPriority(..., priority)

  • 要使用此功能,您需要具有3.5或更高計算能力的GPU。 要檢查GPU上是否支持優先級,請查看cudaDeviceProp::streamPrioritiesSupported
  • cudaDeviceGetStreamPriorityRange應該告訴你GPU上有多少優先級。 cudaDeviceGetStreamPriorityRange的語法有點cudaDeviceGetStreamPriorityRange ; 值得一看CUDA手冊,看看它是如何工作的。

有關CUDA Runtime API手冊中優先級設置的更詳細文檔:

cudaError_t cudaStreamCreateWithPriority(cudaStream_t *pStream, 
                                         unsigned int flags, int priority)
Create an asynchronous stream with the specified priority.

Parameters
pStream  = Pointer to new stream identifier 
flags    = Flags for stream creation. See cudaStreamCreateWithFlags for a list of 
           valid flags that can be passed 
priority = Priority of the stream. Lower numbers represent higher priorities. See  
           cudaDeviceGetStreamPriorityRange for more information about the 
           meaningful stream priorities that can be passed.

暫無
暫無

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

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