Объединить данные для печати после выполнения в OpenMP с C - PullRequest
0 голосов
/ 05 июля 2019

Я использую OpenMP для запуска функции в нескольких потоках. Эта функция возвращает переменную MyStruct, которую можно увидеть ниже:

typedef struct 
{
     int elements[8];
     uint64_t score;

} MyStruct;

После запуска функции в секции #pragma omp parallel я получаю p MyStruct переменных, где p - количество потоков (обратите внимание, что это частные переменные для каждого потока).

На данный момент я могу напечатать все эти MyStruct переменные и визуально найти ту, у которой наибольшее значение score, но я не нахожу это достаточно элегантным.

Как я могу выбрать из всех этих MyStruct переменных ту, которая набрала наибольшее количество очков, и распечатать только эту?

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Вы можете определить определяемое пользователем сокращение для выполнения этой задачи как часть операции соединения в вашем параллельном регионе:

#pragma omp declare reduction \
    (mymax:MyStruct:(omp_in.score > omp_out.score) ? omp_in : omp_out) \
    initializer(omp_priv = {.score = INT_MIN})

void example() {
    MyStruct s;

#pragma omp parallel reduction(mymax:s)
    {
        fill_struct_with_value(&s);
    }
}

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

Обратите внимание, что для приведенного выше кода требуется компилятор, поддерживающий OpenMP версии 4.0 или выше.

0 голосов
/ 05 июля 2019

Если я правильно понимаю, вы хотите напечатать переменную оценку в своей структуре, которая является самой большой.

Вы можете создать цикл while, в котором существует оценка, и перемещаться по каждой из них.В то время как вы перемещаетесь через каждый из них, вы создаете TMP.Если оценка> тмп.tmp = оценка;Тогда в конце ваш tmp будет держать максимальное значение.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...