[英]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.