OpenCL Programm每次使用私有变量时都会冻结

时间:2018-04-19 21:28:59

标签: opencl

我有一个内核方法,简化看起来像这样。

getInstance()

所以,除了简单的计算和非常大的循环之外,问题是程序在我运行此代码时一直冻结。 每次发生这种情况时我都必须强制重置计算机。 但如果我做了一些改变,比如这个

__kernel void calculate (__global float *a, __global float *b, __global int *res) {
    int workItem = get_global_id(0); // Syntax may not right, but you get the idea
    int found = 0;
    for (int i = 0; i<100000000; i++) {
        float c = a[i]*3;
        float d = b[i]*2;

        if (c<d) {
            found++;
        }
    }
    res[workItem]= found;
}

if (true) {
    found++;
}

然后程序就像一个魅力,非常快!所以我想知道变量c和d是否有任何问题?我尝试使用像

这样的东西
if (1<2) {
    found++
}

它也没有用。

我在创建程序和内核时读取了每一步的返回码,所以不是问题。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

这里有几个问题。

  1. 您正在运行一个巨大的循环,可能只有一个工作项,这正是您希望在OpenCL中避免的,因为并行的整个概念都会丢失。如果你没有正确使用它,OpenCL不会神奇地使你的代码快速。
  2. 即使您使用多个工作项,也不会使用从get_global_id()检索的值,但输出除外。但是,由于他们都使用相同的输入,您将为每个工作项获得相同的输出!
  3. 工作项及其关联的全局ID旨在允许您将处理划分为离散单元,而不是一个大的单片循环。我建议你看一些像this one这样的教程来更好地理解这个概念。在你理解他的代码之前,不要开始编写自己的代码。

    至于为什么你的程序会冻结你的电脑,我只能在没有看到主机代码的情况下进行推测。也许你得到了buffer overrun