2012-04-04 5 views
6

Ich bin ein absoluter Anfänger mit OpenCL und ich versuche, den folgenden Kernel zu arbeiten. Wenn ich das Programm starte, erhalte ich einen Fehler im Build-Prozess des Kernel-Programms. Mehr Spezifität der Fehler ist folgender:OpenCL struct Argument ungültiger Adressraum

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

Sie können den Kernel hier sehen. Am Anfang dachte ich, dass es daran lag, dass ich die Strukturen nicht innerhalb des Kernels definiert hatte, aber selbst wenn ich sie hinzufügte, existierte das Problem immer noch. Was mache ich hier falsch?

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

Antwort

4

global ist ein Zeiger, Qualifier (Adresse Raum), so haben Sie global const t_param* params passieren.

+0

Danke. Das war in der Tat das Problem. Ich habe es getestet, bevor ich deine Antwort gesehen habe und kam zurück, um zu kommentieren, dass ich die Lösung gefunden habe. – gkaran89

+0

Ich fand es im Allgemeinen nett (keine Ahnung von diesem Fall), um Fehler von verschiedenen Compilern (AMD, Intel, zum Beispiel) zu sehen; Nicht alle sind in allen Fällen hilfreich. – eudoxos