2016-04-08 13 views
1

Opencl ile çalıştırmam gereken oldukça karmaşık bir mql5 for-döngüsü kod kümesi var. Bunun anlamı, başkalarını arayarak bazı çekirdek işlevlerine sahip olmamız gerektiğidir. Bu nedenle bu basit kodu denedim ve bir başka işlev çağırdığımda bir program (hata 5105) oluşturulamıyor. Niye ya?opencl için iç içe çekirdek işlevleri

   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

Sıfırların sonunda .0f koyar mısınız? –

+0

Tamam, denememe izin ver. thx – ssn

+0

Bunu yaptı ve hala aynı hatayı aldın! – ssn

cevap

2

DÜZENLEME: Aslında, onu incelemiş ve başka çekirdekten bir çekirdek çağırmak mümkündür. Ancak bunu yapmamalısınız, çünkü bu sizi yoldaki sorunlara yönlendirebilir (özellikle __local belleğini kullanırsanız).

Uygulamanızdaki temel sorun sadece 0.0f şamandıralar.

Ayrıca, her iki çekirdek tarafından çağrılan ayrı bir işlev de yapabilirsiniz. Ve bunlardan biri, işlevin sadece bir sarıcısıdır.

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

Bunun nedeninin büyük bir kısmı, float verilerinin sonunda '.0f' içermesidir. Teşekkürler – ssn

+0

Bunun sebebi, sadece DarkZeros'un işlev bildirimlerini yeniden düzenlediğinden, arayanın arayandan önce görünmesi işe yaramaz mı? Her ne kadar bir çekirdek ihracatının cihaz kodundan çağrılıp yapılamayacağı konusunda kendimi karıştırıyor olabilirim. – Lee

+0

@Lee evet bu doğru ancak bu sırayı korurken sadece iki fonksiyona ihtiyaç duyduğumu fark ettim bir diğeri __kernel – ssn