Приращение параллельного элемента OpenMP дает неверные результаты, когда включена оптимизация по профилю - PullRequest
1 голос
/ 19 апреля 2019

Я использовал 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, код даст правильные результаты, даже если включена оптимизация по профилю.

...