簡體   English   中英

opencl中的並行和減少實現

[英]parallel sum reduction implementation in opencl

我正在瀏覽鏈接中提供的NVIDIA示例代碼

在示例內核代碼(文件oclReduction_kernel.c )中,reduce4使用以下技術:

1)展開和刪除線程ID <32的同步屏障。

2)除此之外,代碼還使用blockSize檢查對本地內存中的數據求和。 我認為在OpenCL中,我們有get_local_size(0/1)來了解工作組的大小。 塊大小使我感到困惑。

我無法理解上述兩點。 為什么這些事情以及如何幫助優化? 對reduce5和reduce6的任何解釋也將有所幫助。

您已經在https://docs.nvidia.com/cuda/samples/6_Advanced/reduction/doc/reduction.pdf的幻燈片21和22中進行了解釋,其中@ Marco13在注釋中進行了鏈接。

  • 隨着減少的進行,#個“活動”線程減少
    • 當s <= 32時,我們僅剩一個翹曲
  • 指令在扭曲內是SIMD同步的。
  • 這意味着當s <= 32時:
    • 我們不需要__syncthreads()
    • 我們不需要“ if(tid <s)”,因為它不保存任何工作

在不展開的情況下,所有扭曲都將執行for循環和if語句的每個迭代

並通過https://www.pgroup.com/lit/articles/insider/v2n1a5.htm

該代碼實際上以32個線程為一組執行,這被NVIDIA稱為warp。

每個內核都可以執行一個順序線程,但是內核以NVIDIA所謂的SIMT(單指令,多線程)方式執行。 與傳統SIMD處理器非常相似,同一組中的所有內核都同時執行同一條指令。

關於2) blockSize看起來應該是工作組的大小。

暫無
暫無

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

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