【发布时间】:2018-12-17 03:50:41
【问题描述】:
以下问题更多与设计有关,而不是实际编码。不知道这个问题有没有专门的术语,我就举个例子吧。
我有一些 openCL 代码根本没有优化,在内核中基本上有一个类似于以下的 switch 语句
switch(const) {
case const_a : do_something_a(...); break;
case const_b : do_something_b(....); break;
... //etc
}
我无法写出实际的语句,因为它很长。作为一个简单的例子,考虑下面的 switch 语句:
int a;
switch(input):
case 13 : {a = 3; break;}
case 1 : {a = 7; break;}
case 23 : {a = 1; break;}
default : {...}
问题是……用类似这样的表达式来改变这样的开关会更好
a = (input == 13)*3 + (input == 1)*7 + (input == 23)
?
如果不是,是否有可能让它更高效?
您可以假设input 仅在 switch 语句的情况下取值。
【问题讨论】:
-
这是否意味着你没有办法建议更有效地写那一点?
-
完成,问题已编辑。
-
这就像在黑暗中拍摄。这就是我要做的,如果可能的话,看看生成的代码。如果您看不到编译器在做什么,那么您可以进行基准测试,看看是否有任何好处。如果 OpenCL 驱动程序经过优化,它可能会发现这些是常量并生成多个二进制文件(称为函数专业化),您可以这样做,使用 MACROS 创建多个内核并为每个常量
-DMYCONST=13构建程序,并且条件应该通过以下方式进行优化任何体面的编译器。
标签: parallel-processing opencl gpu