Параллельное выполнение не выполняется OpenCL MQL5 - PullRequest
0 голосов
/ 26 апреля 2018

Я создал ядро ​​OpenCL в Mql5.
Вот код:

const string cl_src = 
    //"  int weightsum;                                               \r\n"
    " #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 double *price,                         \r\n"
        "__global double *ExtLineBuffer                  \r\n"
        ")                                               \r\n"
    "{                                                                 \r\n"
        "int i,limit;                                                  \r\n"
        "int len_price = get_global_id(4);                                     \r\n"
        //"int len_Ext = get_global_id(5);                                     \r\n"

        " if(prev_calculated==0)// first calculation                       \r\n"
        " {                                                                \r\n"
            "limit=InpMAPeriod+begin;                                      \r\n"   
            "for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;                  \r\n"     
            "double firstValue=0;                                          \r\n"
            "for(i=begin;i<limit;i++)                                      \r\n"
            "firstValue+=price[i];                                         \r\n"
            "firstValue/=InpMAPeriod;                                      \r\n"
            "ExtLineBuffer[limit-1]=firstValue;                            \r\n"
        "}                                                             \r\n"
        "else limit=prev_calculated-1;                                  \r\n"
        "for(i=limit;i<rates_total;i++)                                \r\n"
            "ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;\r\n"
    "}                                                                  \r\n"
    "                                                                          \r\n"                            
    "__kernel void CalculateEMA(                                            \r\n"
        "int rates_total,                                  \r\n"
        "int prev_calculated,                              \r\n"
        "int begin,                                        \r\n"
        "int InpMAPeriod,                                  \r\n"
        "__global double *price,                           \r\n"
        "__global double *ExtLineBuffer                    \r\n"
    ")                                                    \r\n"
    "{                                                                \r\n"
        "int    i,limit;                                               \r\n"
        "double SmoothFactor=2.0/(1.0+InpMAPeriod);                    \r\n"
        "if(prev_calculated==0)                                        \r\n"
        "{                                                             \r\n"
            "limit=InpMAPeriod+begin;                                      \r\n"
            "ExtLineBuffer[begin]=price[begin];                            \r\n"
            "for(i=begin+1;i<limit;i++)                                    \r\n"
                "ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor); \r\n"
        "}                                                             \r\n"
        "else limit=prev_calculated-1;                                 \r\n"
        "for(i=limit;i<rates_total;i++)                                \r\n"
            "ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor); \r\n"
    "}                                                                 \r\n"
    "                                                                          \r\n"

    "__kernel void CalculateLWMA(                                           \r\n"
        "int rates_total,                                 \r\n"
        "int prev_calculated,                             \r\n"
        "int begin,                                       \r\n"
        "int InpMAPeriod,                                 \r\n"
        "__global double *price,                          \r\n"
        "__global double *ExtLineBuffer                   \r\n"

    ")                                                 \r\n"
    "{                                                              \r\n"
        "int        i,limit;                                           \r\n"
        "int        weightsum;                                          \r\n"   
        "double     sum;                                               \r\n"
        "if(prev_calculated==0)                                        \r\n"
        "{                                                             \r\n"                                   
            "weightsum=0;                                                  \r\n"
            "limit=InpMAPeriod+begin;                                      \r\n"
            "for(i=0;i<limit;i++) ExtLineBuffer[i]=0.0;                    \r\n"
                 "double firstValue=0;                                         \r\n"
                "for(i=begin;i<limit;i++)                                      \r\n"
                "{                                                             \r\n"
                    "int k=i-begin+1;                                          \r\n"
                    "weightsum+=k;                                             \r\n"
                    "firstValue+=k*price[i];                                   \r\n"
                "}                                                             \r\n"
                "firstValue/=(double)weightsum;                                \r\n"
                "ExtLineBuffer[limit-1]=firstValue;                            \r\n"
            "}                                                             \r\n"
            "else limit=prev_calculated-1;                                 \r\n"
            "for(i=limit;i<rates_total;i++)                                \r\n"
            "{                                                             \r\n"
                "sum=0;                                                        \r\n"
                "for(int j=0;j<InpMAPeriod;j++) sum+=(InpMAPeriod-j)*price[i-j];\r\n"
                "ExtLineBuffer[i]=sum/weightsum;                               \r\n"
            "}                                                             \r\n"
        "}                                                                \r\n"
   "                                                                           \r\n"                            
   "__kernel void CalculateSmoothedMA(                                     \r\n"
        "int rates_total,                                 \r\n"
        "int prev_calculated,                             \r\n"
        "int begin,                                       \r\n"
        "int InpMAPeriod,                                 \r\n"
        "__global double *price,                          \r\n"
        "__global double *ExtLineBuffer                   \r\n"
    ")                                                 \r\n"
    "{                                                              \r\n"
        "int i,limit;                                                  \r\n"
        "if(prev_calculated==0)                                        \r\n"
        "{                                                             \r\n"
            "limit=InpMAPeriod+begin;                                      \r\n"
            "for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;                  \r\n"
            "double firstValue=0;                                          \r\n"
            "for(i=begin;i<limit;i++)                                      \r\n"
                "firstValue+=price[i];                                        \r\n"
                "firstValue/=InpMAPeriod;                                      \r\n"
                "ExtLineBuffer[limit-1]=firstValue;                            \r\n"
        "}                                                             \r\n"
        "else limit=prev_calculated-1;                                 \r\n"
        "for(i=limit;i<rates_total;i++)                \r\n"
            "ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod;\r\n"
    "}                                                              \r\n";

Хотя я могу запустить этот код, я получаю результаты, но не так быстро, как ожидалось с графическим процессором, поскольку я не могу использовать ядра или работника. Я попытался выполнить следующий способ:

int  offset[2]={0,0};
int  work  [2]={1024,1024};         
if(!CLExecute(cl_krn,2,offset,work))
           Print("Kernel not executed",GetLastError());

Но программа получила ошибку как OpenCl device not found.
Тогда я попробовал это:

int  offset[2]={0,0};
int  work  [2]={1024,1024};         
if(!CLExecute(cl_krn))
           Print("Kernel not executed",GetLastError());

И мой код работал гладко, но не с несколькими ядрами.

Что я могу сделать, чтобы программа работала с несколькими работниками в обязательном порядке.

EDITED

Какая платформа? Вы установили правильные драйверы OpenCL? Каков выход клинфо?

Ответ: Я использую Windows 10 Pro. Я установил последние версии драйверов OpenCL с веб-сайта Intel. Я думаю, что SDK, что они дают, это то, что я установил.
Вот вывод клинфо: Суть вывода клинфо

...