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;如果您可以用代码的当前状态更新您的问题,那就太好了。同时确保indexi
没有超出范围。我已经更新了问题。我想知道如何检查我是否超出范围,因为即使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);