Я использовал Intel OpenMP для указания директив для приращения элементов массива. Однако, когда включена Intel-Profile-Guided Optimization, первый и второй элементы в массиве будут давать неправильные результаты.
Код написан на C. Он скомпилирован с помощью набора инструментов Intel Compiler 19.0 (Intel Parallel Studio XE 2019 Update 3) с IDE Visual Studio 2017 для Windows 10 Education, Intel i7-8750H. Оптимизация по профилю включается через Страницы свойств проекта -> Общие -> Специфично для Intel -> Параметры сборки по профилю. Чтобы включить его, я выбираю Фазу 1: Инструмент для оптимизации (Qprof-gen
).
int test[300];
int main() {
#pragma omp parallel for
for (int idx = 0; idx < 100; idx++) {
//printf("%d\n", idx);
test[idx] += 1;
}
}
После выполнения параллели для региона, элементы с 0
по 99
должны быть 1
. Это верно, когда оптимизация по профилю отключена. Однако, когда включена оптимизация по профилю, test[0]
становится 12
, а test[1]
остается 0
после выполнения, в то время как все остальные 98 элементов от 2
-го до 99
-го являются правильными обновлено до 1
. Как ни странно, если я раскомментирую оператор printf
, код даст правильные результаты, даже если включена оптимизация по профилю.