[問題] openCL kernal中如何知道index屬於誰?

作者: hardman1110 (笨小孩)   2017-08-22 16:32:42
開發平台(Platform): (Ex: Win10, Linux, ...)
Win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
vc2017
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
OpenCL
問題(Question):
我在kernal中傳入3個大小不同的一維陣列
我如何知道get_global_id(0) 回傳的index是屬於誰的?
餵入的資料(Input):
三個大小不同的一維陣列,a_Cost為輸出
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版)
__kernel void CostDataMat_kernel(__global const int a_RangeUpScale, __global
const int a_ImgWidth, __global const int a_ImgHeight, __global const char
*a_Left, __global const char *a_Right, __global int *a_Cost) {
// Get the index of the current element to be processed
int index = get_global_id(0);
int ImgSize = a_ImgWidth*a_ImgHeight;
int layer = index/ImgSize;
int layer_mod = index%ImgSize;
int i = layer_mod/a_ImgWidth;
int j = layer_mod%a_ImgWidth;
int Y_Abs = 0;
int Cb_Abs = 0;
int Cr_Abs = 0;
// Do the operation
Y_Abs = abs(a_Left[layer_mod*3] - a_Right[layer_mod*3]);
Cr_Abs = abs(a_Left[layer_mod*3+1] - a_Right[layer_mod*3+1]);
Cb_Abs = abs(a_Left[layer_mod*3+2] - a_Right[layer_mod*3+2]);
if(j >= a_RangeUpScale)
{
a_Cost[index] = Y_Abs + ((Cr_Abs + Cb_Abs)>>1);
}
else
{
if(layer < j+1)
{
a_Cost[index] = Y_Abs + ((Cr_Abs + Cb_Abs)>>1);
}
else
{
a_Cost[index] = -1;
}
}
}
補充說明(Supplement):
另外想請教各位大大,如何知道kernal有哪些函數可以用 ex: abs 等等的
作者: LPH66 (-6.2598534e+18f)   2017-08-22 17:04:00
index 是 kernel 的編號, 不是陣列的編號kernel 做事的概念是「幾號 kernel 去拿陣列的哪幾格做事」只是一般來說會因為方便讓 kernel 以自己編號去取元素當然其他狀況也有可能是會成一個 kernel 抓很多格做事這時去取哪幾格時就要自己去算哪個 kernel 該取哪幾格另外你最後的問題, 去找 OpenCL 標準文件裡面寫得很清楚或者我印象中有看過一個是把各種函數整理成的 cheat sheet(包含 host 端和 kernel 端的函數都有)
作者: hardman1110 (笨小孩)   2017-08-22 17:11:00
我傳進去的陣列型態大小都不一樣,我該如何知道切了多少kernal(work item) 然後每個work item包含每個陣列的哪幾格?
作者: LPH66 (-6.2598534e+18f)   2017-08-22 17:25:00
這是你在決定的事; 你要決定每個 work item 的工作量是多少每個人要怎麼拿到他所要的工作量做事
作者: hardman1110 (笨小孩)   2017-08-22 17:26:00
查到clEnqueueNDRangeKernel可控制要切多少workitem
作者: LPH66 (-6.2598534e+18f)   2017-08-22 17:26:00
有的時候甚至可以寫說「幾號以後不用做那邊的事」之類的
作者: hardman1110 (笨小孩)   2017-08-22 17:45:00
這樣說起來我要index以哪個陣列為主就enqueue那個陣列的size嚕?

Links booklink

Contact Us: admin [ a t ] ucptt.com