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

У меня довольно сложный набор кодов для цикла mql5, который мне нужно запустить через 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";

1

Решение

РЕДАКТИРОВАТЬ: На самом деле, я рассмотрел его, и можно вызвать ядро ​​из другого ядра. Однако вы не должны этого делать, так как это может привести к проблемам в будущем (особенно если вы используете __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);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]