簡體   English   中英

雙減少opencl教程

[英]double sum reduction opencl tutorial

我是OpenCl的新手。

我需要在一維雙精度數組上運算減少(求和運算符)。

我一直在網上徘徊,但我發現的例子很混亂。 任何人都可以發布易於閱讀(並且可能有效)的教程實現嗎?

附加信息: - 我可以訪問一個GPU設備; - 我使用C作為內核代碼

你提到你的問題涉及60k雙打,它不適合你設備的本地內存。 我整理了一個內核,它會將你的向量減少到10-30左右,你可以將它與你的宿主程序相加。 我在我的機器上遇到雙打問題,但如果啟用雙打並且在找到它時將'float'更改為'double',則此內核應該可以正常工作。 我將調試我遇到的雙重問題,並發布更新。

PARAMS:

  • global float * inVector - 求和的浮點數的來源
  • global float * outVector - 一個浮點列表,每個工作組一個浮點數
  • const int inVectorSize - inVector持有的浮點數總數
  • local float * resultScratch - 要使用的每個工作組的本地內存。 您需要為組中的每個工作項分配一個浮點數。 expected size = sizeof(cl_float)* get_local_size(0)。 例如,如果每組使用64個工作項,則這將是64個浮點數= 256個字節。 切換到雙精度將使其成為512字節。 openCL規范定義的最小LDS大小為16kb。 有關傳入本地(NULL)參數的詳細信息, 請參閱此問題

用法:

  1. 為輸入和輸出緩沖區分配內存。
  2. 為設備上的每個計算單元創建一個工作組。
  3. 確定最佳工作組大小,並使用它來計算'resultScratch'的大小。
  4. 調用內核,將outVector讀回主機
  5. 循環遍歷outVector的副本並添加以獲得最終總和。

潛在的優化:

  1. 像往常一樣,您希望使用大量數據調用內核。 太少的數據不值得轉移和設置時間。
  2. 使inVectorSize(和向量)成為(工作組大小)*(工作組數)的最高倍數。 僅使用此數量的數據調用內核。 內核均勻地分割數據。 在等待回調時計算主機上任何剩余數據的總和(或者,為cpu設備構建相同的內核並僅傳遞剩余數據)。 在上面的步驟#5中添加outVector時,從這個總和開始。 此優化應使工作組在整個計算過程中保持飽和。

     __kernel void floatSum(__global float* inVector, __global float* outVector, const int inVectorSize, __local float* resultScratch){ int gid = get_global_id(0); int wid = get_local_id(0); int wsize = get_local_size(0); int grid = get_group_id(0); int grcount = get_num_groups(0); int i; int workAmount = inVectorSize/grcount; int startOffest = workAmount * grid + wid; int maxOffest = workAmount * (grid + 1); if(maxOffset > inVectorSize){ maxOffset = inVectorSize; } resultScratch[wid] = 0.0; for(i=startOffest;i<maxOffest;i+=wsize){ resultScratch[wid] += inVector[i]; } barrier(CLK_LOCAL_MEM_FENCE); if(gid == 0){ for(i=1;i<wsize;i++){ resultScratch[0] += resultScratch[i]; } outVector[grid] = resultScratch[0]; } 

    }

另外,啟用雙打:

#ifdef cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
#else
#ifdef cl_amd_fp64
#pragma OPENCL EXTENSION cl_amd_fp64 : enable
#endif
#endif

更新:AMD APP KernelAnalyzer得到了更新(v12),它顯示該內核的雙精度版本實際上是ALU綁定在5870和6970卡上。

暫無
暫無

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

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