你好,我有一个与此相似的算法(在Python中):
for a in xrange(10):
for b in xrange(15):
for c in xrange(5):
for d in xrange(15):
#etc
代码经历了许多线性参数的组合。我是否应该执行没有输入数据的内核,只能执行可以计算数值参数的id,或者我应该为前3个参数发送3个整数数据维度,然后计算每个工作中的其余参数项目
我不知道有什么办法可以在没有输入数据的情况下运行命令,并且只是为所有工作项添加了一个递增ID,因此我可以计算所有组合的参数。这可能吗?是推荐吗?
感谢您的帮助。
注意:使用C库进行OpenCL。
答案 0 :(得分:1)
很难理解你有什么问题,如果你在谈论内核参数,你应该至少有一个内核参数,没有内核参数的内核是无用的,因为,OpenCL提供基于数据的并行性,如果你不你有没有任何并行性的数据,你可以在一个cpu线程上执行你的内核......
如果您有尺寸方面的问题,即您需要4个或更多尺寸,但OpenCL提供的尺寸为3,则应执行以下操作:
// Assuming that you have only a,b,c,d
// and 'amount of work' = 10 * 15 * 05 * 15
int index = get_global_id(0);
int d = index % 15; index /= 15;
int c = index % 05; index /= 05;
int b = index % 15; index /= 15;
int a = index % 10; index /= 10;
#etc (do something with a,b,c,d)
最后一点,尽量让你的程序尽可能平坦,OpenCL不喜欢很多循环和分支逻辑,尝试用手解开你的循环而不是:
// if it is possible to render some constant into the OpenCL code,
// than try to expand it as much as possible
for (int i = 0; i < 4; i++) // The constant is 4
{
float x = sin(3.14 * i + ...);
float y = cos(x + ....);
x[i] = a * i * x + y ....;
}
按以下方式编写:
float x;
float y;
x = sin(3.14 * 0 + ...);
y = cos(x + ....);
x[0] = a * 0 * x + y ....;
x = sin(3.14 * 1 + ...);
y = cos(x + ....);
x[1] = a * 1 * x + y ....;
x = sin(3.14 * 2 + ...);
y = cos(x + ....);
x[2] = a * 2 * x + y ....;
x = sin(3.14 * 3 + ...);
y = cos(x + ....);
x[3] = a * 3 * x + y ....;
越平越好!我说的是合理的扩展,如果你在循环中有1024个循环,那么所有这些循环都是不合理的。在这种情况下,您应该将其扩展2或4或8或16个周期,这将导致您拥有512或256或128或64个循环周期,这可以为您带来巨大的性能提升......