2017-02-21 26 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 выполняет одно и то же неопределенное поведение.

 Смежные вопросы

  • Нет связанных вопросов^_^