首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在没有输入数据或使用3维的情况下执行OpenCL

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

Stack Overflow用户
提问于 2011-07-16 08:06:58
回答 1查看 305关注 0票数 0

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

代码语言:javascript
复制
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库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-18 07:25:24

很难理解你有什么问题,如果你在谈论内核参数,你应该至少有一个内核参数,没有内核参数的内核是无用的,因为,OpenCL提供了基于数据的并行性,如果你没有任何数据,你就没有任何并行性,你可以在一个CPU线程上执行你的内核……

如果你在尺寸方面有问题,比如你需要4个或更多的尺寸,但OpenCL提供了3个尺寸,你应该这样做:

代码语言:javascript
复制
// 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不喜欢很多循环和分支逻辑,试着手动解开你的循环,而不是:

代码语言:javascript
复制
// 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 ....;
}

请按照以下方式编写:

代码语言:javascript
复制
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个循环周期,这可以给你带来巨大的性能提升……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6714387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档