2013-01-05 3 views
0

В моем коде я использую простую переменную int (named counter) для синхронизации 4 потоков.Не оптимизируйте определенный цикл с использованием флага -O3 в GCC

Вот отрывок из моего кода:

int counter = 0; 
#pragma omp parallel shared(counter) num_threads(4) 
{ 
    while(counter != thread_id){ 
     // What should I put here? 
    } 
    // Actions needed to be performed 'in order' 
    counter++; 
    // The rest of the code 
} 

Проблема я столкнулся в том, что если я использую -O3 оптимизации флаг, то время цикла пропадают в скомпилированный код ... Если для Например, я помещаю строку printf внутри цикла, происходит и все работает нормально ...

Что следует помещать внутри цикла while, поэтому -O3 не влияет на его поведение?

--- Редактировать ---

Извините за отсутствие контекста ... Мне нужно создать команду нитей, которые работают на конкретном proccessors, так как я работаю с системой NUMA, так что я нужен " создание команды "в порядке, чтобы я мог использовать сродство к процессору ... Пожалуйста, смотрите этот вопрос: Specific thread order in C using GCC and OMP

+11

Вы пытаетесь синхронизировать/присоединяться к своим темам? Для этого у OpenMP уже есть конструкции. Не пытайтесь катиться самостоятельно; что полностью побеждает точку! –

+4

Если вы пытаетесь синхронизировать потоки таким образом, ** я передам все ответы, которые расскажут вам, как это сделать **. –

+0

Как правило, если цикл, кажется, ничего не делает, вы не должны удивляться, если он просто отбрасывается оптимизатором. –

ответ

3

Как уже упоминалось, это НЕОБХОДИМЫЙ способ синхронизации потоков. Поскольку я не хочу, чтобы мой ответ был подавлен, я объясню, что вы должны использовать другую форму синхронизации. Как правило, semphore используется для подсчета вещей, поэтому PROBABLY будет правильным здесь, но поскольку у нас нет всего вашего кода, нет особого способа рассказать.

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