我正在用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)和我的头文件(来自Agner的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__,我的CPU是i5 Skylake,所以它应该支持AVX2。
我已经检查了是否在项目配置属性中启用了Advanced Vector Extensions 2选项,并且它已经启用。
为了使AVX2宏可识别,是否需要从CMake或Visual Studio中更改/添加某些内容?
发布于 2019-01-11 05:44:45
有三种方法可以对目标启用编译选项/arch:AVX2 (如果您的编译器支持它)。
通过使用生成器表达式
target_compile_options(Maths PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/arch:AVX2>)或者在if子句中设置compile选项
if(MSVC)
target_compile_options(Maths PRIVATE /arch:AVX2)
endif()或者使用add_definition调用将定义添加到此命令后在脚本中创建的所有目标
if(MSVC)
add_definition(/arch:AVX2)
endif()如果不是绝对必要的话,我尽量避免使用生成器表达式,因为它们不会提高CMake脚本文件的可读性,而且有时很难正确使用。
https://stackoverflow.com/questions/54114287
复制相似问题