Kernel OPencl在缓冲区中返回零

Kernel OPencl在缓冲区中返回零,kernel,opencl,mql5,metatrader5,Kernel,Opencl,Mql5,Metatrader5,这是我的内核: const string cl_src = //" #pragma OPENCL EXTENSION cl_khr_fp64 : enable \r\n" "__kernel void CalculateSimpleMA( \r\n" "int rates_total,

这是我的内核:

 const string cl_src = 
//" #pragma OPENCL EXTENSION cl_khr_fp64 : enable                       \r\n"
"__kernel void CalculateSimpleMA(                                     \r\n"
                                 "int rates_total,                     \r\n"
                                 "int prev_calculated,                \r\n"
                                 "int begin,                          \r\n"
                                 "int InpMAPeriod,                    \r\n"
                                 "__global float *price,              \r\n"
                                 "__global float *storeValue          \r\n"
                                 ")                                    \r\n"
         "{                                                           \r\n"
            " int i,limit;                                               \r\n"
         " if(prev_calculated==0)// first calculation                 \r\n"
         "{                                                           \r\n" 
            "limit=InpMAPeriod+begin;                                 \r\n"
            "for(i=0;i<limit-1;i++) storeValue[i]=0.0;                \r\n"
            "double firstValue=0;                                     \r\n"
            "for(i=begin;i<limit;i++) firstValue+=price[i];           \r\n"
            "firstValue/=InpMAPeriod;                                 \r\n"
            "storeValue[limit-1]=firstValue;                          \r\n"
         "}                                                           \r\n"
         "else limit=prev_calculated-1;                               \r\n"
         "for(i= 0;i<rates_total;i++)                              \r\n"
            "storeValue[i]=storeValue[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;\r\n"

         "}                                                           \r\n";
我得到的错误是:

Could Not Set Arg3: 5108  
伙计们,请帮助我任何人。。我没有发现任何与我的问题有关的东西,请帮助我

编辑:
以下是几行:

"for(i= 0;i<rates_total;i++) \r\n" 

请告诉我我提到的ILNE是否存在问题,以及我如何解决问题。

CLSetKernelArgMemLocal
不能用于将数据从主机传递到设备。所以下面的语句是错误的:
CLSetKernelArgMemLocal(clu krn,4,clu price)
CLSetKernelArgMemLocal
只能用于设置内核内部要使用的本地缓冲区的大小。看

本地内存大小[in]缓冲区大小(字节)

如果要将数据从主机传递到设备,必须通过值(
CLSetKernelArg
)或全局内存缓冲区(
CLSetKernelArgMem

我不熟悉mql5。我怀疑代码应该是这样的:

CLBufferWrite(cl_price, price); // pass data to buffer
CLSetKernelArgMem(cl_krn,4,cl_price);

内核参数应该更改为:
\uu全局浮点*price

您不需要检查一些
OpenCL
函数的错误,比如
CLSetKernelArg
。您还可以检查一个特定的错误,如
无效\u句柄
,但其中许多错误可以返回您未检查的不同错误,例如:
CLBufferCreate
可以返回3个不同的错误,
CLKernelCreate
4个不同的错误等等。首先解决这个问题可以帮助你缩小问题的范围。让我试试看。我将更新缩小的问题,但创建点没有问题,执行部分有问题。检查我更新的方法。@doqtor获取错误为:
内核未执行:5109
以验证内核是否存在问题,请删除内核的内容,并检查在空内核上执行是否仍然失败。如果失败了,那么问题就出现在内核执行之前,你应该按照我在第一条评论中的建议去做。好的,但是你能在我的代码中说明一下吗。这将帮助我提高。我想我错过了一些东西,你能帮忙吗?我已经试过你的建议了。我犯了个错误。当我注释内核中的行时,内核进入了队列。以下是行:
“用于(i=0;如果您可以用代码的当前状态更新您的问题,那就太好了。同时确保index
i
没有超出范围。我已经更新了问题。我想知道如何检查我是否超出范围,因为即使print语句在内核中也不起作用,我以前也尝试过它我的意思是把当前的主机和内核代码放进去。据我所知,打印不在Nvidia上工作,所以你可以编写C++代码来模拟这个行为或计算你的头脑。
"for(i= 0;i<rates_total;i++) \r\n" 
OpenCL: GPU device 'GeForce GT 730' selected
CL_QUEUED
Buffer Copy Nothing: 0
CLBufferWrite(cl_price, price); // pass data to buffer
CLSetKernelArgMem(cl_krn,4,cl_price);