Застревая в цикле, локальная переменная не видна другим рабочим элементам в рабочей группе? - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь использовать локальную переменную для синхронизации всех рабочих элементов в рабочей группе.Однако остальная часть условной проверки всегда дает сбой.Значение 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;
        }
    }

}

1 Ответ

0 голосов
/ 23 апреля 2019

как предложено @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;   
        }   
    }     
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...