Я столкнулся с кодом OpenMP, у которого была сводная статья, которая была для меня новой. Я пытаюсь понять, что это значит, но я не думаю, что полностью понял его последствия; Одно определение, которое я нашел, это:
COLLAPSE: указывает, сколько циклов в вложенном цикле должно быть свернуто в одно большое итерационное пространство и разделено в соответствии с предложением расписания. Последовательное выполнение итераций во всех связанных циклах определяет порядок итераций в сложенном итерационном пространстве.
Я думал, что понял, что это значит, поэтому я попробовал следующую простую программу:
int i, j;
#pragma omp parallel for num_threads(2) private(j)
for (i = 0; i < 4; i++)
for (j = 0; j <= i; j++)
printf("%d %d %d\n", i, j, omp_get_thread_num());
Что вызвало
0 0 0
1 0 0
1 1 0
2 0 0
2 1 0
2 2 1
3 0 1
3 1 1
3 2 1
3 3 1
Затем я добавил предложение collapse(2)
. Я ожидал, что будет иметь тот же результат в первых двух столбцах, но теперь будет иметь равное количество 0
и 1
в последнем столбце.
Но я получил
0 0 0
1 0 0
2 0 1
3 0 1
Итак, мои вопросы:
- Что происходит в моем коде?
- При каких обстоятельствах следует использовать
collapse
? - Можете ли вы привести пример, показывающий разницу между использованием
collapse
и не использованием его?