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

OpenCL在没有输入数据或使用3维的情况下执行,c,algorithm,parallel-processing,opencl,C,Algorithm,Parallel Processing,Opencl,您好,我有一个类似于此的算法(在Python中): 代码经过许多线性参数的组合。我可以也应该执行一个内核,没有输入数据,只有一个可以计算数值参数的id,或者我应该为前3个参数发送3维整数数据,然后计算每个工作项中的其余参数 我不知道有什么方法可以在没有输入数据的情况下运行命令,而只是为所有工作项设置一个递增id,以便计算所有组合的参数。这可能吗?推荐吗 谢谢你的帮助 注意:在OpenCL中使用C库。很难理解您有什么问题,如果您谈论的是内核参数,那么您应该至少有一个内核参数,没有内核参数的内核是无

您好,我有一个类似于此的算法(在Python中):

代码经过许多线性参数的组合。我可以也应该执行一个内核,没有输入数据,只有一个可以计算数值参数的id,或者我应该为前3个参数发送3维整数数据,然后计算每个工作项中的其余参数

我不知道有什么方法可以在没有输入数据的情况下运行命令,而只是为所有工作项设置一个递增id,以便计算所有组合的参数。这可能吗?推荐吗

谢谢你的帮助


注意:在OpenCL中使用C库。

很难理解您有什么问题,如果您谈论的是内核参数,那么您应该至少有一个内核参数,没有内核参数的内核是无用的,因为,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 ....;
}

越奉承越好!我说的是合理的扩展,如果循环中有1024个循环,那么扩展所有循环是不合理的。在这种情况下,您应该按2或4或8或16个周期的顺序进行扩展,这将导致您有512或256或128或64个循环周期,这将大大提高性能…

谢谢您的回答。为什么编译器不优化循环本身?如果不这样做似乎有点垃圾。我必须传递一个数据参数,我不能用ID来做吗?嗯,我必须把身份证作为数据传进来!一个递增整数数组,输入数据就是线性整数参数。不需要内存缓冲区。这是一种浪费,但我想我别无选择。我知道你根本不需要输入数据。它优化了,但这样会更方便。。。我再也不明白你的意思了……:(
// 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 ....;