你好,我有一个类似于这个(在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,这样我就可以计算所有组合的参数。这个是可能的吗?这是推荐的吗?
谢谢你的帮助。
注意:在OpenCL中使用C库。
发布于 2011-07-18 07:25:24
很难理解你有什么问题,如果你在谈论内核参数,你应该至少有一个内核参数,没有内核参数的内核是无用的,因为,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个循环周期,这可以给你带来巨大的性能提升……
https://stackoverflow.com/questions/6714387
复制相似问题