【发布时间】:2014-05-14 20:42:42
【问题描述】:
我已经分离出一些彼此不同但需要在不同工作项中并行运行的功能。因此,当内核被调用时,它需要决定必须执行哪个函数..
void call_calc0() {
// code
}
void call_calc1() {
// code
}
void call_calc2() {
// code
}
void call_calc3() {
// code
}
__kernel void perform (__global double* A, __global double* B) {
int idx = get_global_id(0);
if (idx == 0) {
call_calc0();
} else if (idx == 1) {
call_calc1();
} else if (idx == 2) {
call_calc2();
} else if (idx == 3) {
call_calc3();
}
}
如果有 256/512 个工作项,此代码示例将不是正确的方法。我该如何优化呢?
【问题讨论】:
-
我可以想到函数指针和预处理器的方式.. 但是,是否可以在 OpenCl 中使用函数指针?
-
OpenCL 中不允许使用函数指针。你是说每个工作项都必须执行完全不同的代码?
-
是的。但在同一个缓冲区.. 单独的单个缓冲区块。有可能.. 如果我用单个“if”条件替换 if-else,我做了一些测试@jprice.. 然后编译变得非常快......代码就像 if (idx == 1) {calc1}; if (idx == 2) {calc2}...
-
当然,您可以使用
switch语句实现相同的目的。然而,OpenCL NDRange 执行模型是为数据并行执行而设计的,而这正是 GPU 和加速器等设备所擅长的。听起来您的问题根本不是数据并行的(您正在对相同的数据执行完全不同的代码),这对于围绕 SIMD 执行设计的设备可能具有非常低的性能。在您执行的每个不同计算中真的没有共同的组件吗? -
如果逻辑真的像你说的那么简单,本地大小为1,为什么不直接调用4个单独的内核,完全去掉条件呢?我同意@jprice,这听起来确实不像是一个很好地映射到 OpenCL 的问题。也许更多的上下文会很有用。
标签: opencl