2012-04-04 37 views
6

Jestem całkowicie początkującym użytkownikiem OpenCL i staram się, aby to jądro działało. Po uruchomieniu programu pojawia się błąd w procesie kompilacji programu jądra. Bardziej szczegółowy błąd to:Argument openCL struktury struct niepoprawna przestrzeń adresowa

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, 
                  ^

Tutaj można zobaczyć jądro. Na początku myślałem, że to dlatego, że nie miałem zdefiniowanych struktur wewnątrz jądra, ale nawet kiedy je dodałem, problem nadal istnieje. Co ja tu robię źle?

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;            
    }                   
}                    

Odpowiedz

4

global jest kwalifikator wskaźnik (adres spacja), więc trzeba przejść global const t_param* params.

+0

Dzięki. To był rzeczywiście problem. Testowałem to, zanim zobaczyłem twoją odpowiedź i wróciłem do komentarza, że ​​znalazłem rozwiązanie. – gkaran89

+0

Znalazłem to fajnie w ogóle (nie ma pojęcia o tym przypadku), aby zobaczyć błędy z różnych kompilatorów (na przykład AMD, Intel); nie wszystkie z nich są pomocne we wszystkich przypadkach. – eudoxos

Powiązane problemy