[英]double sum reduction opencl tutorial
我是OpenCl的新手。
我需要在一維雙精度數組上運算減少(求和運算符)。
我一直在網上徘徊,但我發現的例子很混亂。 任何人都可以發布易於閱讀(並且可能有效)的教程實現嗎?
附加信息: - 我可以訪問一個GPU設備; - 我使用C作為內核代碼
你提到你的問題涉及60k雙打,它不適合你設備的本地內存。 我整理了一個內核,它會將你的向量減少到10-30左右,你可以將它與你的宿主程序相加。 我在我的機器上遇到雙打問題,但如果啟用雙打並且在找到它時將'float'更改為'double',則此內核應該可以正常工作。 我將調試我遇到的雙重問題,並發布更新。
PARAMS:
用法:
潛在的優化:
使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.