c - OpenCL 结构参数无效的地址空间

标签 c struct 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;                                               
  }                                                                           
}                                                                             

最佳答案

global 是一个指针限定符(地址空间),所以你必须传递global const t_param* params

关于c - OpenCL 结构参数无效的地址空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10018342/

相关文章:

json - 阻止 gorm 在 where 子句中提示 Unknown column ‘users.deleted_at’

c++ - 多设备环境中的 OpenCL 缓冲区实例化

c - 使用递归函数反向打印链表

c - localtime_s取决于智利圣地亚哥时区的当前系统时间

c++ - 只写结构体的部分字段

opencl - 明智地使用 GPU 和 CPU

mpi - 如何在单cpu机器上使用MPI在openCL中实现程序

C预处理器宏可以生成函数吗?

c - 从 Ubuntu 终端读取数据并将其存储在 C 中的不同变量中

c# - 通用约束,其中 T : struct and where T : class