我正在尝试编写一个使用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管道。
答案 0 :(得分:1)
About work_group_reserve_write_pipe:
a中的所有工作项必须遇到此内置函数 工作组使用相同的参数值执行内核; 否则行为未定义。
循环从tid + start_index
开始,因此在一些循环迭代之后,某些工作项不会触及此指令。 while循环也在做同样的未定义行为。