我正在尝试在设备端排队的内核中使用本地内存。
我假设任何本地声明的数组在工作组中的所有工作项中都是可见的。 当我在从主机端调用的内核上使用本地内存时,这被证明是正确的,但是当我在设备端排队的内核上使用类似的设置时,我遇到了问题。
我的假设有问题吗?
编辑:
我的内核如下:
我的目标是将FIFO管道分为3个缓冲区。问题是我的工作项具有有限的视图范围,我正在尝试将缓冲区写入另一个管道。
int pivot;
int in_pipe[BIN_SIZE];
int lt_bin[BIN_SIZE];
int gt_bin[BIN_SIZE];
int e_bin[BIN_SIZE];
reserve_id_t down_id = work_group_reserve_read_pipe(down_pipe, local_size);
//while ( is_valid_reserve_id(down_id) == false){
// down_id = work_group_reserve_read_pipe(down_pipe, local_size);
//}
//in_bin[tid] = -5;
if( is_valid_reserve_id(down_id) == true){
int status = read_pipe(down_pipe, down_id, lid, &pipe_out);
work_group_commit_read_pipe(down_pipe, down_id);
pivot = pipe_out;
pivot = work_group_broadcast(pivot, 0);
work_group_barrier(CLK_GLOBAL_MEM_FENCE);
work_group_barrier(CLK_LOCAL_MEM_FENCE);
in_pipe[tid] = pipe_out;
//in_bin[lid] = in_pipe[tid];
int e_count = 0;
int gt_count = 0;
int lt_count = 0;
if(in_pipe[tid] == pivot){
e_count = 1;
}
else if(in_pipe[tid] < pivot){
lt_count = 1;
}
else if(in_pipe[tid] > pivot){
gt_count = 1;
}
int e_tot = work_group_reduce_add(e_count);
e_tot = work_group_broadcast(e_tot, 0);
int e_val = work_group_scan_exclusive_add(e_count);
int gt_tot = work_group_reduce_add(gt_count);
gt_tot = work_group_broadcast(gt_tot, 0);
int gt_val = work_group_scan_exclusive_add(gt_count);
int lt_tot = work_group_reduce_add(lt_count);
lt_tot = work_group_broadcast(lt_tot, 0);
int lt_val = work_group_scan_exclusive_add(lt_count);
//in_bin[tid] = lt_val;
work_group_barrier(CLK_GLOBAL_MEM_FENCE);
work_group_barrier(CLK_LOCAL_MEM_FENCE);
if(in_pipe[tid] == pivot){
e_temp[e_val] = in_pipe[tid];
//in_bin[e_val] = e_bin[e_val];
//e_bin[e_Val] = work_group_broadcast(e_bin[e_val], lid);
}
if(in_pipe[tid] < pivot){
lte_temp[lt_val] = in_pipe[tid];
//in_bin[lt_val] = lt_bin[lt_val];
}
if(in_pipe[tid] > pivot){
gt_bin[gt_val] = in_pipe[tid];
//in_bin[gt_val] = gt_bin[gt_val];
}
答案 0 :(得分:0)
不,没错。局部变量也在整个工作组设备端声明和使用。但是,它们不会与父内核共享。
你究竟在做什么?
答案 1 :(得分:0)
我的问题的工作解决方案是:
无法在设备端创建管道。我试图完成的是制作一个涉及分支的动态树结构。 OpenCL管道根本无法做到这一点,因为管道仍然是在主机端创建的内存对象。规范中没有当前的方法来创建内存对象。
然而,管道可以用于动态递归方法,虽然递归不能偏离,并且必须以线性方式发生。有关更多详细信息,请参阅AMD APP SDK示例代码包中的示例代码。具体来说,请查看Device Enqueue BFS示例。