Выполнение 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?
Спасибо.