OpenCL设备端入队内核&本地记忆

时间:2015-03-24 20:41:24

标签: c opencl

我正在尝试在设备端排队的内核中使用本地内存。

我假设任何本地声明的数组在工作组中的所有工作项中都是可见的。 当我在从主机端调用的内核上使用本地内存时,这被证明是正确的,但是当我在设备端排队的内核上使用类似的设置时,我遇到了问题。

我的假设有问题吗?

编辑:
我的内核如下: 我的目标是将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];
    }

2 个答案:

答案 0 :(得分:0)

不,没错。局部变量也在整个工作组设备端声明和使用。但是,它们不会与父内核共享。

你究竟在做什么?

答案 1 :(得分:0)

我的问题的工作解决方案是:

无法在设备端创建管道。我试图完成的是制作一个涉及分支的动态树结构。 OpenCL管道根本无法做到这一点,因为管道仍然是在主机端创建的内存对象。规范中没有当前的方法来创建内存对象。

然而,管道可以用于动态递归方法,虽然递归不能偏离,并且必须以线性方式发生。有关更多详细信息,请参阅AMD APP SDK示例代码包中的示例代码。具体来说,请查看Device Enqueue BFS示例。