Странная конструкция в родине 3,1 миоцитов - PullRequest
0 голосов
/ 16 января 2020

В настоящее время я работаю над концептуальной архитектурой RISCV SIMT, и наш симулятор эмулирует только некоторые необходимые библиотечные вызовы. Мы пытаемся запустить тесты openmp rodinia 3.1 , но так как у нас есть только поддержка pthread, я пытаюсь перевести простой статически запланированный код openmp в pthread код.

В тесте myocyte я нашел такую ​​конструкцию:

// master.c
void master(params) {
    // declaration of th_id
    int th_id;

    // no initialization of th_id

    #pragma omp parallel private(th_id)
    {
        // code that uses th_id as a "thread id" value
    }
}

// main.c
#pragma omp parallel for
for (i=0; i<N; i++) {
    master(params);
}

Как я понимаю, разработчики рассчитывают на #pragma в master.c коде для инициализации переменной th_id, но Я не мог найти, где это указано в документации openmp. Предполагается, что th_id будет распознан и инициализирован с помощью ompenmp totaly штраф или неправильно?

1 Ответ

0 голосов
/ 16 января 2020

Этот код тестирования OpenMP полностью не работает. В начале параллельной области должно быть что-то вроде этого:

th_id = omp_get_thread_num();

Он получает идентификатор вызывающего потока и представляет собой число, которое варьируется от 0 до числа потоков, выполняющих параллельную область, минус 1 , с 0, соответствующим основному потоку.

Опять же, этот код действительно не работает и, кажется, был переведен с Фортрана. Доступ к массиву вне границ:

int th_count[4];

...

#pragma omp parallel private(th_id)
{
    ...
    if (th_id == th_count[4]) {
    ...
}

Я бы сказал, что вам следует просто отказаться от теста Myocyte.

...