2012-04-04 14 views
6

Tôi là người mới bắt đầu với OpenCL và tôi đang cố gắng làm cho hạt nhân sau hoạt động. Khi tôi chạy chương trình tôi nhận được một lỗi trong quá trình xây dựng của chương trình hạt nhân. Cụ thể hơn, lỗi là như sau:OpenCL struct đối số không gian địa chỉ không hợp lệ

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

Bạn có thể xem hạt nhân tại đây. Ban đầu tôi nghĩ rằng đó là bởi vì tôi đã không có cấu trúc được xác định bên trong hạt nhân, nhưng ngay cả khi tôi thêm chúng thì vấn đề vẫn tồn tại. Tôi làm gì sai ở đây?

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

Trả lời

4

global là khuôn khổ vòng loại con trỏ (địa chỉ không gian), vì vậy bạn phải vượt qua global const t_param* params.

+0

Cảm ơn. Đó thực sự là vấn đề. Tôi đã thử nghiệm nó trước khi nhìn thấy câu trả lời của bạn và trở lại bình luận rằng tôi đã tìm ra giải pháp. – gkaran89

+0

Tôi thấy nó tốt đẹp nói chung (không có ý tưởng về trường hợp này) để xem lỗi từ trình biên dịch khác nhau (AMD, Intel, ví dụ); không phải tất cả chúng đều hữu ích trong mọi trường hợp. – eudoxos