1

我有一个相当复杂的 mql5 for 循环代码集,需要通过 opencl 运行。这意味着我需要能够让一些内核函数调用其他函数。因此,我尝试了这个简单的代码,当我通过它调用另一个函数时,它无法创建程序(错误 5105)。为什么?

               const string _cl_source=
                "                                                      \r\n"
                "                                                      \r\n"
                "__kernel void Tester()                                \r\n"
                "{                                                     \r\n"
                "                                                      \r\n"
                "  float _margin = 10f;                                 \r\n"
                "  float _balance = 10f;                                \r\n"
                "  float _equity = 10f;                                 \r\n"
                "  float _openprice = 10f;                              \r\n"
                "  float _closeprice = 10f;                             \r\n"
                "  float _position = 10f;                               \r\n"
                "                                                      \r\n"
/*fails on adding this line*/"  CouponReset(_margin,_balance,_equity,_openprice,_closeprice,_position);\r\n"
                "                                                      \r\n"
                "}                                                     \r\n"
                "                                                      \r\n"
                "                                                      \r\n"
                "__kernel void CouponReset(float margin,                     \r\n"
                "                   float balance,                      \r\n"
                "                   float equity,                      \r\n"
                "                   float openprice,                      \r\n"
                "                   float closeprice,                     \r\n"
                "                   float position)               \r\n"
                "{                                                     \r\n"
                "  position = 0f;                         \r\n"
                "  openprice = 0f;                         \r\n"
                "  closeprice = 0f;                         \r\n"
                "  balance  = equity;                         \r\n"
                "  margin  = balance;                         \r\n"
                "                                                      \r\n"
                "}                                                     \r\n"
                "                                                      \r\n";
4

1 回答 1

2

编辑:实际上,我对其进行了审查,并且可以从另一个内核调用一个内核。但是你不应该这样做,因为它可能会导致你在路上遇到问题(特别是如果你使用__local内存)。

您的应用程序中的关键问题只是0.0f浮动。

您还可以执行一个由两个内核调用的单独函数。其中一个只是函数的包装器。

void _CouponReset(float margin,                     
                   float balance,                      
                   float equity,                      
                   float openprice,                      
                   float closeprice,                     
                   float position)               
{                                                     
  position = 0.0f;                         
  openprice = 0.0f;                         
  closeprice = 0.0f;                         
  balance  = equity;                         
  margin  = balance;                                         
} 


__kernel void Tester()                                
{                                                     

  float _margin = 10.0f;                                 
  float _balance = 10.0f;                                
  float _equity = 10.0f;                                 
  float _openprice = 10.0f;                              
  float _closeprice = 10.0f;                             
  float _position = 10.0f;                               

  _CouponReset(_margin,_balance,_equity,_openprice,_closeprice,_position);

}     


__kernel void CouponReset(float margin,                     
                   float balance,                      
                   float equity,                      
                   float openprice,                      
                   float closeprice,                     
                   float position)               
{                                                     
  _CouponReset(margin, balance, equity, openprice, closeprice, position);                                         
} 
于 2016-04-08T09:47:43.563 回答