2017-02-21 134 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循環做同樣的未定義的行爲。