Работает ли запись массива в Cilk параллельно?

т.е. за

int A[100]
A[:] = 1;

это пытается создать 100 потоков? или это то же самое, что и цикл for?

Я думал, что это было распараллелено, но я только что проверил это, и это не похоже на это.

Есть ли способ заставить его использовать несколько потоков или это просто нотация массива, нотация?


person d0m1n1c    schedule 23.04.2014    source источник


Ответы (1)


Нет. Cilk Plus поддерживает два вида параллелизма; параллелизм данных и параллелизм задач.

Параллелизм данных выполняет одну и ту же операцию над несколькими значениями одновременно. Иногда его называют SIMD — Single Instruction, Multiple Data. Обозначение массива является «подсказкой» компилятору, что это параллельная операция данных и должна выполняться с использованием векторных единиц ЦП. Когда элементов больше, чем может поместиться в блок вектора, компилятор создаст цикл вокруг операции. Если компилятор обнаружит, что несколько строк работают с одними и теми же наборами данных, он зациклится на всем вычислении.

Параллелизм задач выполняет несколько задач одновременно, где каждая задача выполняет свой собственный поток инструкций. Если вы хотите выполнять свои вычисления параллельно, вам нужно использовать цикл cilk_for вокруг ваших вычислений. Вы также можете использовать TBB или OpenMP, если предпочитаете их.

  • Барри
person user2062850    schedule 24.04.2014
comment
Я добавлю, что семантика записи массива была разработана для многопоточной реализации. Но это никогда не было реализовано таким образом. Но это было бы неудобно для производительности, потому что, если раздел массива достаточно велик, чтобы амортизировать накладные расходы на параллельное планирование, он также, вероятно, достаточно велик, чтобы не поместиться в кэш и, таким образом, вызвать проблемы с пропускной способностью. - person Arch D. Robison; 24.04.2014