【问题标题】:OpenCL executing without input data or using 3 dimensionsOpenCL 在没有输入数据或使用 3 维的情况下执行
【发布时间】:2011-07-16 00:06:57
【问题描述】:

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

【问题讨论】:

    标签: c algorithm parallel-processing opencl


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

    【讨论】:

    • 感谢您的回答。为什么编译器不自己优化循环?如果没有,似乎有点垃圾。
    • 我必须传递一个数据参数,我不能用 ids 来做吗?嗯。我必须将 ID 作为数据传递!所以一个递增整数数组。
    • 输入数据只是线性整数参数。不需要内存缓冲区。这是一种浪费,但我想我别无选择。
    • 我知道您根本不需要输入数据。
    • 它优化了,但是这样会更方便......我不明白你进一步...... :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多