作者hardman1110 (笨小孩)
看板C_and_CPP
标题[问题] openCL kernal中如何知道index属於谁?
时间Tue Aug 22 16:32:42 2017
开发平台(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 等等的
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.34.230.27
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1503390765.A.64C.html
※ 编辑: hardman1110 (114.34.230.27), 08/22/2017 16:50:46
1F:推 LPH66: index 是 kernel 的编号, 不是阵列的编号 08/22 17:04
2F:→ LPH66: kernel 做事的概念是「几号 kernel 去拿阵列的哪几格做事」 08/22 17:06
3F:→ LPH66: 只是一般来说会因为方便让 kernel 以自己编号去取元素 08/22 17:06
4F:→ LPH66: 当然其他状况也有可能是会成一个 kernel 抓很多格做事 08/22 17:07
5F:→ LPH66: 这时去取哪几格时就要自己去算哪个 kernel 该取哪几格 08/22 17:07
6F:→ LPH66: 另外你最後的问题, 去找 OpenCL 标准文件里面写得很清楚 08/22 17:09
7F:→ LPH66: 或者我印象中有看过一个是把各种函数整理成的 cheat sheet 08/22 17:09
8F:→ LPH66: (包含 host 端和 kernel 端的函数都有) 08/22 17:09
9F:→ hardman1110: 我传进去的阵列型态大小都不一样,我该如何知道切了 08/22 17:11
10F:→ hardman1110: 多少kernal(work item) 然後每个work item包含每个 08/22 17:12
11F:→ hardman1110: 阵列的哪几格? 08/22 17:13
12F:推 LPH66: 这是你在决定的事; 你要决定每个 work item 的工作量是多少 08/22 17:25
13F:→ LPH66: 每个人要怎麽拿到他所要的工作量做事 08/22 17:25
14F:→ hardman1110: 查到clEnqueueNDRangeKernel可控制要切多少workitem 08/22 17:26
15F:→ LPH66: 有的时候甚至可以写说「几号以後不用做那边的事」之类的 08/22 17:26
16F:→ hardman1110: 但每个workitem对应到阵列哪一段就不清楚原理了 08/22 17:26
17F:→ LPH66: 然後再 enqueue 你要的数量的 workitem 去做事 08/22 17:26
18F:→ LPH66: 例如如果我要一个 workitem 做一格, 那就是照编号取元素 08/22 17:27
19F:→ LPH66: 如果我要一个 workitem 做两格, 那可以编号乘二再取两格 08/22 17:27
20F:→ LPH66: 重点是你要搞懂你是怎麽分配工作下去的 08/22 17:28
21F:→ LPH66: 一个简单的比方是你请了一堆工读生分担工作 08/22 17:29
22F:→ LPH66: 那你总要告诉工读生「你的工作范围在哪里」 08/22 17:29
23F:→ LPH66: 而做出一个简单易懂的分配方式就是你在问的"对应" 08/22 17:29
24F:→ LPH66: 让每个工读生能只从自己分到的编号直接领到工作做 08/22 17:30
25F:→ hardman1110: 这样说起来我要index以哪个阵列为主就enqueue那个阵 08/22 17:45
26F:→ hardman1110: 列的size噜? 08/22 17:45