Visual Studio не распознает __AVX2__ или __AVX__ - PullRequest
0 голосов
/ 09 января 2019

Я реализую простую оболочку SIMD в C ++. Чтобы сделать его кроссплатформенным, я использую CMake для настройки проекта с Visual Studio

Я добавил / Arch: AVX2, но Visual Studio не распознает __AVX2__ Макрос.

Сначала мой CMake.

cmake_minimum_required(VERSION 3.12.2)

set(INCLUDEDIR "include/Maths")
set(SOURCEDIR "src")

set(HEADER_FILES
    ${INCLUDEDIR}/export.h 
    ${INCLUDEDIR}/SIMDWrapper/Config/SIMDConfig.h)

set(SOURCE_FILES 
    ${SOURCEDIR}/Application.cpp)


add_library(Maths SHARED ${SOURCE_FILES}  ${HEADER_FILES})
target_link_libraries(Maths PUBLIC Core)
target_include_directories(Maths PUBLIC "include")
target_compile_options(Maths PRIVATE $<$<BOOL:${MSVC}>:/arch:AVX2>)
target_compile_definitions(Maths PRIVATE MATHS_EXPORT)

И мой заголовочный файл (из VectorClass Агнера Фога instrset.h):

#pragma once
#if (defined(_M_AMD64) || defined(_M_X64) || defined(__amd64)) && ! 
    defined(__x86_64__)
#define __x86_64__ 1
#endif


#ifndef SIMD_INSTR_SET
#if defined (__AVX2__)
    #define SIMD_INSTR_SET 8
#elif defined ( __AVX__ )
    #define SIMD_INSTR_SET 7
#elif defined ( __SSE4_2__ )
    #define SIMD_INSTR_SET 6
#elif defined ( __SSE4_1__ )
    #define SIMD_INSTR_SET 5
#elif defined ( __SSSE3__ )
    #define SIMD_INSTR_SET 4
#elif defined ( __SSE3__ )
    #define SIMD_INSTR_SET 3
#elif defined ( __SSE2__ ) || defined ( __x86_64__ )
    #define SIMD_INSTR_SET 2 //this is where the color has changed
#elif defined ( __SSE__ )
    #define SIMD_INSTR_SET 1
#elif defined ( _M_IX86_FP )    
   #define SIMD_INSTR_SET _M_IX86_FP
#else
   #define SIMD_INSTR_SET 0
#endif // instruction set defines
#endif // SIMD_INSTR_SET

Это то, что я сделал. __x86_64__ определено, мой процессор i5 Skylake, поэтому он должен поддерживать AVX2.

Я проверил, включена ли опция Advanced Vector Extensions 2 в свойствах конфигурации проекта, и включена ли она.

Что-то мне нужно изменить / добавить из CMake или Visual Studio, чтобы сделать макрос AVX2 узнаваемым?

1 Ответ

0 голосов
/ 11 января 2019

Существует три способа включить опцию компиляции /arch:AVX2 для вашей цели (если она поддерживается вашим компилятором).

Либо с помощью выражения генератора

target_compile_options(Maths PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX2>)

или установив опцию компиляции в if предложении

if(MSVC)
    target_compile_options(Maths PRIVATE /arch:AVX2)
endif()

или с помощью вызова add_definition для добавления определений ко всем целям, которые создаются в сценарии после этой команды

if(MSVC)
    add_definition(/arch:AVX2)
endif()

Я стараюсь избегать использования выражений генератора, если это не является абсолютно необходимым, так как они не улучшают читаемость файлов сценариев CMake и иногда их трудно понять.

...