我是ocl編程的新手。在opencl中防止計算兩次
我有200萬個多邊形(每個4行 - 對於這個例子 - 但它是變種),我需要找到1000個橢圓的交集。
我需要知道哪個橢圓與至少一個多邊形相交。
爲此,我創建了一個包含所有點和橢圓緩衝區的poylgons緩衝區。
我的輸出緩衝區是在所有項目中設置爲0的1000項目int。內核會根據橢圓索引在右邊的索引中設置1(當他找到交集)。我運行的內核有一個全局的-2 dim,{2million,1000}。
__kernel void polygonsIntersectsEllipses( __global const Point* pts,
__global const Ellipse* ellipses,
__global int* output)
{
int polygonIdx = get_global_id(0);
int ellipseIdx = get_global_id(1);
if (<<isIntersects>>) {
output[ellipseIdx] = 1;
}
}
問題是,一旦其中一個多邊形與橢圓相交,我不需要計算剩餘的多邊形。
我試過在路口測試前檢查output[ellipseIdx] != 0
,但是性能沒有太大變化。
我試圖做單暗全局 - 給1000(橢圓)和內核運行在數百萬個多邊形,並停止當我找到一個,但仍然沒有太多的變化。
我做錯了什麼?我可以加快這個操作嗎? 任何提示?
編輯
使用從@Moises尖端和做研究配發我改變我的代碼運行200萬次,單維。使用小組工作項目。將我所有的結構改爲原生類型,跳過模數運算。基本上,我可以將數據從全局複製到私有/本地內存,我做到了。
我的本地尺寸是我的設備CL_DEVICE_MAX_WORK_GROUP_SIZE
,在我的cpu & gpu它是1024,所以在一次運行中我覆蓋了我所有的1000個橢圓。
主機端
size_t global = 1999872; // 2 million divided by 1024 - for the test
size_t local = 1024;
我的代碼看起來現在這個樣子
__kernel void polygonsIntersectsEllipses( __global const float4* pts,
__global const float4* ellipses,
int ellipseCount,
__local float4* localEllipses,
__global int* output)
{
// Saving the ellipses to local memory
int localId = get_local_id(0);
if (localId < eCount)
localEllipses[localId] = ellipses[localId];
barrier(CLK_LOCAL_MEM_FENCE);
// Saving the current polygon into private memory
int polygonIdx = get_global_id(0);
float2 private_pts[5];
for (int currPtsIdx = 0; currPtsIdx < 4; currPtsIdx++)
{
private_pts[currPtsIdx] = pts[polygonIdx * 4 + currPtsIdx];
}
// saving the last point as first so i will not use modulus for cycling, in the intersection algorithm
private_pts[4] = private_pts[0];
// Run over all the ellipse in the local memory including checking if already there is an output
for (int ellipseIdx = 0; ellipseIdx < ellipseCount && output[ellipseIdx] == 0; ++ellipseIdx) {
if (<<isIntersects Using localEllipses array and private_pts>>) {
output[ellipseIdx] = 1;
}
}
}
結果
CPU就沒有那麼多的改進 - 更改後1.1快。
GPU - 快6.5倍(我很高興)
有沒有我可以更好地改善任何地方嗎? 提醒,一旦其中一個多邊形與橢圓相交,我們就不需要檢查其餘的多邊形。我怎麼做 ?我的要求輸出值的技巧並不真正起作用 - 性能是相同或不相似的
如果我創建2密耳線和內我跑了省略號,它是不一樣的?我還在讀同一每個線程有1000個橢圓?還有,如果它已經相交,我該如何防止檢查相同橢圓的交叉點? –
使用您的提示和我已完成的更多研究更新了我的文章 –