У меня есть ситуация, когда мне нужно повторить определенную итерацию цикла несколько раз. Итак, в этой конкретной итерации я уменьшаю индекс на один шаг, чтобы следующее приращение индекса цикла не имело значения.
Этот подход, который я должен реализовать, работает для многопоточных кодов OpenMP. Однако это не работает для OpenACC (как для многоядерных целей, так и для целей tesla). Я получаю следующую ошибку:
Floating point exception (core dumped)
Вот код для обоих случаев:
#include <stdio.h>
#include <omp.h>
#include <unistd.h>
int main() {
int x = 52;
int count = 5;
int i;
omp_set_num_threads(6);
#pragma omp parallel for
for(i=0;i<100;i++) {
if(i == x) {
printf("%d\n", i);
i--;
count--;
if(count == 0)
x = 10000;
}
}
int gpu_count = 0;
count = 5;
x = 52;
#pragma acc parallel loop independent
for(i=0;i<1000000;i++) {
if(i == x) {
#pragma acc atomic
gpu_count++;
i--;
count--;
if(count == 0)
x = 2000000;
}
}
printf("gpu_count: %d\n", gpu_count);
return 0;
}
Для OpenMP я получаю правильный вывод:
52
52
52
52
52
Но для OpenACC я получаю вышеупомянутую ошибку.
Если я прокомментирую строку 35 (i--;), код будет выполнен правильно и выведет количество повторных итераций (которое равно 1).
Примечание. Я использую PGI 16.5 с Geforce GTX 970 и CUDA 7.5.
Я компилирую компилятором PGI следующим образом:
pgcc -mp -acc -ta=multicore -g f1.c
Итак, мой вопрос: почему я вижу такое поведение? Могу ли я изменить переменную индекса цикла в OpenACC?