2016-04-08 12 views
1

Ich habe eine ziemlich komplexe MQL5 for-Schleife Code-Set, die ich über Opencl ausführen muss. Was das bedeutet, ist, dass ich in der Lage sein muss, einige Kernfunktionen zu haben, die andere anrufen. Ich habe daher mit diesem einfachen Code experimentiert und kann kein Programm erstellen (Fehler 5105), wenn ich eine andere Funktion durchführe. Warum?Nesting Kernel-Funktionen für opencl

   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

Können Sie .0f am Ende aller Nullen setzen? –

+0

Okay, lass mich es versuchen. thx – ssn

+0

Hat das und immer noch den gleichen Fehler! – ssn

Antwort

2

EDIT: Eigentlich habe ich es überprüft, und es ist möglich, einen Kernel von einem anderen Kernel aufzurufen. Sie sollten dies jedoch nicht tun, da dies zu Problemen führen kann (besonders wenn Sie __local Speicher verwenden).

Das Schlüsselproblem in Ihrer App ist nur die 0.0f Floats.

Sie können auch eine separate Funktion ausführen, die von beiden Kernen aufgerufen wird. Und einer von ihnen ist nur ein Wrapper für die Funktion.

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

Ein großer Teil davon, warum dies funktioniert, liegt darin, dass Sie '.0f' am Ende der Float-Daten eingefügt haben. Danke – ssn

+0

Ist das nicht der Grund dafür, dass DarkZeros die Funktionsdeklarationen so umgeordnet hat, dass der Aufrufer vor dem Aufrufer erscheint? Obwohl ich mich vielleicht irreführe, ob ein Kernel-Export vom Gerätecode aus aufgerufen werden kann. – Lee

+0

@Lee ja, das ist wahr, aber während ich diese Reihenfolge beibehalten habe, habe ich festgestellt, dass ich nur zwei Funktionen benötigt, die eine void die andere __kernel – ssn