Задать вопрос

OpenMP проверка четности потока, как?

Привет. Изучаю OpenMp, и при выполнении простейшего задания появились вопросы.
Я запускаю 8 потоков и хочу что бы если четный поток - записать цифру 1 в массив, под номером потока. Написал такую программу, но не понимаю почему std::cout << thread%2 << std::endl; выводит правильные значения, а уже на следующей строке if (thread%2 ==0) условие уже не отрабатывает? Это видно, когда в критическом блоке вывожу весь массив. Как исправить? Спасибо.
int main()
{
	int i;
	int threads = 8;
	int thread;
	int table[8] = { 0,0,0,0,0,0,0,0 };
	omp_set_num_threads(8);
#pragma omp parallel 
	{
		thread = omp_get_thread_num();
		threads = omp_get_num_threads();

		for (i = thread;i < threads;i += threads) {
			std::cout << thread%2 << std::endl;
			if (thread%2 ==0) {
				table[thread] = 1;
			}
		}
#pragma omp critical 
		{
			for (i = thread;i < threads;i += threads)
			{
				std::cout << table[i] << std::endl;
			}
		}
		
	}
}
  • Вопрос задан
  • 848 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
15432
@15432
Системный программист ^_^
1) ваши for (i = thread;i < threads;i += threads) ничего не делают и эквивалентны int i = thread;
2) когда вы печатаете массив целиком, потоки могут печатать значения в произвольном порядке. выводите на печать номер треда, который печатает это значение

3) не сразу заметил. переменные, описанные вне pragma omp - общие для всех потоков. в итоге переменная с номером потока оказывается перезаписанной другим потоком. и к моменту сравнения в переменной уже будет значение чужого потока.

int main()
{
  int thread;
  int table[8] = { 0 };
  omp_set_num_threads(8);
#pragma omp parallel private(thread)//всё, что дальше в скобках - будет запущено в 8 потоках одновременно
  { //потоки могут получать управление в произвольном порядке
    thread = omp_get_thread_num(); //каждый поток получает свой номер
    if (thread%2 ==0)  //четные потоки записывают в табличку единицу
        table[thread] = 1;
#pragma omp critical //критическая секция в один момент времени может выполняться только одним потоком
    {               //это необходимо, чтобы печать из разных потоков не перемешивалась
        std::cout << "Hello, I am thread no " << thread << std::endl;
        std::cout << "My table value is" << table[thread] << std::endl;
    }               //потоки проходят секцию также в произвольной очередности
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы