2012-04-04 3 views
6

私はOpenCLの初心者です。以下のカーネルを動作させようとしています。私がプログラムを実行すると、カーネルプログラムのビルドプロセスでエラーが発生します。より具体的には、エラーは次のとおりです。OpenCL構造体引数が無効なアドレス空間

Error: Failed to build program executable! 
<program source>:19:64: error: invalid address space for argument to __kernel function 
__kernel void accelarate_flow(__global const   t_param params, 
                  ^

ここでカーネルを見ることができます。最初は私は構造体がカーネル内で定義されていなかったからだと思っていましたが、私がそれらを追加したとしても問題は依然として存在します。私はここで間違って何をしていますか?

const char *accelerate_flow_kernel_source = 
#pragma OPENCL EXTENSION cl_khr_fp64 : enable         
typedef struct                 
{                    
    int nx;                 
    int ny;                 
    int maxIters;                
    int reynolds_dim;               
    double density;                
    double accel;                
    double omega;                
} t_param;                  

typedef struct                 
{                    
    double speeds[9];               
} t_speed;                  

__kernel void accelarate_flow(__global const   t_param params,   
           __global const   int*  obstacles,  
           __global    t_speed* cells,   
             const unsigned int  count)   
{                    
    int pos = get_global_id(0);             
    if(pos >= count || pos % params.nx != 0) return;        
    double w1,w2;                
    w1 = params.density * params.accel/9.0;         
    w2 = params.density * params.accel/36.0;         
    if(!obstacles[pos] &&              
    (cells[pos].speeds[3] - w1) > 0.0 &&          
    (cells[pos].speeds[6] - w2) > 0.0 &&          
    (cells[pos].speeds[7] - w2) > 0.0)          
    {                   
    cells[pos].speeds[1] += w1;            
    cells[pos].speeds[5] += w2;            
    cells[pos].speeds[8] += w2;            
    cells[pos].speeds[3] -= w1;            
    cells[pos].speeds[6] -= w2;            
    cells[pos].speeds[7] -= w2;            
    }                   
}                    

答えて

4

globalポインタ修飾子(アドレススペース)であるので、あなたはglobal const t_param* paramsを渡す必要があります。

+0

ありがとうございました。それは確かに問題でした。私はあなたの返事を見る前にそれをテストしていました、そして、私が解決策を見つけたというコメントに戻りました。 – gkaran89

+0

異なるコンパイラ(AMD、Intelなど)からのエラーを表示するのは、一般的に(このケースについてはわかりません)わかりました。すべてのケースで役立つわけではありません。 – eudoxos

関連する問題