2012-04-04 15 views
6

मैं ओपनसीएल के साथ कुल शुरुआत करने वाला हूं और मैं निम्नलिखित कर्नेल को काम करने की कोशिश कर रहा हूं। जब मैं प्रोग्राम चलाता हूं तो मुझे कर्नेल प्रोग्राम की निर्माण प्रक्रिया में त्रुटि मिलती है। अधिक विशिष्टता त्रुटि निम्न है:ओपनसीएल संरचना तर्क अमान्य पता स्थान

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

आप यहां कर्नेल देख सकते हैं। शुरुआत में हालांकि मैं ऐसा इसलिए था क्योंकि मेरे पास कर्नेल के अंदर परिभाषित structs नहीं थे, लेकिन जब भी मैंने उन्हें जोड़ा तो समस्या अभी भी मौजूद है। मुझसे यहां क्या गलत हो रहा है?

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

मुझे विभिन्न कंपेलरों (उदाहरण के लिए एएमडी, इंटेल) से त्रुटियों को देखने के लिए सामान्य रूप से यह अच्छा लगता है (इस मामले के बारे में कोई जानकारी नहीं); वे सभी मामलों में सहायक नहीं हैं। – eudoxos

संबंधित मुद्दे