OpenCL在没有输入数据或使用3维的情况下执行

时间:2011-07-16 00:06:58

标签: c algorithm parallel-processing opencl

你好,我有一个与此相似的算法(在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。

1 个答案:

答案 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个循环周期,这可以为您带来巨大的性能提升......