【问题标题】:Cannot declare a static variable in the kernel program OpenCL无法在内核程序 OpenCL 中声明静态变量
【发布时间】:2018-04-23 07:56:29
【问题描述】:

这是内核的代码:

"__kernel void CalculateLWMA(                                           \r\n"
                            "int rates_total,                                 \r\n"
                            "int prev_calculated,                             \r\n"
                            "int begin,                                       \r\n"
                            "int InpMAPeriod,                                 \r\n"
                            "__global double *price,                          \r\n"
                            "__global double *ExtLineBuffer                   \r\n"
                            ")                                                 \r\n"
        "{                                                              \r\n"
            "int        i,limit;                                           \r\n"
            "static int weightsum;                                                \r\n"
            "double     sum;                                               \r\n"
            "if(prev_calculated==0)                                        \r\n"
            "{                                                             \r\n"                                   
            "weightsum=0;                                                  \r\n"
            "limit=InpMAPeriod+begin;                                      \r\n"
            "for(i=0;i<limit;i++) ExtLineBuffer[i]=0.0;                    \r\n"
            "double firstValue=0;                                          \r\n"
            "for(i=begin;i<limit;i++)                                      \r\n"
            "{                                                             \r\n"
                "int k=i-begin+1;                                          \r\n"
                "weightsum+=k;                                             \r\n"
                "firstValue+=k*price[i];                                   \r\n"
            "}                                                             \r\n"
            "firstValue/=(double)weightsum;                                \r\n"
            "ExtLineBuffer[limit-1]=firstValue;                            \r\n"
            "}                                                             \r\n"
            "else limit=prev_calculated-1;                                 \r\n"
            "for(i=limit;i<rates_total;i++)                                \r\n"
            "{                                                             \r\n"
            "sum=0;                                                        \r\n"
            "for(int j=0;j<InpMAPeriod;j++) sum+=(InpMAPeriod-j)*price[i-j];\r\n"
            "ExtLineBuffer[i]=sum/weightsum;                               \r\n"
            "}                                                             \r\n"
        "}                

正如人们所看到的那样:"static int weightsum; \r\n" 我给出了以下错误:

error: variables in function scope cannot be declared static  

请告诉我什么可以替代 OpenCL 内核程序函数中的 static?

【问题讨论】:

  • 你试过在内核函数之前声明它是全局的吗?
  • 好吧,我没有……让我试试看。
  • @pmdj 你能告诉我如何声明全球......我试过global int weightsum;。甚至__global int weightsum,。没用:(

标签: function static opencl mql5


【解决方案1】:

我刚刚更好地查看了您的代码,并注意到您对静态变量的使用无论如何都是不正确的,因为weightsum+=k 不是原子的或同步的,即使您有障碍,也会有并发读取& 从不同的工作项目中写入。你不能在 OpenCL 中做到这一点。全局变量需要保持不变。

另一件事是您没有接到任何对 get_global_id(0) 或类似电话的电话,这是一个很大的危险信号 - 您的所有工作项目都将运行彼此完全相同的代码,或者您只有一个工作项。前者意味着您正在大规模丢弃计算结果,后者意味着您实际上没有使用任何并行性。在这两种情况下,您的代码都会很慢。这确实意味着weightsum 实际上不需要是静态的。

如果你想要可变的全局内存,你必须把它作为一个缓冲区传入。请注意,如果多个工作项需要写入该缓冲区中的同一个内存字(或者如果一个写入而其他人读取),您将需要使用全局屏障或原子。更好的方法是使用减少 - 搜索例如“OpenCL 并行减和”应该能让你有所收获。本质上,每个工作项将尽可能多地独立完成工作,然后工作项将合作以分层组合它们的结果。这通常具有 O(log(N)) 的复杂性,而不是单纯使用原子的 O(N)。

【讨论】:

  • 这是见解答案.. 感谢您的时间和宝贵的建议。我对 OpenCL 有点陌生。因此,试图了解它是如何并行工作的。我试图让工人为此设置,但我想它们没有用。可以帮助我根据多工作项修改上述代码,以便我的代码运行得更快吗?帮我优化一下。
猜你喜欢
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多