Выполнение OpenMP конструкции "параллельный для" блокируется при вставке в цикл for, работающий на процессоре MicroBlaze

У меня проблема с реализацией OpenMP "GOMP" (а именно GNU OpenMP), работающей на процессоре Microblaze. Процессор MicroBlaze находится в основной ветке ядра, и Xilinx предоставил для него реализацию pthread. Поэтому я сделал кросс-компиляцию библиотеки GOMP, начиная с реализации pthread, и вставил ее в ядро ​​Linux, работающее на Microblaze (версия 3.10, названная Petalinux). В частности, проблема подсвечивается при выполнении одного из тестов Parsec (здесь есть ссылка ( http://parsec.cs.princeton.edu/download.htm)), а именно "черные дыры". Раздел кода, который показывает проблему, следующий:

int bs_thread(void *tid_ptr) {
    int i, j;
    fptype price;
    fptype priceDelta;
    int tid = *(int *)tid_ptr;

    for (j=0; j<NUM_RUNS; j++) { 
#pragma omp parallel for private(i, price, priceDelta)
        for (i=0; i<numOptions; i++) {

            price = BlkSchlsEqEuroNoDiv( sptprice[i], strike[i],rate[i], volatility[i], otime[i], otype[i], 0);
            prices[i] = price;
            } 
    } 

return 0;

}

blackscholes можно запустить с разными наборами ввода и разными номерами потоков с помощью команды:blackscholes _num_threads_ _input_file_ _output_file_

Запуск его с 1, 2, 3, 5, 7 потоками и т. Д., Следуя нечетным числам, работает хорошо. Запуская его с 4, 6, 8, 10 нитями и т. Д., Следуя четным числам, он блокируется. Опять же, уменьшив константу NUM_RUNS до 1, приложение работает хорошо. Мой вопрос: возможно ли, чтобы реализация GOMP страдала от вставки конструкции с разделением рабочих мест (а именно omp параллельной для) после цикла for?

Спасибо.

0 ответов

Другие вопросы по тегам