From e01b43eec41d8443b443fdab98e3607e5a96e6fc Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Tue, 23 Nov 2021 20:04:01 -0800 Subject: [PATCH 01/31] Fix UB --- .../Runtime/lib/Simulators/FullstateSimulator.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp b/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp index c077f826643..93836936317 100644 --- a/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp +++ b/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp @@ -211,7 +211,7 @@ namespace Quantum { if (this->simulatorId != NULL_SIMULATORID) { - typedef unsigned (*TDestroy)(unsigned); + typedef void (*TDestroy)(unsigned); static TDestroy destroySimulatorInstance = reinterpret_cast(LoadProc(this->handle, "destroy")); assert(destroySimulatorInstance); @@ -226,7 +226,7 @@ namespace Quantum // Deprecated, use `DumpMachine()` and `DumpRegister()` instead. void GetState(TGetStateCallback callback) override { - typedef bool (*TDump)(unsigned, TGetStateCallback); + typedef void (*TDump)(unsigned, TGetStateCallback); static TDump dump = reinterpret_cast(this->GetProc("Dump")); dump(this->simulatorId, callback); } @@ -462,7 +462,7 @@ namespace Quantum void R(PauliId axis, QubitIdType target, double theta) override { - typedef unsigned (*TR)(unsigned, unsigned, double, unsigned); + typedef void (*TR)(unsigned, unsigned, double, unsigned); static TR r = reinterpret_cast(this->GetProc("R")); r(this->simulatorId, GetBasis(axis), theta, GetQubitId(target)); @@ -472,7 +472,7 @@ namespace Quantum void ControlledR(long numControls, QubitIdType controls[], PauliId axis, QubitIdType target, double theta) override { - typedef unsigned (*TMCR)(unsigned, unsigned, double, unsigned, unsigned*, unsigned); + typedef void (*TMCR)(unsigned, unsigned, double, unsigned, unsigned*, unsigned); static TMCR cr = reinterpret_cast(this->GetProc("MCR")); std::vector ids = GetQubitIds(numControls, controls); @@ -483,7 +483,7 @@ namespace Quantum void Exp(long numTargets, PauliId paulis[], QubitIdType targets[], double theta) override { - typedef unsigned (*TExp)(unsigned, unsigned, unsigned*, double, unsigned*); + typedef void (*TExp)(unsigned, unsigned, unsigned*, double, unsigned*); static TExp exp = reinterpret_cast(this->GetProc("Exp")); std::vector ids = GetQubitIds(numTargets, targets); std::vector convertedBases = GetBases(numTargets, paulis); @@ -494,7 +494,7 @@ namespace Quantum void ControlledExp(long numControls, QubitIdType controls[], long numTargets, PauliId paulis[], QubitIdType targets[], double theta) override { - typedef unsigned (*TMCExp)(unsigned, unsigned, unsigned*, double, unsigned, unsigned*, unsigned*); + typedef void (*TMCExp)(unsigned, unsigned, unsigned*, double, unsigned, unsigned*, unsigned*); static TMCExp cexp = reinterpret_cast(this->GetProc("MCExp")); std::vector idsTargets = GetQubitIds(numTargets, targets); std::vector idsControls = GetQubitIds(numControls, controls); From be7abba79c0be80e42ba18015184406169ba2376 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 13:27:08 -0800 Subject: [PATCH 02/31] (research for the future) Fixed the UB and switched to gcc-11. --- build/ci-codecheck.yml | 2 +- build/ci.yml | 80 +++++++++---------- build/e2e.yml | 56 ++++++------- src/Qir/qir-utils.ps1 | 2 +- .../Native/build-native-simulator.ps1 | 4 +- src/Simulation/Native/prerequisites.ps1 | 14 ++-- 6 files changed, 80 insertions(+), 78 deletions(-) diff --git a/build/ci-codecheck.yml b/build/ci-codecheck.yml index 9e2427cb7e8..4b4545f31e8 100644 --- a/build/ci-codecheck.yml +++ b/build/ci-codecheck.yml @@ -27,7 +27,7 @@ jobs: linux: imageName: 'ubuntu-latest' mac: - imageName: 'macOS-10.15' + imageName: 'macOS-latest' #windows: # No sanitizers supported on Win at the moment. # imageName: 'windows-latest' pool: diff --git a/build/ci.yml b/build/ci.yml index 48ca8e7e740..99db278a661 100644 --- a/build/ci.yml +++ b/build/ci.yml @@ -1,47 +1,47 @@ -name: $(Build.Major).$(Build.Minor).$(date:yyMM).$(DayOfMonth)$(rev:rr) +# name: $(Build.Major).$(Build.Minor).$(date:yyMM).$(DayOfMonth)$(rev:rr) -trigger: none +# trigger: none -pr: -- main -- feature/* -- features/* -- release/* +# pr: +# - main +# - feature/* +# - features/* +# - release/* -schedules: -- cron: "0 9 * * Sat" - displayName: 'Build for Component Governance' - branches: - include: - - main - always: true +# schedules: +# - cron: "0 9 * * Sat" +# displayName: 'Build for Component Governance' +# branches: +# include: +# - main +# always: true -variables: - Build.Major: 0 - Build.Minor: 16 - Drops.Dir: $(Build.ArtifactStagingDirectory)/drops - Drop.Native: $(System.DefaultWorkingDirectory)/xplat - CI: "true" +# variables: +# Build.Major: 0 +# Build.Minor: 16 +# Drops.Dir: $(Build.ArtifactStagingDirectory)/drops +# Drop.Native: $(System.DefaultWorkingDirectory)/xplat +# CI: "true" -jobs: -- job: build - displayName: Build - strategy: - matrix: - linux: - imageName: 'ubuntu-latest' - mac: - imageName: 'macOS-10.15' - windows: - imageName: 'windows-latest' - pool: - vmImage: $(imageName) - timeoutInMinutes: 90 +# jobs: +# - job: build +# displayName: Build +# strategy: +# matrix: +# linux: +# imageName: 'ubuntu-latest' +# mac: +# imageName: 'macOS-10.15' +# windows: +# imageName: 'windows-latest' +# pool: +# vmImage: $(imageName) +# timeoutInMinutes: 90 - steps: - - template: steps.yml +# steps: +# - template: steps.yml - - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 - displayName: 'Component Detection' - inputs: - failOnAlert: true +# - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 +# displayName: 'Component Detection' +# inputs: +# failOnAlert: true diff --git a/build/e2e.yml b/build/e2e.yml index 1a56ac89ab3..96468709b3d 100644 --- a/build/e2e.yml +++ b/build/e2e.yml @@ -1,33 +1,33 @@ -name: $(Build.Major).$(Build.Minor).$(date:yyMM).$(BuildId) +# name: $(Build.Major).$(Build.Minor).$(date:yyMM).$(BuildId) -parameters: -- name: validation_level - displayName: Validation Level - type: string - default: normal - values: - - minimal - - normal - - full +# parameters: +# - name: validation_level +# displayName: Validation Level +# type: string +# default: normal +# values: +# - minimal +# - normal +# - full -trigger: none +# trigger: none -pr: -- main -- feature/* -- features/* -- release/* +# pr: +# - main +# - feature/* +# - features/* +# - release/* -resources: - repositories: - - repository: qdk - type: github - endpoint: github - name: microsoft/qdk - ref: refs/heads/main +# resources: +# repositories: +# - repository: qdk +# type: github +# endpoint: github +# name: microsoft/qdk +# ref: refs/heads/main -extends: - template: build/qdk-module-e2e.yml@qdk - parameters: - module: qsharp-runtime - validation_level: ${{ parameters.validation_level }} +# extends: +# template: build/qdk-module-e2e.yml@qdk +# parameters: +# module: qsharp-runtime +# validation_level: ${{ parameters.validation_level }} diff --git a/src/Qir/qir-utils.ps1 b/src/Qir/qir-utils.ps1 index 612c19b9246..57e0cdd5cf2 100644 --- a/src/Qir/qir-utils.ps1 +++ b/src/Qir/qir-utils.ps1 @@ -84,7 +84,7 @@ function Build-CMakeProject { $buildType = "RelWithDebInfo" } - cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER $clangTidy -D CMAKE_BUILD_TYPE="$buildType" ../.. | Write-Host + cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER $clangTidy -D CMAKE_BUILD_TYPE="$buildType" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" ../.. | Write-Host if ($LastExitCode -ne 0) { Write-Host "##vso[task.logissue type=error;]Failed to generate $Name." $all_ok = $false diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 3908c7df01c..ae4c936753f 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -28,7 +28,9 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( Write-Host "On MacOS build native simulator using gcc (needed for OpenMP)" # `gcc`on Darwin seems to be a shim that redirects to AppleClang, to get real gcc, must point to the specific # version of gcc we've installed. - cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. + # cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. + cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-11 -D CMAKE_CXX_COMPILER=g++-11 ` + -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. } else { cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. diff --git a/src/Simulation/Native/prerequisites.ps1 b/src/Simulation/Native/prerequisites.ps1 index 3f1272ffa84..28f171eaec1 100644 --- a/src/Simulation/Native/prerequisites.ps1 +++ b/src/Simulation/Native/prerequisites.ps1 @@ -2,13 +2,13 @@ # Licensed under the MIT License. if (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Darwin")))) { - # building with gcc-9 succeeds but some of the unit tests fail - Write-Host "Install gcc-7 as pre-req for building native simulator on MacOS" - # temporary workaround for Bintray sunset - # remove this after Homebrew is updated to 3.1.1 on MacOS image, see: - # https://github.com/actions/virtual-environments/blob/main/images/macos/macos-10.15-Readme.md - brew update - brew install gcc@7 + # # building with gcc-9 succeeds but some of the unit tests fail + # Write-Host "Install gcc-7 as pre-req for building native simulator on MacOS" + # # temporary workaround for Bintray sunset + # # remove this after Homebrew is updated to 3.1.1 on MacOS image, see: + # # https://github.com/actions/virtual-environments/blob/main/images/macos/macos-10.15-Readme.md + # brew update + # brew install gcc@7 } else { Write-Host "No pre-reqs for building native simulator on platforms other than MacOS" } From 3011c7e7e111bfbdeba861a819308cc899c0652a Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 13:47:41 -0800 Subject: [PATCH 03/31] Switched NativeSimulaotr to clang on Mac and Linux --- src/Simulation/Native/CMakeLists.txt | 5 +++-- src/Simulation/Native/build-native-simulator.ps1 | 15 +++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Simulation/Native/CMakeLists.txt b/src/Simulation/Native/CMakeLists.txt index 06b27fd43de..84189daea30 100644 --- a/src/Simulation/Native/CMakeLists.txt +++ b/src/Simulation/Native/CMakeLists.txt @@ -42,8 +42,9 @@ if (MSVC) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT /Qspectre /guard:cf /Zi /Z7") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd /Qspectre /guard:cf") set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG") -else (MSVC) - set(CMAKE_CXX_FLAGS "-static-libgcc") + # TODO(rokuzmin): Switch to clang. +# else (MSVC) +# set(CMAKE_CXX_FLAGS "-static-libgcc") endif (MSVC) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index ae4c936753f..c934860b885 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -17,20 +17,23 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W { Write-Host "On Windows build native simulator using the default C/C++ compiler (should be MSVC)" cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. + # TODO(rokuzmin): Switch to clang. } elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) { Write-Host "On Linux build native simulator using gcc (needed for OpenMP)" - cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc -D CMAKE_CXX_COMPILER=g++ -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. + cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=clang-11 -D CMAKE_CXX_COMPILER=clang++-11 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. + # TODO(rokuzmin): Updte prerequisites. } elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Darwin")))) { - Write-Host "On MacOS build native simulator using gcc (needed for OpenMP)" - # `gcc`on Darwin seems to be a shim that redirects to AppleClang, to get real gcc, must point to the specific - # version of gcc we've installed. - # cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. - cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-11 -D CMAKE_CXX_COMPILER=g++-11 ` + # Write-Host "On MacOS build native simulator using gcc (needed for OpenMP)" + # # `gcc`on Darwin seems to be a shim that redirects to AppleClang, to get real gcc, must point to the specific + # # version of gcc we've installed. + # # cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. + cmake -D BUILD_SHARED_LIBS:BOOL="1" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + # TODO(rokuzmin): Updte prerequisites. } else { cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. From cc37f2826e68634aa2957a0a44d4cb28dd4679e2 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 14:48:13 -0800 Subject: [PATCH 04/31] Verbose NativeSim (NS) build on linux --- src/Simulation/Native/build-native-simulator.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index c934860b885..8082f5afbba 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -22,7 +22,7 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) { Write-Host "On Linux build native simulator using gcc (needed for OpenMP)" - cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=clang-11 -D CMAKE_CXX_COMPILER=clang++-11 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. + cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=clang-11 -D CMAKE_CXX_COMPILER=clang++-11 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # TODO(rokuzmin): Updte prerequisites. } elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Darwin")))) From f27fa676d9342857eb31aecff36720f4f3c1a480 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 15:18:46 -0800 Subject: [PATCH 05/31] Install libomp on Mac. --- src/Simulation/Native/prerequisites.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Simulation/Native/prerequisites.ps1 b/src/Simulation/Native/prerequisites.ps1 index 28f171eaec1..f82c005c01f 100644 --- a/src/Simulation/Native/prerequisites.ps1 +++ b/src/Simulation/Native/prerequisites.ps1 @@ -9,6 +9,7 @@ if (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Dar # # https://github.com/actions/virtual-environments/blob/main/images/macos/macos-10.15-Readme.md # brew update # brew install gcc@7 + brew install libomp } else { Write-Host "No pre-reqs for building native simulator on platforms other than MacOS" } From 8876e691804495cbbc58bc4920722f1766c54cf9 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 17:20:28 -0800 Subject: [PATCH 06/31] Cistomized openmp for clang on Mac. --- src/Simulation/Native/build-native-simulator.ps1 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 8082f5afbba..729ee7d534f 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -31,7 +31,14 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( # # `gcc`on Darwin seems to be a shim that redirects to AppleClang, to get real gcc, must point to the specific # # version of gcc we've installed. # # cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. + + $OPENMP_PATH="/usr/local/opt/libomp" + $OPENMP_COMPILER_FLAGS="-Xpreprocessor -fopenmp -I$OPENMP_PATH/include" + $OPENMP_LIB_NAME="omp" cmake -D BUILD_SHARED_LIBS:BOOL="1" ` + -D OpenMP_CXX_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_CXX_LIB_NAMES="$OPENMP_LIB_NAME" ` + -D OpenMP_C_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_C_LIB_NAMES="$OPENMP_LIB_NAME" ` + -D OpenMP_omp_LIBRARY=$OPENMP_PATH/lib/libomp.dylib ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # TODO(rokuzmin): Updte prerequisites. } From bc8e32c188263ea3460a043305f755fb984b2122 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 17:41:57 -0800 Subject: [PATCH 07/31] libomp path correction. --- build/steps-codecheck.yml | 2 +- src/Simulation/Native/build-native-simulator.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/steps-codecheck.yml b/build/steps-codecheck.yml index 8a25efe684f..fe474e3ccbf 100644 --- a/build/steps-codecheck.yml +++ b/build/steps-codecheck.yml @@ -10,7 +10,7 @@ steps: # QIR Runtime: - pwsh: src/Qir/Runtime/prerequisites.ps1 - displayName: "Install QIR Runtime Prerequisistes" + displayName: "Install QIR Runtime Prerequisites" workingDirectory: $(System.DefaultWorkingDirectory) - pwsh: src/Qir/Runtime/build-qir-runtime.ps1 diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 729ee7d534f..e90e3a92987 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -33,7 +33,7 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( # # cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. $OPENMP_PATH="/usr/local/opt/libomp" - $OPENMP_COMPILER_FLAGS="-Xpreprocessor -fopenmp -I$OPENMP_PATH/include" + $OPENMP_COMPILER_FLAGS="-Xpreprocessor -fopenmp -I$OPENMP_PATH/include -lomp -L$OPENMP_PATH/lib" $OPENMP_LIB_NAME="omp" cmake -D BUILD_SHARED_LIBS:BOOL="1" ` -D OpenMP_CXX_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_CXX_LIB_NAMES="$OPENMP_LIB_NAME" ` From 3126e99b3d5eb79b4501bc3408f0bd77c3e54155 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 17:55:02 -0800 Subject: [PATCH 08/31] Separated compiler and linker flags. --- src/Simulation/Native/build-native-simulator.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index e90e3a92987..6ec398c82df 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -33,12 +33,13 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( # # cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. $OPENMP_PATH="/usr/local/opt/libomp" - $OPENMP_COMPILER_FLAGS="-Xpreprocessor -fopenmp -I$OPENMP_PATH/include -lomp -L$OPENMP_PATH/lib" + $OPENMP_COMPILER_FLAGS="-Xpreprocessor -fopenmp -I$OPENMP_PATH/include" $OPENMP_LIB_NAME="omp" cmake -D BUILD_SHARED_LIBS:BOOL="1" ` -D OpenMP_CXX_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_CXX_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_C_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_C_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_omp_LIBRARY=$OPENMP_PATH/lib/libomp.dylib ` + -D CMAKE_EXE_LINKER_FLAGS="-lomp -L$OPENMP_PATH/lib" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # TODO(rokuzmin): Updte prerequisites. } From 96361ad5ed42415e3c82c01b8f850d5227f3eb18 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 18:25:05 -0800 Subject: [PATCH 09/31] Reverted teh change. --- src/Simulation/Native/build-native-simulator.ps1 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 6ec398c82df..e90e3a92987 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -33,13 +33,12 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( # # cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. $OPENMP_PATH="/usr/local/opt/libomp" - $OPENMP_COMPILER_FLAGS="-Xpreprocessor -fopenmp -I$OPENMP_PATH/include" + $OPENMP_COMPILER_FLAGS="-Xpreprocessor -fopenmp -I$OPENMP_PATH/include -lomp -L$OPENMP_PATH/lib" $OPENMP_LIB_NAME="omp" cmake -D BUILD_SHARED_LIBS:BOOL="1" ` -D OpenMP_CXX_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_CXX_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_C_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_C_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_omp_LIBRARY=$OPENMP_PATH/lib/libomp.dylib ` - -D CMAKE_EXE_LINKER_FLAGS="-lomp -L$OPENMP_PATH/lib" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # TODO(rokuzmin): Updte prerequisites. } From 2f4bd873f036d383fb76346fe92a1b958b7b5703 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 18:46:37 -0800 Subject: [PATCH 10/31] Added sanitizers to NS. --- src/Simulation/Native/build-native-simulator.ps1 | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index e90e3a92987..fec3ec3f25f 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -10,6 +10,12 @@ if (-not (Test-Path $nativeBuild)) { } Push-Location $nativeBuild +$SANITIZE_FLAGS="-fsanitize=undefined -fsanitize=float-divide-by-zero " ` + + "-fsanitize=unsigned-integer-overflow -fsanitize=implicit-conversion -fsanitize=local-bounds -fsanitize=nullability " ` + + "-fsanitize=address " ` + + "-fsanitize-blacklist=/Users/runner/work/1/s/src/Qir/Common/cmake/../../UBSan.ignore " ` + + "-fno-omit-frame-pointer -fno-optimize-sibling-calls" + # There should be no space after -D CMAKE_BUILD_TYPE= but if we provide the environment variable inline, without # the space it doesn't seem to get substituted... With invalid -D CMAKE_BUILD_TYPE argument cmake silently produces # a DEBUG build. @@ -22,7 +28,10 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) { Write-Host "On Linux build native simulator using gcc (needed for OpenMP)" - cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=clang-11 -D CMAKE_CXX_COMPILER=clang++-11 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=clang-11 -D CMAKE_CXX_COMPILER=clang++-11 ` + -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" ` + -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" ` + -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # TODO(rokuzmin): Updte prerequisites. } elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Darwin")))) @@ -39,6 +48,8 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( -D OpenMP_CXX_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_CXX_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_C_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_C_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_omp_LIBRARY=$OPENMP_PATH/lib/libomp.dylib ` + -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" ` + -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # TODO(rokuzmin): Updte prerequisites. } From c029960b7205a89be8773d8c923ef4851eac719a Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 19:00:24 -0800 Subject: [PATCH 11/31] Fixed teh sanitizers. --- src/Simulation/Native/build-native-simulator.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index fec3ec3f25f..e1e3336b95a 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -10,11 +10,11 @@ if (-not (Test-Path $nativeBuild)) { } Push-Location $nativeBuild -$SANITIZE_FLAGS="-fsanitize=undefined -fsanitize=float-divide-by-zero " ` - + "-fsanitize=unsigned-integer-overflow -fsanitize=implicit-conversion -fsanitize=local-bounds -fsanitize=nullability " ` +$SANITIZE_FLAGS="-fsanitize=undefined " ` + "-fsanitize=address " ` - + "-fsanitize-blacklist=/Users/runner/work/1/s/src/Qir/Common/cmake/../../UBSan.ignore " ` + "-fno-omit-frame-pointer -fno-optimize-sibling-calls" + #+ "-fsanitize=float-divide-by-zero " + #+ "-fsanitize=unsigned-integer-overflow -fsanitize=implicit-conversion -fsanitize=local-bounds -fsanitize=nullability " # There should be no space after -D CMAKE_BUILD_TYPE= but if we provide the environment variable inline, without # the space it doesn't seem to get substituted... With invalid -D CMAKE_BUILD_TYPE argument cmake silently produces From c48ca6cf44488b586d011fc4cc4b5fb0face1a51 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 19:53:40 -0800 Subject: [PATCH 12/31] Added more sanitizers to NS. --- src/Qir/Runtime/test-qir-runtime.ps1 | 4 ++++ src/Qir/Samples/test-qir-samples.ps1 | 3 +++ src/Qir/Tests/test-qir-tests.ps1 | 11 +++++++---- .../Native/build-native-simulator.ps1 | 19 ++++++++++++++++--- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/Qir/Runtime/test-qir-runtime.ps1 b/src/Qir/Runtime/test-qir-runtime.ps1 index 68a09d7b990..b99a21ddf06 100644 --- a/src/Qir/Runtime/test-qir-runtime.ps1 +++ b/src/Qir/Runtime/test-qir-runtime.ps1 @@ -6,6 +6,10 @@ # TODO: `ASAN_OPTIONS=check_initialization_order=1` (https://clang.llvm.org/docs/AddressSanitizer.html#initialization-order-checking). # TODO: macOS: `ASAN_OPTIONS=detect_leaks=1` (https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection). +$env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:print_stats=true:" ` + + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` + + "detect_invalid_pointer_pairs=2:detect_invalid_pointer_pairs=2" + if (-not (Test-CTest (Join-Path $PSScriptRoot bin $Env:BUILD_CONFIGURATION unittests) "QIR Runtime")) { throw "At least one project failed testing. Check the logs." } diff --git a/src/Qir/Samples/test-qir-samples.ps1 b/src/Qir/Samples/test-qir-samples.ps1 index 1a1246cb732..98f33f9c63d 100644 --- a/src/Qir/Samples/test-qir-samples.ps1 +++ b/src/Qir/Samples/test-qir-samples.ps1 @@ -5,6 +5,9 @@ # TODO: `ASAN_OPTIONS=check_initialization_order=1` (https://clang.llvm.org/docs/AddressSanitizer.html#initialization-order-checking). # TODO: macOS: `ASAN_OPTIONS=detect_leaks=1` (https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection). +$env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:print_stats=true:" ` + + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` + + "detect_invalid_pointer_pairs=2:detect_invalid_pointer_pairs=2" if (-not (Test-CTest (Join-Path $PSScriptRoot bin $Env:BUILD_CONFIGURATION StandaloneInputReference) "QIR Samples (StandaloneInputReference)")) { throw "At least one project failed testing. Check the logs." diff --git a/src/Qir/Tests/test-qir-tests.ps1 b/src/Qir/Tests/test-qir-tests.ps1 index f6ad54463b5..ef526b1f848 100644 --- a/src/Qir/Tests/test-qir-tests.ps1 +++ b/src/Qir/Tests/test-qir-tests.ps1 @@ -16,14 +16,17 @@ if ($Env:BUILD_CONFIGURATION -eq "Debug") if (-not ($IsWindows)) { $env:LSAN_OPTIONS += "suppressions=../../../../LSan.ignore" # https://clang.llvm.org/docs/AddressSanitizer.html#suppressing-memory-leaks - if (-not ($IsMacOS)) - { - $env:ASAN_OPTIONS += "check_initialization_order=1" # https://clang.llvm.org/docs/AddressSanitizer.html#initialization-order-checking - } + #if (-not ($IsMacOS)) + #{ + # $env:ASAN_OPTIONS += "check_initialization_order=1" # https://clang.llvm.org/docs/AddressSanitizer.html#initialization-order-checking + #} #else # AddressSanitizer: detect_leaks is not supported on this platform. Re-enable this once supported. #{ # $env:ASAN_OPTIONS += "detect_leaks=1" # https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection #} + $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:print_stats=true:" ` + + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` + + "detect_invalid_pointer_pairs=2:detect_invalid_pointer_pairs=2" } } diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index e1e3336b95a..522b3328588 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -10,11 +10,24 @@ if (-not (Test-Path $nativeBuild)) { } Push-Location $nativeBuild -$SANITIZE_FLAGS="-fsanitize=undefined " ` +$SANITIZE_FLAGS=` + "-fsanitize=undefined " ` + + "-fsanitize=shift -fsanitize=shift-base " ` + + "-fsanitize=integer-divide-by-zero -fsanitize=float-divide-by-zero " ` + + "-fsanitize=unreachable " ` + + "-fsanitize=vla-bound -fsanitize=null -fsanitize=return " ` + + "-fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=object-size " ` + + "-fsanitize=float-cast-overflow -fsanitize=nonnull-attribute -fsanitize=returns-nonnull-attribute -fsanitize=bool -fsanitize=enum " ` + + "-fsanitize=vptr -fsanitize=pointer-overflow -fsanitize=builtin " ` + + "-fsanitize=implicit-conversion -fsanitize=local-bounds -fsanitize=nullability " ` + ` + "-fsanitize=address " ` + + "-fsanitize=pointer-compare -fsanitize=pointer-subtract " ` + + "-fsanitize-address-use-after-scope " ` + "-fno-omit-frame-pointer -fno-optimize-sibling-calls" - #+ "-fsanitize=float-divide-by-zero " - #+ "-fsanitize=unsigned-integer-overflow -fsanitize=implicit-conversion -fsanitize=local-bounds -fsanitize=nullability " + + #+ "-fsanitize=unsigned-integer-overflow " + # -fsanitize=bounds-strict clang: error: unsupported argument 'bounds-strict' to option 'fsanitize=' (as opposed to gcc) # There should be no space after -D CMAKE_BUILD_TYPE= but if we provide the environment variable inline, without # the space it doesn't seem to get substituted... With invalid -D CMAKE_BUILD_TYPE argument cmake silently produces From a3300309f114c3548041cc5a8d78a9832fbe71e5 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 20:25:21 -0800 Subject: [PATCH 13/31] Build NS first, sanitizedrs optimization --- build/steps-codecheck.yml | 20 +++++++++---------- src/Qir/Runtime/test-qir-runtime.ps1 | 2 +- src/Qir/Samples/test-qir-samples.ps1 | 2 +- src/Qir/Tests/test-qir-tests.ps1 | 2 +- .../Native/build-native-simulator.ps1 | 4 +++- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/build/steps-codecheck.yml b/build/steps-codecheck.yml index fe474e3ccbf..eb0064468df 100644 --- a/build/steps-codecheck.yml +++ b/build/steps-codecheck.yml @@ -8,6 +8,16 @@ steps: inputs: versionSpec: '5.6.0' + # Native Simulator (needed to build and run the QIR tests): +- pwsh: src/Simulation/Native/prerequisites.ps1 + displayName: "Install Native Simulator Prerequisites" + workingDirectory: $(System.DefaultWorkingDirectory) + +- powershell: | + .\build-native-simulator.ps1 + displayName: "Build Native Simulator" + workingDirectory: $(System.DefaultWorkingDirectory)/src/Simulation/Native + # QIR Runtime: - pwsh: src/Qir/Runtime/prerequisites.ps1 displayName: "Install QIR Runtime Prerequisites" @@ -21,16 +31,6 @@ steps: displayName: "Test QIR Runtime" workingDirectory: $(System.DefaultWorkingDirectory) - # Native Simulator (needed to build and run the QIR tests): -- pwsh: src/Simulation/Native/prerequisites.ps1 - displayName: "Install Native Simulator Prerequisites" - workingDirectory: $(System.DefaultWorkingDirectory) - -- powershell: | - .\build-native-simulator.ps1 - displayName: "Build Native Simulator" - workingDirectory: $(System.DefaultWorkingDirectory)/src/Simulation/Native - # QIR Tests: - pwsh: src/Qir/Tests/build-qir-tests.ps1 displayName: "Build QIR Tests" diff --git a/src/Qir/Runtime/test-qir-runtime.ps1 b/src/Qir/Runtime/test-qir-runtime.ps1 index b99a21ddf06..bb621524c56 100644 --- a/src/Qir/Runtime/test-qir-runtime.ps1 +++ b/src/Qir/Runtime/test-qir-runtime.ps1 @@ -6,7 +6,7 @@ # TODO: `ASAN_OPTIONS=check_initialization_order=1` (https://clang.llvm.org/docs/AddressSanitizer.html#initialization-order-checking). # TODO: macOS: `ASAN_OPTIONS=detect_leaks=1` (https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection). -$env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:print_stats=true:" ` +$env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` + "detect_invalid_pointer_pairs=2:detect_invalid_pointer_pairs=2" diff --git a/src/Qir/Samples/test-qir-samples.ps1 b/src/Qir/Samples/test-qir-samples.ps1 index 98f33f9c63d..244b907da95 100644 --- a/src/Qir/Samples/test-qir-samples.ps1 +++ b/src/Qir/Samples/test-qir-samples.ps1 @@ -5,7 +5,7 @@ # TODO: `ASAN_OPTIONS=check_initialization_order=1` (https://clang.llvm.org/docs/AddressSanitizer.html#initialization-order-checking). # TODO: macOS: `ASAN_OPTIONS=detect_leaks=1` (https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection). -$env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:print_stats=true:" ` +$env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` + "detect_invalid_pointer_pairs=2:detect_invalid_pointer_pairs=2" diff --git a/src/Qir/Tests/test-qir-tests.ps1 b/src/Qir/Tests/test-qir-tests.ps1 index ef526b1f848..3693b48bf9c 100644 --- a/src/Qir/Tests/test-qir-tests.ps1 +++ b/src/Qir/Tests/test-qir-tests.ps1 @@ -24,7 +24,7 @@ if ($Env:BUILD_CONFIGURATION -eq "Debug") #{ # $env:ASAN_OPTIONS += "detect_leaks=1" # https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection #} - $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:print_stats=true:" ` + $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` + "detect_invalid_pointer_pairs=2:detect_invalid_pointer_pairs=2" } diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 522b3328588..5f72696ef55 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -22,10 +22,12 @@ $SANITIZE_FLAGS=` + "-fsanitize=implicit-conversion -fsanitize=local-bounds -fsanitize=nullability " ` ` + "-fsanitize=address " ` - + "-fsanitize=pointer-compare -fsanitize=pointer-subtract " ` + + "-fsanitize=pointer-subtract " ` + "-fsanitize-address-use-after-scope " ` + "-fno-omit-frame-pointer -fno-optimize-sibling-calls" + # -fsanitize=pointer-compare Results in this? https://dev.azure.com/ms-quantum-public/Microsoft%20Quantum%20(public)/_build/results?buildId=35947&view=logs&j=2f953adc-c56d-55c4-a64a-eab7c4b02235&t=0add2ae9-6315-517a-e27a-74c6ff583129&l=71 + #+ "-fsanitize=unsigned-integer-overflow " # -fsanitize=bounds-strict clang: error: unsupported argument 'bounds-strict' to option 'fsanitize=' (as opposed to gcc) From c9f75fa72fac57d728291662f806c404e947fd07 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 24 Nov 2021 20:44:40 -0800 Subject: [PATCH 14/31] Corrected the sanitizers. --- src/Qir/Runtime/test-qir-runtime.ps1 | 2 +- src/Qir/Samples/test-qir-samples.ps1 | 2 +- src/Qir/Tests/test-qir-tests.ps1 | 5 +++-- src/Simulation/Native/build-native-simulator.ps1 | 4 +--- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Qir/Runtime/test-qir-runtime.ps1 b/src/Qir/Runtime/test-qir-runtime.ps1 index bb621524c56..9abdee94ad3 100644 --- a/src/Qir/Runtime/test-qir-runtime.ps1 +++ b/src/Qir/Runtime/test-qir-runtime.ps1 @@ -8,7 +8,7 @@ $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` - + "detect_invalid_pointer_pairs=2:detect_invalid_pointer_pairs=2" + + "detect_invalid_pointer_pairs=2" if (-not (Test-CTest (Join-Path $PSScriptRoot bin $Env:BUILD_CONFIGURATION unittests) "QIR Runtime")) { throw "At least one project failed testing. Check the logs." diff --git a/src/Qir/Samples/test-qir-samples.ps1 b/src/Qir/Samples/test-qir-samples.ps1 index 244b907da95..617a036f48d 100644 --- a/src/Qir/Samples/test-qir-samples.ps1 +++ b/src/Qir/Samples/test-qir-samples.ps1 @@ -7,7 +7,7 @@ # TODO: macOS: `ASAN_OPTIONS=detect_leaks=1` (https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection). $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` - + "detect_invalid_pointer_pairs=2:detect_invalid_pointer_pairs=2" + + "detect_invalid_pointer_pairs=2" if (-not (Test-CTest (Join-Path $PSScriptRoot bin $Env:BUILD_CONFIGURATION StandaloneInputReference) "QIR Samples (StandaloneInputReference)")) { throw "At least one project failed testing. Check the logs." diff --git a/src/Qir/Tests/test-qir-tests.ps1 b/src/Qir/Tests/test-qir-tests.ps1 index 3693b48bf9c..66dd468225d 100644 --- a/src/Qir/Tests/test-qir-tests.ps1 +++ b/src/Qir/Tests/test-qir-tests.ps1 @@ -25,8 +25,9 @@ if ($Env:BUILD_CONFIGURATION -eq "Debug") # $env:ASAN_OPTIONS += "detect_leaks=1" # https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection #} $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` - + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` - + "detect_invalid_pointer_pairs=2:detect_invalid_pointer_pairs=2" + + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true" + + # + "detect_invalid_pointer_pairs=2" TODO(rokuzmin): ==8218==ERROR: AddressSanitizer: invalid-pointer-pair: 0x602000000af4 0x602000000af0 } } diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 5f72696ef55..522b3328588 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -22,12 +22,10 @@ $SANITIZE_FLAGS=` + "-fsanitize=implicit-conversion -fsanitize=local-bounds -fsanitize=nullability " ` ` + "-fsanitize=address " ` - + "-fsanitize=pointer-subtract " ` + + "-fsanitize=pointer-compare -fsanitize=pointer-subtract " ` + "-fsanitize-address-use-after-scope " ` + "-fno-omit-frame-pointer -fno-optimize-sibling-calls" - # -fsanitize=pointer-compare Results in this? https://dev.azure.com/ms-quantum-public/Microsoft%20Quantum%20(public)/_build/results?buildId=35947&view=logs&j=2f953adc-c56d-55c4-a64a-eab7c4b02235&t=0add2ae9-6315-517a-e27a-74c6ff583129&l=71 - #+ "-fsanitize=unsigned-integer-overflow " # -fsanitize=bounds-strict clang: error: unsupported argument 'bounds-strict' to option 'fsanitize=' (as opposed to gcc) From 516b0bde26c34592857edbdca34f55b4b8322f93 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 29 Nov 2021 14:08:38 -0800 Subject: [PATCH 15/31] Switched NS on Win to clang. --- .../Native/build-native-simulator.ps1 | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 522b3328588..ae501ae9561 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -34,9 +34,23 @@ $SANITIZE_FLAGS=` # a DEBUG build. if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Win")))) { - Write-Host "On Windows build native simulator using the default C/C++ compiler (should be MSVC)" - cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. - # TODO(rokuzmin): Switch to clang. + #Write-Host "On Windows build native simulator using the default C/C++ compiler (should be MSVC)" + + $CMAKE_C_COMPILER = "-DCMAKE_C_COMPILER=clang.exe" + $CMAKE_CXX_COMPILER = "-DCMAKE_CXX_COMPILER=clang++.exe" + + if ((!(Get-Command clang -ErrorAction SilentlyContinue) -and (choco find --idonly -l llvm) -contains "llvm") -or ` + (Test-Path Env:/AGENT_OS)) { + # LLVM was installed by Chocolatey, so add the install location to the path. + $env:PATH = "$($env:SystemDrive)\Program Files\LLVM\bin;$env:Path" + } + + #cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" ` + # -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + #cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER $clangTidy -D CMAKE_BUILD_TYPE="$buildType" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" ../.. | Write-Host + cmake $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + + # TODO(rokuzmin): Switch to clang, install prereqs (choco?). } elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) { From e4d01061b85b860aaf5baed53c4f8e20abc1d8f6 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Mon, 29 Nov 2021 18:19:15 -0800 Subject: [PATCH 16/31] Got NS compiled with clang on Win. --- src/Simulation/Native/CMakeLists.txt | 26 ++++++++-------- .../Native/build-native-simulator.ps1 | 3 +- src/Simulation/Native/src/CMakeLists.txt | 30 +++++++++++-------- .../Native/src/simulator/CMakeLists.txt | 19 ++++++++++++ 4 files changed, 51 insertions(+), 27 deletions(-) diff --git a/src/Simulation/Native/CMakeLists.txt b/src/Simulation/Native/CMakeLists.txt index 84189daea30..0c0fb9430d8 100644 --- a/src/Simulation/Native/CMakeLists.txt +++ b/src/Simulation/Native/CMakeLists.txt @@ -33,19 +33,19 @@ option(HAVE_INTRINSICS "Have AVX intrinsics" OFF) option(USE_GATE_FUSION "Use gate fusion" ON) # windows specific flags -if (MSVC) - # always create debug info - add_definitions("/Zi") - add_definitions("/Z7") - - # build with no VC runtime depedencies: - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT /Qspectre /guard:cf /Zi /Z7") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd /Qspectre /guard:cf") - set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG") - # TODO(rokuzmin): Switch to clang. -# else (MSVC) -# set(CMAKE_CXX_FLAGS "-static-libgcc") -endif (MSVC) +# if (MSVC) +# # always create debug info +# add_definitions("/Zi") +# add_definitions("/Z7") + +# # build with no VC runtime depedencies: +# set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT /Qspectre /guard:cf /Zi /Z7") +# set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd /Qspectre /guard:cf") +# set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG") +# # TODO(rokuzmin): Switch to clang. +# # else (MSVC) +# # set(CMAKE_CXX_FLAGS "-static-libgcc") +# endif (MSVC) include_directories(${PROJECT_BINARY_DIR}/src) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index ae501ae9561..ec9c2067fd2 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -48,7 +48,8 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W #cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" ` # -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. #cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER $clangTidy -D CMAKE_BUILD_TYPE="$buildType" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" ../.. | Write-Host - cmake $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + # Without `-G Ninja` fail to switch from MSVC to Clang. # TODO(rokuzmin): Switch to clang, install prereqs (choco?). } diff --git a/src/Simulation/Native/src/CMakeLists.txt b/src/Simulation/Native/src/CMakeLists.txt index dbbda28611f..f24fb30d834 100644 --- a/src/Simulation/Native/src/CMakeLists.txt +++ b/src/Simulation/Native/src/CMakeLists.txt @@ -2,17 +2,17 @@ # Licensed under the MIT License. # AVX -if (MSVC) -set(AVXFLAGS "/arch:AVX" ) -set(AVX2FLAGS "/arch:AVX2" ) -set(AVX512FLAGS "/arch:AVX512" ) -set(FMAFLAGS "") -else(MSVC) -SET(AVXFLAGS "-mavx") +# if (MSVC) +# set(AVXFLAGS "/arch:AVX" ) +# set(AVX2FLAGS "/arch:AVX2" ) +# set(AVX512FLAGS "/arch:AVX512" ) +# set(FMAFLAGS "") +# else(MSVC) +set(AVXFLAGS "-mavx") set(AVX2FLAGS "-mfma -mavx2") set(AVX512FLAGS "-mfma -mavx512f -mavx512cd") set(FMAFLAGS ) -endif(MSVC) +# endif(MSVC) configure_file(config.hpp.in ${PROJECT_BINARY_DIR}/src/config.hpp) configure_file(version.hpp.in ${PROJECT_BINARY_DIR}/src/version.hpp) @@ -23,20 +23,24 @@ add_subdirectory(simulator) set(SOURCES simulator/factory.cpp simulator/capi.cpp simulator/simulator.cpp util/openmp.cpp simulator/simulatoravx.cpp simulator/simulatoravx2.cpp simulator/simulatoravx512.cpp ) if(BUILD_SHARED_LIBS) add_library(Microsoft.Quantum.Simulator.Runtime SHARED ${SOURCES}) + set_source_files_properties(simulator/capi.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) + set_source_files_properties(simulator/simulator.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) set_source_files_properties(simulator/simulatoravx.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) -if (MSVC) +# if (MSVC) +# set_source_files_properties(simulator/simulatoravx2.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX2FLAGS}) +# set_source_files_properties(simulator/simulatoravx512.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX512FLAGS}) +# else(MSVC) set_source_files_properties(simulator/simulatoravx2.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX2FLAGS}) set_source_files_properties(simulator/simulatoravx512.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX512FLAGS}) -else(MSVC) -set_source_files_properties(simulator/simulatoravx2.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX2FLAGS}) -set_source_files_properties(simulator/simulatoravx512.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX512FLAGS}) -endif(MSVC) +# endif(MSVC) message (STATUS "Building shared library") target_compile_definitions(Microsoft.Quantum.Simulator.Runtime PRIVATE BUILD_DLL=1) set_target_properties(Microsoft.Quantum.Simulator.Runtime PROPERTIES POSITION_INDEPENDENT_CODE TRUE) else(BUILD_SHARED_LIBS) message (STATUS "Building static library") add_library(Microsoft.Quantum.Simulator.Runtime STATIC ${SOURCES}) + set_source_files_properties(simulator/capi.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) + set_source_files_properties(simulator/simulator.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) set_source_files_properties(simulator/simulatoravx.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) set_source_files_properties(simulator/simulatoravx2.cpp PROPERTIES COMPILE_FLAGS ${AVX2FLAGS}) set_source_files_properties(simulator/simulatoravx512.cpp PROPERTIES COMPILE_FLAGS ${AVX512FLAGS}) diff --git a/src/Simulation/Native/src/simulator/CMakeLists.txt b/src/Simulation/Native/src/simulator/CMakeLists.txt index d8b7a391013..386cba16a64 100644 --- a/src/Simulation/Native/src/simulator/CMakeLists.txt +++ b/src/Simulation/Native/src/simulator/CMakeLists.txt @@ -1,6 +1,14 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. +### +set(AVXFLAGS "-mavx") +set(AVX2FLAGS "-mfma -mavx2") +set(AVX512FLAGS "-mfma -mavx512f -mavx512cd") +set(FMAFLAGS ) + +### + add_executable(factory_test factory_test.cpp) target_link_libraries(factory_test Microsoft.Quantum.Simulator.Runtime) add_test(NAME factory_test COMMAND ./factory_test WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) @@ -19,6 +27,17 @@ add_executable(quantum_simulator_unittests "${PROJECT_SOURCE_DIR}/src/catch2/catch_driver.cpp" local_test.cpp ) +set_source_files_properties(local_test.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) +### +# set(SOURCES simulator/factory.cpp simulator/capi.cpp simulator/simulator.cpp util/openmp.cpp simulator/simulatoravx.cpp simulator/simulatoravx2.cpp simulator/simulatoravx512.cpp ) +# if(BUILD_SHARED_LIBS) +# add_library(Microsoft.Quantum.Simulator.Runtime SHARED ${SOURCES}) +# set_source_files_properties(simulator/capi.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) +# set_source_files_properties(simulator/simulator.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) +### + + + target_link_libraries(quantum_simulator_unittests PUBLIC Microsoft.Quantum.Simulator.Runtime From 27ed6f8021a89ae1f5787ff07e20b9479a946d55 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Tue, 30 Nov 2021 12:07:17 -0800 Subject: [PATCH 17/31] NS tests pass (`pwsh src/Simulation/Native/test-native-simulator.ps1`). --- .../lib/Simulators/FullstateSimulator.cpp | 1 + src/Simulation/Native/CMakeLists.txt | 6 ++++++ .../Native/build-native-simulator.ps1 | 20 +++++++++++++------ src/Simulation/Native/src/util/bitops.hpp | 16 +++++++-------- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp b/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp index 93836936317..19677c953cd 100644 --- a/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp +++ b/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp @@ -54,6 +54,7 @@ QUANTUM_SIMULATOR LoadQuantumSimulator() QUANTUM_SIMULATOR handle = nullptr; #ifdef _WIN32 handle = ::LoadLibraryA(FULLSTATESIMULATORLIB); + // handle = ::dlopen(FULLSTATESIMULATORLIB, RTLD_LAZY); if (handle == nullptr) { throw std::runtime_error(std::string("Failed to load ") + FULLSTATESIMULATORLIB + diff --git a/src/Simulation/Native/CMakeLists.txt b/src/Simulation/Native/CMakeLists.txt index 0c0fb9430d8..5fed97ac7e4 100644 --- a/src/Simulation/Native/CMakeLists.txt +++ b/src/Simulation/Native/CMakeLists.txt @@ -47,6 +47,12 @@ option(USE_GATE_FUSION "Use gate fusion" ON) # # set(CMAKE_CXX_FLAGS "-static-libgcc") # endif (MSVC) +# TODO(rokuzmin): Add Spectre mitigations. +# # Always use available Spectre mitigations where available +# if (NOT APPLE) +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mspeculative-load-hardening -mretpoline") +# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mspeculative-load-hardening -mretpoline") +# endif() include_directories(${PROJECT_BINARY_DIR}/src) include_directories(${PROJECT_SOURCE_DIR}/src) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index ec9c2067fd2..87f7c0f279f 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -18,7 +18,7 @@ $SANITIZE_FLAGS=` + "-fsanitize=vla-bound -fsanitize=null -fsanitize=return " ` + "-fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=object-size " ` + "-fsanitize=float-cast-overflow -fsanitize=nonnull-attribute -fsanitize=returns-nonnull-attribute -fsanitize=bool -fsanitize=enum " ` - + "-fsanitize=vptr -fsanitize=pointer-overflow -fsanitize=builtin " ` + + "-fsanitize=pointer-overflow -fsanitize=builtin " ` + "-fsanitize=implicit-conversion -fsanitize=local-bounds -fsanitize=nullability " ` ` + "-fsanitize=address " ` @@ -29,6 +29,10 @@ $SANITIZE_FLAGS=` #+ "-fsanitize=unsigned-integer-overflow " # -fsanitize=bounds-strict clang: error: unsupported argument 'bounds-strict' to option 'fsanitize=' (as opposed to gcc) +$NON_WIN_SANITIZE_FLAGS=` + "-fsanitize=vptr " + + # There should be no space after -D CMAKE_BUILD_TYPE= but if we provide the environment variable inline, without # the space it doesn't seem to get substituted... With invalid -D CMAKE_BUILD_TYPE argument cmake silently produces # a DEBUG build. @@ -48,17 +52,21 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W #cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" ` # -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. #cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER $clangTidy -D CMAKE_BUILD_TYPE="$buildType" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" ../.. | Write-Host - cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" ` + -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # Without `-G Ninja` fail to switch from MSVC to Clang. + # -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" + # -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" + # TODO(rokuzmin): Switch to clang, install prereqs (choco?). } elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) { Write-Host "On Linux build native simulator using gcc (needed for OpenMP)" cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=clang-11 -D CMAKE_CXX_COMPILER=clang++-11 ` - -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" ` - -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" ` + -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` + -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # TODO(rokuzmin): Updte prerequisites. } @@ -76,8 +84,8 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( -D OpenMP_CXX_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_CXX_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_C_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_C_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_omp_LIBRARY=$OPENMP_PATH/lib/libomp.dylib ` - -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" ` - -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" ` + -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` + -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # TODO(rokuzmin): Updte prerequisites. } diff --git a/src/Simulation/Native/src/util/bitops.hpp b/src/Simulation/Native/src/util/bitops.hpp index 9275d5fcb1f..db6fe123e67 100644 --- a/src/Simulation/Native/src/util/bitops.hpp +++ b/src/Simulation/Native/src/util/bitops.hpp @@ -24,17 +24,17 @@ namespace Quantum template unsigned ilog2(Int n) { -#ifdef _WIN32 - for (unsigned width = 0; width < 8 * sizeof(Int); ++width) - if ((static_cast(1) << width) == n) return width; - // not a power of 2 - assert(false); - return std::numeric_limits::max(); // dummy return -#else +// #ifdef _WIN32 +// for (unsigned width = 0; width < 8 * sizeof(Int); ++width) +// if ((static_cast(1) << width) == n) return width; +// // not a power of 2 +// assert(false); +// return std::numeric_limits::max(); // dummy return +// #else unsigned l = _bit_scan_reverse(n); assert(n == (Int(1) << l)); return l; -#endif +// #endif } // bit count From 396b6e3fbff04ddaac5bffbd911c7bf7836480ff Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Tue, 30 Nov 2021 21:00:34 -0800 Subject: [PATCH 18/31] Tests pass (pwsh src/Qir/Tests/test-qir-tests.ps1). --- src/Qir/Runtime/public/QubitManager.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Qir/Runtime/public/QubitManager.hpp b/src/Qir/Runtime/public/QubitManager.hpp index 1d1bda589db..d637d7d0838 100644 --- a/src/Qir/Runtime/public/QubitManager.hpp +++ b/src/Qir/Runtime/public/QubitManager.hpp @@ -40,7 +40,7 @@ namespace Quantum // No complex scenarios for now. Don't need to support copying/moving. CQubitManager(const CQubitManager&) = delete; CQubitManager& operator=(const CQubitManager&) = delete; - virtual ~CQubitManager(); + /* virtual */ ~CQubitManager(); // Restricted reuse area control void StartRestrictedReuseArea(); From 179f7a6bea290a42097681dbee41ef2c72abb0ea Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 1 Dec 2021 10:53:57 -0800 Subject: [PATCH 19/31] Updated prereqs, minor clean-up. --- build/ci.yml | 80 +++++++++---------- .../Native/build-native-simulator.ps1 | 8 +- src/Simulation/Native/prerequisites.ps1 | 25 +++++- .../Native/src/simulator/CMakeLists.txt | 16 ---- 4 files changed, 64 insertions(+), 65 deletions(-) diff --git a/build/ci.yml b/build/ci.yml index 99db278a661..4e60039fd26 100644 --- a/build/ci.yml +++ b/build/ci.yml @@ -1,47 +1,47 @@ -# name: $(Build.Major).$(Build.Minor).$(date:yyMM).$(DayOfMonth)$(rev:rr) +name: $(Build.Major).$(Build.Minor).$(date:yyMM).$(DayOfMonth)$(rev:rr) -# trigger: none +trigger: none -# pr: -# - main -# - feature/* -# - features/* -# - release/* +pr: +- main +- feature/* +- features/* +- release/* -# schedules: -# - cron: "0 9 * * Sat" -# displayName: 'Build for Component Governance' -# branches: -# include: -# - main -# always: true +schedules: +- cron: "0 9 * * Sat" + displayName: 'Build for Component Governance' + branches: + include: + - main + always: true -# variables: -# Build.Major: 0 -# Build.Minor: 16 -# Drops.Dir: $(Build.ArtifactStagingDirectory)/drops -# Drop.Native: $(System.DefaultWorkingDirectory)/xplat -# CI: "true" +variables: + Build.Major: 0 + Build.Minor: 16 + Drops.Dir: $(Build.ArtifactStagingDirectory)/drops + Drop.Native: $(System.DefaultWorkingDirectory)/xplat + CI: "true" -# jobs: -# - job: build -# displayName: Build -# strategy: -# matrix: -# linux: -# imageName: 'ubuntu-latest' -# mac: -# imageName: 'macOS-10.15' -# windows: -# imageName: 'windows-latest' -# pool: -# vmImage: $(imageName) -# timeoutInMinutes: 90 +jobs: +- job: build + displayName: Build + strategy: + matrix: + linux: + imageName: 'ubuntu-latest' + mac: + imageName: 'macOS-latest' + windows: + imageName: 'windows-latest' + pool: + vmImage: $(imageName) + timeoutInMinutes: 90 -# steps: -# - template: steps.yml + steps: + - template: steps.yml -# - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 -# displayName: 'Component Detection' -# inputs: -# failOnAlert: true + - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: 'Component Detection' + inputs: + failOnAlert: true diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 87f7c0f279f..ab7196e0f5d 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -55,11 +55,6 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" ` -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. # Without `-G Ninja` fail to switch from MSVC to Clang. - - # -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" - # -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" - - # TODO(rokuzmin): Switch to clang, install prereqs (choco?). } elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) { @@ -68,7 +63,6 @@ elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. - # TODO(rokuzmin): Updte prerequisites. } elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Darwin")))) { @@ -76,6 +70,7 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( # # `gcc`on Darwin seems to be a shim that redirects to AppleClang, to get real gcc, must point to the specific # # version of gcc we've installed. # # cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. + Write-Host "On MacOS build using the default C/C++ compiler (should be AppleClang)" $OPENMP_PATH="/usr/local/opt/libomp" $OPENMP_COMPILER_FLAGS="-Xpreprocessor -fopenmp -I$OPENMP_PATH/include -lomp -L$OPENMP_PATH/lib" @@ -87,7 +82,6 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. - # TODO(rokuzmin): Updte prerequisites. } else { cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. diff --git a/src/Simulation/Native/prerequisites.ps1 b/src/Simulation/Native/prerequisites.ps1 index f82c005c01f..902012d0724 100644 --- a/src/Simulation/Native/prerequisites.ps1 +++ b/src/Simulation/Native/prerequisites.ps1 @@ -10,8 +10,29 @@ if (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Dar # brew update # brew install gcc@7 brew install libomp -} else { - Write-Host "No pre-reqs for building native simulator on platforms other than MacOS" +} elseif (($IsWindows) -or ((Test-Path Env:/AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Win")))) { + if (!(Get-Command clang -ErrorAction SilentlyContinue) -or ` + (Test-Path Env:/AGENT_OS)) { + choco install llvm --version=11.1.0 --allow-downgrade + Write-Host "##vso[task.setvariable variable=PATH;]$($env:SystemDrive)\Program Files\LLVM\bin;$Env:PATH" + } + if (!(Get-Command ninja -ErrorAction SilentlyContinue)) { + choco install ninja + } + if (!(Get-Command cmake -ErrorAction SilentlyContinue)) { + choco install cmake + } + refreshenv +} +else { + # Write-Host "No pre-reqs for building native simulator on platforms other than MacOS" + if (Get-Command sudo -ErrorAction SilentlyContinue) { + sudo apt update + sudo apt-get install -y clang-11 + } else { + apt update + apt-get install -y clang-11 + } } diff --git a/src/Simulation/Native/src/simulator/CMakeLists.txt b/src/Simulation/Native/src/simulator/CMakeLists.txt index 386cba16a64..d838c545bea 100644 --- a/src/Simulation/Native/src/simulator/CMakeLists.txt +++ b/src/Simulation/Native/src/simulator/CMakeLists.txt @@ -1,13 +1,7 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -### set(AVXFLAGS "-mavx") -set(AVX2FLAGS "-mfma -mavx2") -set(AVX512FLAGS "-mfma -mavx512f -mavx512cd") -set(FMAFLAGS ) - -### add_executable(factory_test factory_test.cpp) target_link_libraries(factory_test Microsoft.Quantum.Simulator.Runtime) @@ -28,16 +22,6 @@ add_executable(quantum_simulator_unittests local_test.cpp ) set_source_files_properties(local_test.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) -### -# set(SOURCES simulator/factory.cpp simulator/capi.cpp simulator/simulator.cpp util/openmp.cpp simulator/simulatoravx.cpp simulator/simulatoravx2.cpp simulator/simulatoravx512.cpp ) -# if(BUILD_SHARED_LIBS) -# add_library(Microsoft.Quantum.Simulator.Runtime SHARED ${SOURCES}) -# set_source_files_properties(simulator/capi.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) -# set_source_files_properties(simulator/simulator.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) -### - - - target_link_libraries(quantum_simulator_unittests PUBLIC Microsoft.Quantum.Simulator.Runtime From 8c15d882ebdbb8e4be6373e2c4cb40b1a47cf9c3 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 1 Dec 2021 11:57:48 -0800 Subject: [PATCH 20/31] Minor clean-up. --- src/Simulation/Native/build-native-simulator.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index ab7196e0f5d..cd9ff473950 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -58,7 +58,6 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W } elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) { - Write-Host "On Linux build native simulator using gcc (needed for OpenMP)" cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=clang-11 -D CMAKE_CXX_COMPILER=clang++-11 ` -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` From e19cf94b2d1a7764e8c9dad06524de61847b8a1b Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 1 Dec 2021 15:23:28 -0800 Subject: [PATCH 21/31] Canceled the win change in src/Simulation/Native/src/util/bitops.hpp. --- src/Simulation/Native/src/util/bitops.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Simulation/Native/src/util/bitops.hpp b/src/Simulation/Native/src/util/bitops.hpp index db6fe123e67..9275d5fcb1f 100644 --- a/src/Simulation/Native/src/util/bitops.hpp +++ b/src/Simulation/Native/src/util/bitops.hpp @@ -24,17 +24,17 @@ namespace Quantum template unsigned ilog2(Int n) { -// #ifdef _WIN32 -// for (unsigned width = 0; width < 8 * sizeof(Int); ++width) -// if ((static_cast(1) << width) == n) return width; -// // not a power of 2 -// assert(false); -// return std::numeric_limits::max(); // dummy return -// #else +#ifdef _WIN32 + for (unsigned width = 0; width < 8 * sizeof(Int); ++width) + if ((static_cast(1) << width) == n) return width; + // not a power of 2 + assert(false); + return std::numeric_limits::max(); // dummy return +#else unsigned l = _bit_scan_reverse(n); assert(n == (Int(1) << l)); return l; -// #endif +#endif } // bit count From 528e70ace3bea68ea481b22f40c23eecda3ee808 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Wed, 1 Dec 2021 19:27:44 -0800 Subject: [PATCH 22/31] Got test working `Tests.Microsoft.Quantum.Simulators/Microsoft.Quantum.Simulation.Simulators.Tests/QuantumSimulatorTests/ZeroStateQubitReleaseTest`. Likely Clang-11 issue (on Win and Linux) as opposed to AppleClang 13.0.0.13000029 (on Mac). Consider migrating to Clang-13 and reverting this change. --- src/Simulation/Native/src/simulator/kernels.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simulation/Native/src/simulator/kernels.hpp b/src/Simulation/Native/src/simulator/kernels.hpp index 3311bb27f8c..3d4c7331d6a 100644 --- a/src/Simulation/Native/src/simulator/kernels.hpp +++ b/src/Simulation/Native/src/simulator/kernels.hpp @@ -74,7 +74,7 @@ template unsigned getvalue( std::vector, A> const& wfn, unsigned q, - double eps = 100. * std::numeric_limits::epsilon()) + double eps = 100. * std::numeric_limits::epsilon()) __attribute__((noinline)) { std::size_t mask = 1ull << q; for (std::size_t i = 0; i < wfn.size(); ++i) From f392121b8c6005605f6c154151194afd13814509 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Thu, 2 Dec 2021 12:06:48 -0800 Subject: [PATCH 23/31] Minor clean-up. --- build/steps-codecheck.yml | 20 ++++++++-------- .../lib/Simulators/FullstateSimulator.cpp | 1 - src/Qir/Tests/test-qir-tests.ps1 | 2 +- .../Native/build-native-simulator.ps1 | 23 +++++++++---------- src/Simulation/Native/prerequisites.ps1 | 8 ------- src/Simulation/Native/src/CMakeLists.txt | 16 ++----------- 6 files changed, 24 insertions(+), 46 deletions(-) diff --git a/build/steps-codecheck.yml b/build/steps-codecheck.yml index eb0064468df..fe474e3ccbf 100644 --- a/build/steps-codecheck.yml +++ b/build/steps-codecheck.yml @@ -8,16 +8,6 @@ steps: inputs: versionSpec: '5.6.0' - # Native Simulator (needed to build and run the QIR tests): -- pwsh: src/Simulation/Native/prerequisites.ps1 - displayName: "Install Native Simulator Prerequisites" - workingDirectory: $(System.DefaultWorkingDirectory) - -- powershell: | - .\build-native-simulator.ps1 - displayName: "Build Native Simulator" - workingDirectory: $(System.DefaultWorkingDirectory)/src/Simulation/Native - # QIR Runtime: - pwsh: src/Qir/Runtime/prerequisites.ps1 displayName: "Install QIR Runtime Prerequisites" @@ -31,6 +21,16 @@ steps: displayName: "Test QIR Runtime" workingDirectory: $(System.DefaultWorkingDirectory) + # Native Simulator (needed to build and run the QIR tests): +- pwsh: src/Simulation/Native/prerequisites.ps1 + displayName: "Install Native Simulator Prerequisites" + workingDirectory: $(System.DefaultWorkingDirectory) + +- powershell: | + .\build-native-simulator.ps1 + displayName: "Build Native Simulator" + workingDirectory: $(System.DefaultWorkingDirectory)/src/Simulation/Native + # QIR Tests: - pwsh: src/Qir/Tests/build-qir-tests.ps1 displayName: "Build QIR Tests" diff --git a/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp b/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp index 19677c953cd..93836936317 100644 --- a/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp +++ b/src/Qir/Runtime/lib/Simulators/FullstateSimulator.cpp @@ -54,7 +54,6 @@ QUANTUM_SIMULATOR LoadQuantumSimulator() QUANTUM_SIMULATOR handle = nullptr; #ifdef _WIN32 handle = ::LoadLibraryA(FULLSTATESIMULATORLIB); - // handle = ::dlopen(FULLSTATESIMULATORLIB, RTLD_LAZY); if (handle == nullptr) { throw std::runtime_error(std::string("Failed to load ") + FULLSTATESIMULATORLIB + diff --git a/src/Qir/Tests/test-qir-tests.ps1 b/src/Qir/Tests/test-qir-tests.ps1 index 66dd468225d..4024cc11a75 100644 --- a/src/Qir/Tests/test-qir-tests.ps1 +++ b/src/Qir/Tests/test-qir-tests.ps1 @@ -27,7 +27,7 @@ if ($Env:BUILD_CONFIGURATION -eq "Debug") $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true" - # + "detect_invalid_pointer_pairs=2" TODO(rokuzmin): ==8218==ERROR: AddressSanitizer: invalid-pointer-pair: 0x602000000af4 0x602000000af0 + # + "detect_invalid_pointer_pairs=2" TODO(rokuzmin, #883): ==8218==ERROR: AddressSanitizer: invalid-pointer-pair: 0x602000000af4 0x602000000af0 } } diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index cd9ff473950..1d796712cfe 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -10,6 +10,9 @@ if (-not (Test-Path $nativeBuild)) { } Push-Location $nativeBuild +# Search for "sanitize" in +# https://clang.llvm.org/docs/ClangCommandLineReference.html +# https://man7.org/linux/man-pages/man1/gcc.1.html $SANITIZE_FLAGS=` "-fsanitize=undefined " ` + "-fsanitize=shift -fsanitize=shift-base " ` @@ -18,7 +21,7 @@ $SANITIZE_FLAGS=` + "-fsanitize=vla-bound -fsanitize=null -fsanitize=return " ` + "-fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=object-size " ` + "-fsanitize=float-cast-overflow -fsanitize=nonnull-attribute -fsanitize=returns-nonnull-attribute -fsanitize=bool -fsanitize=enum " ` - + "-fsanitize=pointer-overflow -fsanitize=builtin " ` + + "-fsanitize=vptr -fsanitize=pointer-overflow -fsanitize=builtin " ` + "-fsanitize=implicit-conversion -fsanitize=local-bounds -fsanitize=nullability " ` ` + "-fsanitize=address " ` @@ -26,12 +29,8 @@ $SANITIZE_FLAGS=` + "-fsanitize-address-use-after-scope " ` + "-fno-omit-frame-pointer -fno-optimize-sibling-calls" - #+ "-fsanitize=unsigned-integer-overflow " - # -fsanitize=bounds-strict clang: error: unsupported argument 'bounds-strict' to option 'fsanitize=' (as opposed to gcc) - -$NON_WIN_SANITIZE_FLAGS=` - "-fsanitize=vptr " - + #+ "-fsanitize=unsigned-integer-overflow " # TODO(rokuzmin, #884): Disable this option for _specific_ lines + # of code, but not for the whole binary. # There should be no space after -D CMAKE_BUILD_TYPE= but if we provide the environment variable inline, without # the space it doesn't seem to get substituted... With invalid -D CMAKE_BUILD_TYPE argument cmake silently produces @@ -54,13 +53,13 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W #cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER $clangTidy -D CMAKE_BUILD_TYPE="$buildType" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" ../.. | Write-Host cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" ` -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. - # Without `-G Ninja` fail to switch from MSVC to Clang. + # Without `-G Ninja` we fail to switch from MSVC to Clang. } elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) { cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=clang-11 -D CMAKE_CXX_COMPILER=clang++-11 ` - -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` - -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` + -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" ` + -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. } elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Darwin")))) @@ -78,8 +77,8 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( -D OpenMP_CXX_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_CXX_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_C_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_C_LIB_NAMES="$OPENMP_LIB_NAME" ` -D OpenMP_omp_LIBRARY=$OPENMP_PATH/lib/libomp.dylib ` - -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` - -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS $NON_WIN_SANITIZE_FLAGS" ` + -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" ` + -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. } else { diff --git a/src/Simulation/Native/prerequisites.ps1 b/src/Simulation/Native/prerequisites.ps1 index 902012d0724..4b7c2a72fc4 100644 --- a/src/Simulation/Native/prerequisites.ps1 +++ b/src/Simulation/Native/prerequisites.ps1 @@ -2,13 +2,6 @@ # Licensed under the MIT License. if (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Darwin")))) { - # # building with gcc-9 succeeds but some of the unit tests fail - # Write-Host "Install gcc-7 as pre-req for building native simulator on MacOS" - # # temporary workaround for Bintray sunset - # # remove this after Homebrew is updated to 3.1.1 on MacOS image, see: - # # https://github.com/actions/virtual-environments/blob/main/images/macos/macos-10.15-Readme.md - # brew update - # brew install gcc@7 brew install libomp } elseif (($IsWindows) -or ((Test-Path Env:/AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Win")))) { if (!(Get-Command clang -ErrorAction SilentlyContinue) -or ` @@ -25,7 +18,6 @@ if (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Dar refreshenv } else { - # Write-Host "No pre-reqs for building native simulator on platforms other than MacOS" if (Get-Command sudo -ErrorAction SilentlyContinue) { sudo apt update sudo apt-get install -y clang-11 diff --git a/src/Simulation/Native/src/CMakeLists.txt b/src/Simulation/Native/src/CMakeLists.txt index f24fb30d834..81a510f7e9e 100644 --- a/src/Simulation/Native/src/CMakeLists.txt +++ b/src/Simulation/Native/src/CMakeLists.txt @@ -2,17 +2,10 @@ # Licensed under the MIT License. # AVX -# if (MSVC) -# set(AVXFLAGS "/arch:AVX" ) -# set(AVX2FLAGS "/arch:AVX2" ) -# set(AVX512FLAGS "/arch:AVX512" ) -# set(FMAFLAGS "") -# else(MSVC) set(AVXFLAGS "-mavx") set(AVX2FLAGS "-mfma -mavx2") set(AVX512FLAGS "-mfma -mavx512f -mavx512cd") set(FMAFLAGS ) -# endif(MSVC) configure_file(config.hpp.in ${PROJECT_BINARY_DIR}/src/config.hpp) configure_file(version.hpp.in ${PROJECT_BINARY_DIR}/src/version.hpp) @@ -26,13 +19,8 @@ if(BUILD_SHARED_LIBS) set_source_files_properties(simulator/capi.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) set_source_files_properties(simulator/simulator.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) set_source_files_properties(simulator/simulatoravx.cpp PROPERTIES COMPILE_FLAGS ${AVXFLAGS}) -# if (MSVC) -# set_source_files_properties(simulator/simulatoravx2.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX2FLAGS}) -# set_source_files_properties(simulator/simulatoravx512.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX512FLAGS}) -# else(MSVC) -set_source_files_properties(simulator/simulatoravx2.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX2FLAGS}) -set_source_files_properties(simulator/simulatoravx512.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX512FLAGS}) -# endif(MSVC) + set_source_files_properties(simulator/simulatoravx2.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX2FLAGS}) + set_source_files_properties(simulator/simulatoravx512.cpp PROPERTIES COMPILE_FLAGS -mfma COMPILE_FLAGS ${AVX512FLAGS}) message (STATUS "Building shared library") target_compile_definitions(Microsoft.Quantum.Simulator.Runtime PRIVATE BUILD_DLL=1) set_target_properties(Microsoft.Quantum.Simulator.Runtime PROPERTIES POSITION_INDEPENDENT_CODE TRUE) From 2fd7b08513d5cb5a91fe59703e1936fe3a69daa3 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Thu, 2 Dec 2021 12:45:03 -0800 Subject: [PATCH 24/31] More clean-up. --- src/Qir/Runtime/public/QubitManager.hpp | 2 +- src/Simulation/Native/build-native-simulator.ps1 | 14 +++----------- src/Simulation/Native/src/simulator/kernels.hpp | 4 +++- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/Qir/Runtime/public/QubitManager.hpp b/src/Qir/Runtime/public/QubitManager.hpp index d637d7d0838..dc9c8ac12c9 100644 --- a/src/Qir/Runtime/public/QubitManager.hpp +++ b/src/Qir/Runtime/public/QubitManager.hpp @@ -40,7 +40,7 @@ namespace Quantum // No complex scenarios for now. Don't need to support copying/moving. CQubitManager(const CQubitManager&) = delete; CQubitManager& operator=(const CQubitManager&) = delete; - /* virtual */ ~CQubitManager(); + ~CQubitManager(); // Restricted reuse area control void StartRestrictedReuseArea(); diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 1d796712cfe..7588e6f28d5 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -37,8 +37,6 @@ $SANITIZE_FLAGS=` # a DEBUG build. if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Win")))) { - #Write-Host "On Windows build native simulator using the default C/C++ compiler (should be MSVC)" - $CMAKE_C_COMPILER = "-DCMAKE_C_COMPILER=clang.exe" $CMAKE_CXX_COMPILER = "-DCMAKE_CXX_COMPILER=clang++.exe" @@ -48,11 +46,9 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W $env:PATH = "$($env:SystemDrive)\Program Files\LLVM\bin;$env:Path" } - #cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" ` - # -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. - #cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER $clangTidy -D CMAKE_BUILD_TYPE="$buildType" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" ../.. | Write-Host - cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" ` - -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + cmake -G Ninja -D BUILD_SHARED_LIBS:BOOL="1" $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER ` + -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" ` + -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. # Without `-G Ninja` we fail to switch from MSVC to Clang. } elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) @@ -64,10 +60,6 @@ elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( } elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Darwin")))) { - # Write-Host "On MacOS build native simulator using gcc (needed for OpenMP)" - # # `gcc`on Darwin seems to be a shim that redirects to AppleClang, to get real gcc, must point to the specific - # # version of gcc we've installed. - # # cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=gcc-7 -D CMAKE_CXX_COMPILER=g++-7 -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. Write-Host "On MacOS build using the default C/C++ compiler (should be AppleClang)" $OPENMP_PATH="/usr/local/opt/libomp" diff --git a/src/Simulation/Native/src/simulator/kernels.hpp b/src/Simulation/Native/src/simulator/kernels.hpp index 3d4c7331d6a..dbf406dd862 100644 --- a/src/Simulation/Native/src/simulator/kernels.hpp +++ b/src/Simulation/Native/src/simulator/kernels.hpp @@ -74,7 +74,9 @@ template unsigned getvalue( std::vector, A> const& wfn, unsigned q, - double eps = 100. * std::numeric_limits::epsilon()) __attribute__((noinline)) + double eps = 100. * std::numeric_limits::epsilon()) + __attribute__((noinline)) // TODO(rokuzmin, #885): Try to remove `__attribute__((noinline))` after migrating + // to clang-13 on Win and Linux. { std::size_t mask = 1ull << q; for (std::size_t i = 0; i < wfn.size(); ++i) From 40b1fba7714f638d97a5fede1d3e15fd41485102 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Thu, 2 Dec 2021 12:50:09 -0800 Subject: [PATCH 25/31] Uncommented e2e commands. --- build/e2e.yml | 56 +++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/build/e2e.yml b/build/e2e.yml index 96468709b3d..1a56ac89ab3 100644 --- a/build/e2e.yml +++ b/build/e2e.yml @@ -1,33 +1,33 @@ -# name: $(Build.Major).$(Build.Minor).$(date:yyMM).$(BuildId) +name: $(Build.Major).$(Build.Minor).$(date:yyMM).$(BuildId) -# parameters: -# - name: validation_level -# displayName: Validation Level -# type: string -# default: normal -# values: -# - minimal -# - normal -# - full +parameters: +- name: validation_level + displayName: Validation Level + type: string + default: normal + values: + - minimal + - normal + - full -# trigger: none +trigger: none -# pr: -# - main -# - feature/* -# - features/* -# - release/* +pr: +- main +- feature/* +- features/* +- release/* -# resources: -# repositories: -# - repository: qdk -# type: github -# endpoint: github -# name: microsoft/qdk -# ref: refs/heads/main +resources: + repositories: + - repository: qdk + type: github + endpoint: github + name: microsoft/qdk + ref: refs/heads/main -# extends: -# template: build/qdk-module-e2e.yml@qdk -# parameters: -# module: qsharp-runtime -# validation_level: ${{ parameters.validation_level }} +extends: + template: build/qdk-module-e2e.yml@qdk + parameters: + module: qsharp-runtime + validation_level: ${{ parameters.validation_level }} From d2e31c8deca4273aa7d5927b105efa1738de544a Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Thu, 2 Dec 2021 12:58:31 -0800 Subject: [PATCH 26/31] More clean-up. --- src/Qir/Tests/test-qir-tests.ps1 | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/Qir/Tests/test-qir-tests.ps1 b/src/Qir/Tests/test-qir-tests.ps1 index 4024cc11a75..1799a74180f 100644 --- a/src/Qir/Tests/test-qir-tests.ps1 +++ b/src/Qir/Tests/test-qir-tests.ps1 @@ -16,14 +16,6 @@ if ($Env:BUILD_CONFIGURATION -eq "Debug") if (-not ($IsWindows)) { $env:LSAN_OPTIONS += "suppressions=../../../../LSan.ignore" # https://clang.llvm.org/docs/AddressSanitizer.html#suppressing-memory-leaks - #if (-not ($IsMacOS)) - #{ - # $env:ASAN_OPTIONS += "check_initialization_order=1" # https://clang.llvm.org/docs/AddressSanitizer.html#initialization-order-checking - #} - #else # AddressSanitizer: detect_leaks is not supported on this platform. Re-enable this once supported. - #{ - # $env:ASAN_OPTIONS += "detect_leaks=1" # https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection - #} $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true" From c523f4db2341e644983dd4957fedd5ab965f1c5a Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Thu, 2 Dec 2021 13:24:09 -0800 Subject: [PATCH 27/31] Added Spectre mitigation to NS. --- src/Simulation/Native/CMakeLists.txt | 56 +++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/Simulation/Native/CMakeLists.txt b/src/Simulation/Native/CMakeLists.txt index 5fed97ac7e4..c73293bc56b 100644 --- a/src/Simulation/Native/CMakeLists.txt +++ b/src/Simulation/Native/CMakeLists.txt @@ -47,12 +47,56 @@ option(USE_GATE_FUSION "Use gate fusion" ON) # # set(CMAKE_CXX_FLAGS "-static-libgcc") # endif (MSVC) -# TODO(rokuzmin): Add Spectre mitigations. -# # Always use available Spectre mitigations where available -# if (NOT APPLE) -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mspeculative-load-hardening -mretpoline") -# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mspeculative-load-hardening -mretpoline") -# endif() +# Always use Spectre mitigations where available +if (WIN32) + # Enforce use of static runtime (avoids target machine needing msvcrt installed). + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + + # Locate the vswhere application, which will provide paths to any installed Visual Studio instances. + # By invoking it with "-find **/lib/spectre/x64" we will find any Spectre mitigated libaries that + # have been installed. + find_program(_vswhere_tool + NAMES vswhere + PATHS "$ENV{ProgramFiles\(x86\)}/Microsoft Visual Studio/Installer") + if (NOT ${vswhere}) + message(FATAL_ERROR "Could not locate vswhere.exe - unable to source vc redistributable") + endif() + execute_process( + COMMAND "${_vswhere_tool}" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -find **/14.29.*/**/lib/spectre/x64 -sort + OUTPUT_VARIABLE _vs_install_loc_out + RESULT_VARIABLE _vs_where_exitcode + OUTPUT_STRIP_TRAILING_WHITESPACE) + file(TO_CMAKE_PATH "${_vs_install_loc_out}" SPECTRE_LIB_PATH_OUT) + string(REGEX REPLACE "[\r\n]+" ";" SPECTRE_LIB_PATH ${SPECTRE_LIB_PATH_OUT}) + message(INFO "*** install loc: ${SPECTRE_LIB_PATH}") + + # Locate the spectre mitigated runtime libraries and fail if they can't be found. Targets in this + # cmake project can use the variables to explicitly link these libraries rather than using the + # non-mitigated libraries that are found by default. + find_library(LIBCMT_SPECTRE_REL libcmt PATHS ${SPECTRE_LIB_PATH} REQUIRED) + find_library(LIBCMT_SPECTRE_DEB libcmtd PATHS ${SPECTRE_LIB_PATH} REQUIRED) + set(LIBCMT_SPECTRE debug ${LIBCMT_SPECTRE_DEB} optimized ${LIBCMT_SPECTRE_REL}) + message(INFO "*** using spectre lib: ${LIBCMT_SPECTRE}") + find_library(LIBCPMT_SPECTRE_REL libcpmt PATHS ${SPECTRE_LIB_PATH} REQUIRED) + find_library(LIBCPMT_SPECTRE_DEB libcpmtd PATHS ${SPECTRE_LIB_PATH} REQUIRED) + set(LIBCPMT_SPECTRE debug ${LIBCPMT_SPECTRE_DEB} optimized ${LIBCPMT_SPECTRE_REL}) + message(INFO "*** using spectre lib: ${LIBCPMT_SPECTRE}") + find_library(LIBVCRUNTIME_SPECTRE_REL libvcruntime PATHS ${SPECTRE_LIB_PATH} REQUIRED) + find_library(LIBVCRUNTIME_SPECTRE_DEB libvcruntimed PATHS ${SPECTRE_LIB_PATH} REQUIRED) + set(LIBVCRUNTIME_SPECTRE debug ${LIBVCRUNTIME_SPECTRE_DEB} optimized ${LIBVCRUNTIME_SPECTRE_REL}) + message(INFO "*** using spectre lib: ${LIBVCRUNTIME_SPECTRE}") + set(SPECTRE_LIBS + ${LIBCMT_SPECTRE} + ${LIBCPMT_SPECTRE} + ${LIBVCRUNTIME_SPECTRE}) + + add_link_options("LINKER:/guard:cf") +endif() + +if (NOT APPLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mspeculative-load-hardening -mretpoline") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mspeculative-load-hardening -mretpoline") +endif() include_directories(${PROJECT_BINARY_DIR}/src) include_directories(${PROJECT_SOURCE_DIR}/src) From 11ec1fe4bdff9cf30c7eb84c4ebe755b2c709705 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Thu, 2 Dec 2021 14:14:03 -0800 Subject: [PATCH 28/31] Clean-up. --- src/Qir/Runtime/test-qir-runtime.ps1 | 2 -- src/Qir/Samples/test-qir-samples.ps1 | 1 - src/Qir/Tests/test-qir-tests.ps1 | 4 ++-- src/Qir/qir-utils.ps1 | 2 +- src/Simulation/Native/CMakeLists.txt | 15 --------------- src/Simulation/Native/build-native-simulator.ps1 | 5 ++--- 6 files changed, 5 insertions(+), 24 deletions(-) diff --git a/src/Qir/Runtime/test-qir-runtime.ps1 b/src/Qir/Runtime/test-qir-runtime.ps1 index 9abdee94ad3..377ee141411 100644 --- a/src/Qir/Runtime/test-qir-runtime.ps1 +++ b/src/Qir/Runtime/test-qir-runtime.ps1 @@ -3,9 +3,7 @@ . (Join-Path $PSScriptRoot .. qir-utils.ps1) -# TODO: `ASAN_OPTIONS=check_initialization_order=1` (https://clang.llvm.org/docs/AddressSanitizer.html#initialization-order-checking). # TODO: macOS: `ASAN_OPTIONS=detect_leaks=1` (https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection). - $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` + "detect_invalid_pointer_pairs=2" diff --git a/src/Qir/Samples/test-qir-samples.ps1 b/src/Qir/Samples/test-qir-samples.ps1 index 617a036f48d..a5bbef65a84 100644 --- a/src/Qir/Samples/test-qir-samples.ps1 +++ b/src/Qir/Samples/test-qir-samples.ps1 @@ -3,7 +3,6 @@ . (Join-Path $PSScriptRoot .. qir-utils.ps1) -# TODO: `ASAN_OPTIONS=check_initialization_order=1` (https://clang.llvm.org/docs/AddressSanitizer.html#initialization-order-checking). # TODO: macOS: `ASAN_OPTIONS=detect_leaks=1` (https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection). $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true:" ` diff --git a/src/Qir/Tests/test-qir-tests.ps1 b/src/Qir/Tests/test-qir-tests.ps1 index 1799a74180f..fef566d1b62 100644 --- a/src/Qir/Tests/test-qir-tests.ps1 +++ b/src/Qir/Tests/test-qir-tests.ps1 @@ -16,10 +16,10 @@ if ($Env:BUILD_CONFIGURATION -eq "Debug") if (-not ($IsWindows)) { $env:LSAN_OPTIONS += "suppressions=../../../../LSan.ignore" # https://clang.llvm.org/docs/AddressSanitizer.html#suppressing-memory-leaks + # TODO: macOS: `ASAN_OPTIONS=detect_leaks=1` (https://clang.llvm.org/docs/AddressSanitizer.html#memory-leak-detection). $env:ASAN_OPTIONS = "check_initialization_order=true:detect_stack_use_after_return=true:" ` + "alloc_dealloc_mismatch=true:new_delete_type_mismatch=true:strict_init_order=true:strict_string_checks=true" - - # + "detect_invalid_pointer_pairs=2" TODO(rokuzmin, #883): ==8218==ERROR: AddressSanitizer: invalid-pointer-pair: 0x602000000af4 0x602000000af0 + # + ":detect_invalid_pointer_pairs=2" TODO(rokuzmin, #883): ==8218==ERROR: AddressSanitizer: invalid-pointer-pair: 0x602000000af4 0x602000000af0 } } diff --git a/src/Qir/qir-utils.ps1 b/src/Qir/qir-utils.ps1 index 57e0cdd5cf2..612c19b9246 100644 --- a/src/Qir/qir-utils.ps1 +++ b/src/Qir/qir-utils.ps1 @@ -84,7 +84,7 @@ function Build-CMakeProject { $buildType = "RelWithDebInfo" } - cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER $clangTidy -D CMAKE_BUILD_TYPE="$buildType" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" ../.. | Write-Host + cmake -G Ninja $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER $clangTidy -D CMAKE_BUILD_TYPE="$buildType" ../.. | Write-Host if ($LastExitCode -ne 0) { Write-Host "##vso[task.logissue type=error;]Failed to generate $Name." $all_ok = $false diff --git a/src/Simulation/Native/CMakeLists.txt b/src/Simulation/Native/CMakeLists.txt index c73293bc56b..a51989bda92 100644 --- a/src/Simulation/Native/CMakeLists.txt +++ b/src/Simulation/Native/CMakeLists.txt @@ -32,21 +32,6 @@ option(USE_SINGLE_PRECISION "Use single-precision floating point operations" OFF option(HAVE_INTRINSICS "Have AVX intrinsics" OFF) option(USE_GATE_FUSION "Use gate fusion" ON) -# windows specific flags -# if (MSVC) -# # always create debug info -# add_definitions("/Zi") -# add_definitions("/Z7") - -# # build with no VC runtime depedencies: -# set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT /Qspectre /guard:cf /Zi /Z7") -# set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd /Qspectre /guard:cf") -# set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG") -# # TODO(rokuzmin): Switch to clang. -# # else (MSVC) -# # set(CMAKE_CXX_FLAGS "-static-libgcc") -# endif (MSVC) - # Always use Spectre mitigations where available if (WIN32) # Enforce use of static runtime (avoids target machine needing msvcrt installed). diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 7588e6f28d5..871b86f204f 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -47,7 +47,6 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W } cmake -G Ninja -D BUILD_SHARED_LIBS:BOOL="1" $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER ` - -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. # Without `-G Ninja` we fail to switch from MSVC to Clang. } @@ -56,7 +55,7 @@ elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_C_COMPILER=clang-11 -D CMAKE_CXX_COMPILER=clang++-11 ` -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" ` -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" ` - -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. } elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Darwin")))) { @@ -71,7 +70,7 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( -D OpenMP_omp_LIBRARY=$OPENMP_PATH/lib/libomp.dylib ` -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" ` -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" ` - -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" -D CMAKE_VERBOSE_MAKEFILE:BOOL="1" .. + -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. } else { cmake -D BUILD_SHARED_LIBS:BOOL="1" -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. From d52c9d9a3138d5d5f2409e8dc3e45d2652d21c33 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Thu, 2 Dec 2021 18:06:16 -0800 Subject: [PATCH 29/31] Fixing the e2e test run. --- src/Qir/Common/cmake/unit_test_include.cmake | 2 +- src/Qir/Samples/StandaloneInputReference/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Qir/Common/cmake/unit_test_include.cmake b/src/Qir/Common/cmake/unit_test_include.cmake index 5c29fc114c7..93701f563b0 100644 --- a/src/Qir/Common/cmake/unit_test_include.cmake +++ b/src/Qir/Common/cmake/unit_test_include.cmake @@ -9,7 +9,7 @@ macro(add_unit_test target) if(DEFINED ENV{NATIVE_SIMULATOR}) set(TEST_DEPS1 $ENV{NATIVE_SIMULATOR}) else() - set(TEST_DEPS1 "${PROJECT_SOURCE_DIR}/../../Simulation/native/build/$ENV{BUILD_CONFIGURATION}") + set(TEST_DEPS1 "${PROJECT_SOURCE_DIR}/../../Simulation/native/build/drop") endif() set(TEST_DEPS2 "${CMAKE_BINARY_DIR}/bin") diff --git a/src/Qir/Samples/StandaloneInputReference/CMakeLists.txt b/src/Qir/Samples/StandaloneInputReference/CMakeLists.txt index 5f994b1dc24..8006d3a5694 100644 --- a/src/Qir/Samples/StandaloneInputReference/CMakeLists.txt +++ b/src/Qir/Samples/StandaloneInputReference/CMakeLists.txt @@ -34,7 +34,7 @@ add_test( if(DEFINED ENV{NATIVE_SIMULATOR}) set(TEST_DEPS1 $ENV{NATIVE_SIMULATOR}) else() - set(TEST_DEPS1 "${PROJECT_SOURCE_DIR}/../../Simulation/native/build/$ENV{BUILD_CONFIGURATION}") + set(TEST_DEPS1 "${PROJECT_SOURCE_DIR}/../../Simulation/native/build/drop") endif() set(TEST_DEPS2 "${PROJECT_SOURCE_DIR}/../Runtime/bin/$ENV{BUILD_CONFIGURATION}/bin") From 76795bab39508580481d7982521a2647c1c653a5 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Fri, 3 Dec 2021 12:42:40 -0800 Subject: [PATCH 30/31] CR changes. --- src/Qir/Runtime/public/QubitManager.hpp | 4 +++- src/Simulation/Native/CMakeLists.txt | 13 +++++++++++++ src/Simulation/Native/build-native-simulator.ps1 | 7 +------ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Qir/Runtime/public/QubitManager.hpp b/src/Qir/Runtime/public/QubitManager.hpp index dc9c8ac12c9..bb7e5a06215 100644 --- a/src/Qir/Runtime/public/QubitManager.hpp +++ b/src/Qir/Runtime/public/QubitManager.hpp @@ -40,7 +40,9 @@ namespace Quantum // No complex scenarios for now. Don't need to support copying/moving. CQubitManager(const CQubitManager&) = delete; CQubitManager& operator=(const CQubitManager&) = delete; - ~CQubitManager(); + ~CQubitManager(); // If this dtor is made _virtual_ then the QIR RT tests crash (at least in Debug config) + // if the native simulator is compiled with Clang (as opposed to GCC). Nothing wrong found in the code, + // probably is the compiler bug. // Restricted reuse area control void StartRestrictedReuseArea(); diff --git a/src/Simulation/Native/CMakeLists.txt b/src/Simulation/Native/CMakeLists.txt index a51989bda92..1029f69e1f7 100644 --- a/src/Simulation/Native/CMakeLists.txt +++ b/src/Simulation/Native/CMakeLists.txt @@ -88,6 +88,19 @@ include_directories(${PROJECT_SOURCE_DIR}/src) # OpenMP if(ENABLE_OPENMP) + +if (APPLE) + set(OPENMP_PATH "/usr/local/opt/libomp") + set(OPENMP_COMPILER_FLAGS "-Xpreprocessor -fopenmp -I${OPENMP_PATH}/include -lomp -L${OPENMP_PATH}/lib") + set(OPENMP_LIB_NAME "omp") + + set(OpenMP_CXX_FLAGS "${OPENMP_COMPILER_FLAGS}") + set(OpenMP_C_FLAGS "${OPENMP_COMPILER_FLAGS}") + set(OpenMP_CXX_LIB_NAMES "${OPENMP_LIB_NAME}") + set(OpenMP_C_LIB_NAMES "${OPENMP_LIB_NAME}") + set(OpenMP_omp_LIBRARY "${OPENMP_PATH}/lib/libomp.dylib") +endif() + find_package(OpenMP) if(OPENMP_FOUND) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") diff --git a/src/Simulation/Native/build-native-simulator.ps1 b/src/Simulation/Native/build-native-simulator.ps1 index 871b86f204f..625112a0b1a 100644 --- a/src/Simulation/Native/build-native-simulator.ps1 +++ b/src/Simulation/Native/build-native-simulator.ps1 @@ -49,6 +49,7 @@ if (($IsWindows) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("W cmake -G Ninja -D BUILD_SHARED_LIBS:BOOL="1" $CMAKE_C_COMPILER $CMAKE_CXX_COMPILER ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. # Without `-G Ninja` we fail to switch from MSVC to Clang. + # Sanitizers are not supported on Windows at the moment. Check again after migrating from Clang-11. } elseif (($IsLinux) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith("Lin")))) { @@ -61,13 +62,7 @@ elseif (($IsMacOS) -or ((Test-Path Env:AGENT_OS) -and ($Env:AGENT_OS.StartsWith( { Write-Host "On MacOS build using the default C/C++ compiler (should be AppleClang)" - $OPENMP_PATH="/usr/local/opt/libomp" - $OPENMP_COMPILER_FLAGS="-Xpreprocessor -fopenmp -I$OPENMP_PATH/include -lomp -L$OPENMP_PATH/lib" - $OPENMP_LIB_NAME="omp" cmake -D BUILD_SHARED_LIBS:BOOL="1" ` - -D OpenMP_CXX_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_CXX_LIB_NAMES="$OPENMP_LIB_NAME" ` - -D OpenMP_C_FLAGS="$OPENMP_COMPILER_FLAGS" -D OpenMP_C_LIB_NAMES="$OPENMP_LIB_NAME" ` - -D OpenMP_omp_LIBRARY=$OPENMP_PATH/lib/libomp.dylib ` -D CMAKE_C_FLAGS_DEBUG="$SANITIZE_FLAGS" ` -D CMAKE_CXX_FLAGS_DEBUG="$SANITIZE_FLAGS" ` -D CMAKE_BUILD_TYPE="$Env:BUILD_CONFIGURATION" .. From 47050c4d2fadb1b54a3a1e16037837d9ef4f4793 Mon Sep 17 00:00:00 2001 From: Robin Kuzmin Date: Fri, 3 Dec 2021 12:49:34 -0800 Subject: [PATCH 31/31] Build fix. --- src/Qir/Runtime/public/QubitManager.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Qir/Runtime/public/QubitManager.hpp b/src/Qir/Runtime/public/QubitManager.hpp index bb7e5a06215..f1ff2afb3b3 100644 --- a/src/Qir/Runtime/public/QubitManager.hpp +++ b/src/Qir/Runtime/public/QubitManager.hpp @@ -40,9 +40,9 @@ namespace Quantum // No complex scenarios for now. Don't need to support copying/moving. CQubitManager(const CQubitManager&) = delete; CQubitManager& operator=(const CQubitManager&) = delete; - ~CQubitManager(); // If this dtor is made _virtual_ then the QIR RT tests crash (at least in Debug config) - // if the native simulator is compiled with Clang (as opposed to GCC). Nothing wrong found in the code, - // probably is the compiler bug. + ~CQubitManager(); // If this dtor is made _virtual_ then the QIR RT tests crash (at least in Debug config) + // if the native simulator is compiled with Clang (as opposed to GCC). Nothing wrong found in + // the code, probably is the compiler bug. // Restricted reuse area control void StartRestrictedReuseArea();