Function 仅使用一个内核将MQL5函数转换为OpenCL内核
我尝试将用于简单移动平均的MQL5函数转换为基于OpenCL的内核程序。Function 仅使用一个内核将MQL5函数转换为OpenCL内核,function,opencl,mql5,Function,Opencl,Mql5,我尝试将用于简单移动平均的MQL5函数转换为基于OpenCL的内核程序。 以下是我所做的: MQL5功能 void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[]) { int i,limit; //--- first calculation or number of bars was changed if(prev_calculated==0)//
以下是我所做的:
MQL5功能
void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[])
{
int i,limit;
//--- first calculation or number of bars was changed
if(prev_calculated==0)// first calculation
{
limit=InpMAPeriod+begin;
//--- set empty value for first limit bars
for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
//--- calculate first visible value
double firstValue=0;
for(i=begin;i<limit;i++)
firstValue+=price[i];
firstValue/=InpMAPeriod;
ExtLineBuffer[limit-1]=firstValue;
}
else limit=prev_calculated-1;
//--- main loop
for(i=limit;i<rates_total && !IsStopped();i++)
ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
}
void CalculateSimpleMA(整数费率、整数上一次计算、整数开始、常数加倍和价格[])
{
int i,极限;
//---更改了第一次计算或钢筋数量
if(prev_computed==0)//第一次计算
{
limit=inpmperiod+begin;
//---为第一个限制条设置空值
用于(i=0;iget_全局_id(4)看起来不正确,应该是一个介于0和2之间的数字,因为最多只能有3个维度。另外,您的ClenqueEndRange参数是什么?例如,您的本地大小是多少?@Ruyk我有clinfo
的信息输出,我可以与您共享:可能有重复的,有人能帮我吗?这可以获得\u全局\u id(4)不正确,设备最多只报告3维。您链接的OpenCL信息是平台信息,但不是您为内核提交的信息。如果不知道ClenqueEndRange的实际参数,我们将帮不上什么忙。
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
__kernel void CalculateSimpleMA(
int rates_total,
int prev_calculated,
int begin,
int InpMAPeriod,
__global double *price,
__global double *ExtLineBuffer
)
{
int i,limit;
int len_price = get_global_id(4);
if(prev_calculated==0)// first calculation
{
limit=InpMAPeriod+begin;
for(i=0;i<limit-1;i++)
ExtLineBuffer[i]=0.0;
double firstValue=0;
for(i=begin;i<limit;i++)
firstValue+=price[i];
firstValue/=InpMAPeriod;
ExtLineBuffer[limit-1]=firstValue;
}
else limit=prev_calculated-1;
for(i=limit;i<rates_total;i++)
ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
}