2016-04-08 3 views
1

J'ai un jeu de codes de boucle for mql5 assez complexe que j'ai besoin de lancer via opencl. Ce que cela veut dire, c'est que je dois être capable d'avoir certaines fonctions du noyau appelant les autres. J'ai donc expérimenté avec ce code simple et il ne parvient pas à créer un programme (erreur 5105) quand j'appelle une autre fonction à travers elle. Pourquoi?Imbrication des fonctions du noyau pour 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

Pouvez-vous mettre .0f à la fin de tous les zéros? –

+0

D'accord, laissez-moi essayer. thx – ssn

+0

A fait cela et toujours eu la même erreur! – ssn

Répondre

2

EDIT: En fait, je l'ai révisé, et il est possible d'appeler un noyau d'un autre noyau. Cependant, vous ne devriez pas le faire, car il peut vous conduire à des problèmes sur la route (spécialement si vous utilisez la mémoire __local).

Le problème principal dans votre application est juste les flotteurs 0.0f.

Vous pouvez également faire une fonction séparée appelée par les deux noyaux. Et l'un d'eux est juste un emballage à la fonction.

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

Une grande partie de la raison pour laquelle cela fonctionne est parce que vous avez inclus '.0f' à la fin des données flottantes. Merci – ssn

+0

N'est-ce pas la raison pour laquelle cela fonctionne simplement que DarkZeros a réordonné les déclarations de fonction afin que l'appelé apparaisse avant l'appelant? Bien que je puisse me tromper quant à savoir si une exportation de noyau peut être appelée à partir du code de l'appareil. – Lee

+0

@Lee oui c'est vrai mais tout en maintenant cet ordre j'ai réalisé que j'avais seulement besoin de deux fonctions l'une vide l'autre __kernel – ssn