2017-02-21 5 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ループでハングします。ループ中にこのコードを削除するとコードがハングアップしませんが、パイプへの書き込みは起こりません。誰かがなぜこれが起こっているのか教えてもらえますか?

パイプは_write_onlyパイプとして宣言されています。

+1

[mcve]を入力してください。 –

答えて

1

About work_group_reserve_write_pipe:

この組み込み関数は、同じ引数値でカーネルを実行 ワークグループ内のすべての作業項目が直面しなければなりません。 これ以外の動作は未定義です。

ループはtid + start_indexから開始されるため、一部のループ反復の後、一部の作業項目はこの命令に当てはまりません。 whileループも同じ未定義の動作をしています。

関連する問題