Вложенные функции ядра для opencl

1

У меня довольно сложный набор кода mql5 for-loop, который мне нужно запустить через 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";
  • 0
    Можете ли вы поставить .0f в конце всех нулей?
  • 0
    Хорошо, конечно, дай мне попробовать. Спасибо
Показать ещё 5 комментариев
Теги:
opencl
mql5

1 ответ

2
Лучший ответ

EDIT: Собственно, я просмотрел его, и можно вызвать ядро из другого ядра. Однако вы не должны этого делать, поскольку это может привести к проблемам в будущем (особенно если вы используете __local memory).

Ключевая проблема в вашем приложении - это просто поплавки 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);                                         
} 
  • 1
    Большая часть того, почему это работает, заключается в том, что вы добавили «.0f» в конец данных с плавающей точкой. Спасибо
  • 0
    Разве причина не работает просто, что DarkZeros переупорядочил объявления функций так, чтобы вызываемый объект появлялся перед вызывающим? Хотя, возможно, я не совсем понимаю, можно ли вызывать экспорт ядра из кода устройства.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню