2017-02-21 55 views
0

我正在尝试编写使用OpenCL管道的OpenCL内核。内核代码如下。使用OpenCL管道时内核挂起

uint tid = get_global_id(0); 
    uint numWorkItems = get_global_size(0); 
    int i; 
    int rid; 
    int temp = 0, temp1 = 0; 
    int val; 

    int szgr = get_local_size(0); 
    int lid = get_local_id(0); 

    for(i = tid + start_index; i < rLen; i = i + numWorkItems){ 
      temp = 0; 
      val = input[i]; 
      temp = hashTable[val - 1]; 
      if(temp){ 
        temp1 = projection[val - 1]; 
      } 

      reserve_id_t rid1 = work_group_reserve_write_pipe(c0, szgr); 

      while(is_valid_reserve_id(rid1) == false){ 
      rid1 = work_group_reserve_write_pipe(c0, szgr); 
      } 

      if(is_valid_reserve_id(rid1)) 
      { 

        write_pipe(c0,rid1,lid, &temp); 
        work_group_commit_write_pipe(c0, rid1); 
      } 

      reserve_id_t rid2 = work_group_reserve_write_pipe(c1, szgr); 

      while(is_valid_reserve_id(rid2) == false){ 
      rid2 = work_group_reserve_write_pipe(c1, szgr); 
      } 

      if(is_valid_reserve_id(rid2)) 
      { 

        write_pipe(c1,rid2,lid, &temp1); 
        work_group_commit_write_pipe(c1, rid2); 
      } 
    } 

但是,work_group_reserve_write_pipe函数总是失败,因此内核挂起在while循环。如果我删除这个while循环,那么代码不会挂起,但写入管道不会发生。有人能告诉我为什么会发生这种情况吗?

管道声明为_write_only管道。

+1

请提供[mcve]。 –

回答

1

About work_group_reserve_write_pipe:

这个内置的功能必须通过在 工作组具有相同的参数值执行内核的所有工作项目中遇到; 否则行为是未定义的。

循环从tid + start_index开始,所以在一些循环迭代之后,一些工作项不会碰到这条指令。另外一个while循环做同样的未定义的行为。