OpenCL程序冻结每次使用的私有变量

OpenCL程序冻结每次使用的私有变量,opencl,Opencl,我得到了一个内核方法,简化后看起来像这样 __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++) {

我得到了一个内核方法,简化后看起来像这样

__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;
}

它也不起作用

我在创建程序和内核时读取每个步骤的返回代码,所以这不是问题所在


我在这里做错了什么?

这里有几个问题

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


    至于为什么你的程序会冻结你的电脑,我只能猜测,没有看到你的主机代码。也许你得到了?

    嗨,关于这些问题,我理解你的意思,记住这只是一个简单的代码片段,我的实际代码不是这样的。我必须做这个巨大的循环大概200次。所以问题是缓冲区溢出,就像你说的,我正试图找出哪一个。一个问题是调用另一个内核函数的代价,设置所有参数。。高?我正在考虑将其分解为多个内核函数。
    if (true) {
        found++;
    }
    
    if (1<2) {
        found++
    }
    
    __private float c= ..;
    __private float d= ..;