OpenCL变量声明在内核范围外失败

OpenCL变量声明在内核范围外失败,c,function,kernel,opencl,C,Function,Kernel,Opencl,我试图维护一个内核全局变量,它可以像静态变量一样工作。这样我就可以在变量中存储上一个值,以便进一步计算。 以下是我尝试过的和我得到的错误: __global int weightsum; __kernel void calcLWMALoop(int begin, int limit, __global double *price, __global double *firstValue, int weightsum) { int len = get_g

我试图维护一个内核全局变量,它可以像静态变量一样工作。这样我就可以在变量中存储上一个值,以便进一步计算。
以下是我尝试过的和我得到的错误:

__global int weightsum;
__kernel void calcLWMALoop(int begin, int limit, __global double *price, __global double *firstValue, int weightsum)
          {
            int len = get_global_id(3);
            for(int i=begin;i<limit;i++)
            {                 
               weightsum+=(i-begin+1);
               firstValue[len]+=(i-begin+1)*price[i];
            }
      firstValue[len]/=(double)weightsum;

          }
\u全局整数加权和;
__内核void calcLWMALoop(int begin,int limit,uu global double*price,uuu global double*firstValue,int weightsum)
{
int len=获取全局id(3);

对于(inti=begin;i,在OpenCLC内核语言中不能有全局变量。 您可以创建一个主机缓冲区(clCreateBuffer)并将其传递给内核(clSetKernelArg),然后它成为内核中指向全局的指针。
您还可以在私有内存中创建指向全局的指针,但这只对每个工作项可见。

在OpenCLC内核语言中不能有全局变量。 您可以创建一个主机缓冲区(clCreateBuffer)并将其传递给内核(clSetKernelArg),然后它成为内核中指向全局的指针。
您还可以在私有内存中创建指向全局的指针,但这只对每个工作项可见。

您可以在
\uu global
地址空间中拥有程序作用域或静态变量,但只能在OpenCL 2.0中。如果您的OpenCL实现(驱动程序)允许,您可以将
-cl std=CL2.0
传递到
clBuildProgram
以启用此功能支持OpenCL2.0

规范中的相关引用:

OpenCL 1.x:

所有程序作用域变量必须在_常量地址空间中声明

OpenCL2.0:

在程序范围内定义的变量和函数内的静态变量也可以在全局地址空间中声明。它们可以用任何有效的OpenCL C数据类型定义,表6.3中的数据类型除外。特别是,此类程序范围变量可以是任何用户定义的类型,或指向用户定义类型的指针。在shar在场的情况下在虚拟内存中,只要这些指针或指针成员是共享虚拟内存指针,并且引用的存储已正确映射,它们就应按预期工作。全局地址空间中的这些变量与程序具有相同的生存期,并且它们的值在调用程序中的任何内核之间保持不变se变量不在设备之间共享。它们具有不同的存储

可以初始化全局地址空间中的程序范围和静态变量,但只能使用常量表达式

const限定符还可以与_全局限定符一起使用,以指定只读缓冲区内存对象


您可以在
\uu global
地址空间中拥有程序作用域或静态变量,但只能在OpenCL 2.0中使用。如果您的OpenCL实现(驱动程序)支持OpenCL 2.0,您可以将
-cl std=CL2.0
传递到
clBuildProgram
以启用此功能

规范中的相关引用:

OpenCL 1.x:

所有程序作用域变量必须在_常量地址空间中声明

OpenCL2.0:

在程序范围内定义的变量和函数内的静态变量也可以在全局地址空间中声明。它们可以用任何有效的OpenCL C数据类型定义,表6.3中的数据类型除外。特别是,此类程序范围变量可以是任何用户定义的类型,或指向用户定义类型的指针。在shar在场的情况下在虚拟内存中,只要这些指针或指针成员是共享虚拟内存指针,并且引用的存储已正确映射,它们就应按预期工作。全局地址空间中的这些变量与程序具有相同的生存期,并且它们的值在调用程序中的任何内核之间保持不变se变量不在设备之间共享。它们具有不同的存储

可以初始化全局地址空间中的程序范围和静态变量,但只能使用常量表达式

const限定符还可以与_全局限定符一起使用,以指定只读缓冲区内存对象


这是否意味着我不能在内核之外有一个全局变量?我可以这样声明:但这一个对我没有帮助。正如他所说,“你不能在OpenCLC内核语言中有全局变量。”这是正确的。全局地址限定符用于指针。使用缓冲区保存所有工作项都需要访问的值。此外,
get\u global\u id(3)
似乎无效;您只能访问0到2。这是否意味着我不能在内核外拥有全局变量?我可以这样声明:但这一个对我没有帮助。正如他所说,“在OpenCL C内核语言中不能有全局变量。”这是正确的。全局地址限定符用于指针。使用缓冲区保存所有工作项都需要访问的值。此外,
get\u global\u id(3)
似乎无效;您只能访问0到2。我可以在哪里以及如何将
-cl std=CL2.0
传递到
clBuildProgram
?我在
MQL5
中使用Opencl。根据我在这里看到的(),无法使用MQL5传递其他编译选项,但我不是MQL5方面的专家,因此您可能会找到解决方法。我可以在何处以及如何将
-cl std=CL2.0
传递到
clBuildProgram
?根据我在这里看到的(),无法使用MQL5传递额外的编译选项,但我不是MQL5方面的专家,因此您可能会找到一个解决方法。
OpenCL program create failed: INVALID_HANDLE <kernel>:41:14: error: variable has address space that is not supported in program scope declaration
__global int weightsum;
             ^
<kernel>:41:14: error: global variables must have a constant address space qualifier
5105