2016-04-08 21 views
1

openclを使用して実行する必要があるかなり複雑なmql5 forループコードセットがあります。これが意味することは、他の人を呼び出すいくつかのカーネル関数を持つ必要があるということです。私はこの単純なコードを試したので、別の関数を呼び出すとプログラム(エラー5105)を作成できません。どうして?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

すべてのゼロの最後に.0fを付けることはできますか? –

+0

さて、どうぞお試しください。 thx – ssn

+0

それをしても、同じエラーが発生しました! – ssn

答えて

2

EDIT:実際には、私はそれを見直し、別のカーネルからカーネルを呼び出すことができます。しかし、あなたが道路の下で問題につながる可能性があるので(特に__localのメモリを使用する場合)、あなたはそれをしないでください。

アプリの重要な問題は、ちょうど0.0f浮動小数点数です。

また、両方のカーネルによって呼び出される別個の機能を実行することもできます。そして、そのうちの1つは関数の単なるラッパーです。

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

浮動小数点データの末尾に「.0f」が含まれているため、これがなぜ機能するのかの大きな部分があります。ありがとう – ssn

+0

DarkZerosが呼び出し元の前に被呼び出し者が表示されるように関数宣言を並べ替えるという単純な理由はありませんか?私はカーネルのエクスポートをデバイスコードから呼び出すことができるかどうか自分自身を混乱させるかもしれませんが。 – Lee

+0

@Leeはい、それは本当ですが、その順序を維持しながら私は2つの関数を必要とすることを認識しました他の__kernelを無効にする – ssn

関連する問題