При необходимости вы можете найти исходные коды ниже по ссылке на github. Вы также можете найти полные и точные изменения, которые я внес для воспроизведения проблемы, а также журналы программы. Но теперь они находятся в истории изменений (очевидно, включение этих деталей делает этот вопрос не в фокусе).
Обновите и выделите еще раз: это не вопрос о том, как рассчитать время для программы на C++< /h1>
Как я уже говорил в исходном вопросе, я специально измерил реальное прошедшее время (время настенных часов), которое составляет 20 секунд (Windows) и 60 секунд (Linux). Я подтвердил это с помощью секундомера на своем телефоне. Мой единственный вопрос: почему эта программа, скомпилированная с теми же функциями оптимизации, работает намного медленнее в Linux, чем в Windows?
Я пытаюсь запустить этот код github (привет, это кликабельная ссылка, если вы не заметили) в Linux, но я обнаружил, что в Linux он работает в 2–3 раза медленнее, чем в Окна. Используя официальный пример ввода данных/BS_1000_torus.xyz, в Windows это занимает ~20 секунд, а в Linux — ~60 секунд (я подтвердил это с помощью секундомера на телефоне). Я пытаюсь понять, как настроить компиляцию, чтобы работа в Linux обеспечивала такую же производительность. Позвольте мне объяснить подробно.
В Windows:
Я выполнил точные шаги (включение AVX2, быстрой операции с плавающей запятой и OpenMP) в README, чтобы скомпилируйте проект с помощью vcpkg и VS2022. Запуск BS_1000_torus занимает около 20 секунд (подтверждается секундомером).
В Linux
В Linux я внес следующие изменения в включить ключевые функции, упомянутые в README:
- Удалена спецификация набора инструментов vcpkg из CMakeLists.txt
- Добавлен set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -fopenmp -pthread -Ofast") в CMakeLists.txt сразу после set(CMAKE_BUILD_TYPE RELEASE), чтобы включить функции, упомянутые в README.
Код: Выделить всё
mkdir build
cd build
cmake ..
make -j
Код: Выделить всё
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- 3.3.9
-- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake (found version "1.71.0")
-- BOOST FOUNDED
-- Using header-only CGAL
-- Targeting Unix Makefiles
-- Using /usr/bin/c++ compiler.
-- Found GMP: /usr/lib/x86_64-linux-gnu/libgmp.so
-- Found MPFR: /usr/lib/x86_64-linux-gnu/libmpfr.so
-- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake (found suitable version "1.71.0", minimum required is "1.66")
-- Boost include dirs: /usr/include
-- Boost libraries:
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE
-- Using gcc version 4 or later. Adding -frounding-math
-- Build type: RELEASE
-- USING CXXFLAGS = ' -mavx2 -fopenmp -pthread -Ofast -O3 -DNDEBUG'
-- USING EXEFLAGS = ' '
-- Found OpenMP_C: -fopenmp (found version "4.5")
-- Found OpenMP_CXX: -fopenmp (found version "4.5")
-- Found OpenMP: TRUE (found version "4.5")
-- Configuring done (1.2s)
-- Generating done (0.0s)
-- Build files have been written to: /home/user/3dlab/GCNO-master/build
Характеристики системы:
- Оба теста проводились на одном компьютере (двойная загрузка, а не WSL) с процессором Intel(R) Core(TM) i9-10900X @ 3,70 ГГц (10 ядер, 2 потока) на ядро). Я установил omp_set_num_threads(20); в начале int main.
- Система Windows: Windows 10
- Linux система: 5.15.0-88-generic #98~20.04.1-Ubuntu
- Почему время работы (фактическое затраченное время) настолько разное (20 секунд в Windows и 60 секунд в Linux), даже если я включил все флаги оптимизации, которые только могу придумать в Linux? Почему компиляция с использованием одних и тех же функций (AVX2, OpenMP) приводит к очень разному времени выполнения?
- Как настроить компиляцию так, чтобы она выполнялась так же быстро в Linux, как и в Windows? Есть ли какая-то автоматическая оптимизация для Windows и ручная оптимизация для Linux, которую я не включил?
Подробнее здесь: https://stackoverflow.com/questions/784 ... openmp-ena