陷入循环,局部变量是否对工作组中的其他工作项不可见



我正在尝试使用局部变量在工作组中的所有工作项之间进行同步。但是,条件检查的其他部分总是失败。其他工作项的 d[0] 值不等于零。为什么局部变量在工作组中不可见?

我正在使用 AMD APU A12-9800

__kernel void test(__global int *input_vector,__global atomic_int *mem_flag)
{
    local int d[32];
    if(get_local_id(0)==0) {
            d[0] = 100;
        }
    barrier(CLK_GLOBAL_MEM_FENCE| CLK_LOCAL_MEM_FENCE);
    while(1) {
        if(get_local_id(0) == 0) {
            d[0] = 0;
            break;
        }
        else {
            if(d[0] == 0)
            break;
        }
    }
}
正如

@alexg所建议的那样,我添加了屏障以及删除了其他条件,并且它起作用了。这是完整的代码

__kernel void test(__global int *input_vector,__global atomic_int *mem_flag)
{
    local int d[32];                                                  
    if(get_local_id(0)==0) {                                          
            d[0] = 100;
        }   
    barrier(CLK_GLOBAL_MEM_FENCE| CLK_LOCAL_MEM_FENCE);               
    while(1) {
            mem_fence(CLK_GLOBAL_MEM_FENCE| CLK_LOCAL_MEM_FENCE);     
           if(d[0] == 0)
            break;
        if(get_local_id(0) == 0) {                                    
            d[0] = 0;   
        }   
    }     
}

最新更新