/arch
(x86)
x86에서 코드 생성 아키텍처를 지정합니다. 다른 대상 아키텍처에 대한 /arch
자세한 내용은 (ARM64), /arch
(x64) 및/arch
(ARM)을 참조 /arch
하세요.
구문
/arch:
[IA32
AVX10.1
|AVX512
|AVX2
|||AVX
|SSE
SSE2
]
인수
/arch:IA32
고급 명령을 지정하지 않는 반면 부동 소수점 계산을 위해 x87도 지정합니다.
/arch:SSE
Intel Streaming SIMD 확장을 사용하도록 설정합니다.
/arch:SSE2
Intel Streaming SIMD 확장 2를 사용하도록 설정합니다. 옵션이 지정되지 않은 /arch
경우 기본 명령 집합은 SSE2입니다.
/arch:AVX
Intel 고급 벡터 확장을 사용하도록 설정합니다.
/arch:AVX2
Intel Advanced Vector Extensions 2를 사용하도록 설정합니다.
/arch:AVX512
Intel Advanced Vector Extensions 512를 사용하도록 설정합니다.
/arch:AVX10.1
Intel Advanced Vector Extensions 10 버전 1을 사용하도록 설정합니다.
설명
이 /arch
옵션은 특정 명령 집합 확장, 특히 Intel 및 AMD의 프로세서에서 사용할 수 있는 벡터 계산의 사용을 사용하거나 사용하지 않도록 설정합니다. 일반적으로 최근에 도입된 프로세서는 이전 프로세서에서 지원하는 확장 이외의 확장을 지원할 수 있습니다. 명령 집합 확장을 사용하여 __cpuid
코드를 실행하기 전에 특정 프로세서에 대한 설명서를 참조하거나 명령 집합 확장 지원을 테스트해야 합니다. 내장 함수를 __check_isa_support
사용하여 더 자주 사용되는 CPU 기능을 확인할 수도 있습니다.
/arch
네이티브 함수의 코드 생성에만 영향을 줍니다. 컴파일 /arch
하는 데 사용하는 /clr
경우 관리되는 함수의 코드 생성에는 영향을 주지 않습니다.
옵션은 /arch
다음과 같은 특성을 가진 명령 집합 확장을 참조합니다.
IA32
는 벡터 작업이 없고 부동 소수점 계산에 x87을 사용하는 레거시 32비트 x86 명령 집합입니다.SSE
을 사용하면 최대 4개의 단정밀도 부동 소수점 값의 벡터를 사용하여 계산할 수 있습니다. 해당 스칼라 부동 소수점 명령도 추가되었습니다.SSE2
에서는 단정밀도, 배정밀도 및 1, 2, 4 또는 8 바이트 정수 값의 128비트 벡터를 사용하여 계산할 수 있습니다. 배정밀도 스칼라 명령도 추가되었습니다.AVX
는 벡터 및 부동 소수점 스칼라 명령에 대한 대체 명령 인코딩을 도입했습니다. 128비트 또는 256비트 중 하나의 벡터를 허용하고 모든 벡터 결과를 전체 벡터 크기로 0으로 확장합니다. (레거시 호환성을 위해 SSE 스타일 벡터 명령은 비트 127을 초과하는 모든 비트를 유지합니다.) 대부분의 부동 소수점 작업은 256비트로 확장됩니다.AVX2
는 대부분의 정수 작업을 256비트 벡터로 확장하고 FMA(Fused Multiply-Add) 지침을 사용할 수 있도록 합니다.AVX512
는 512비트 벡터, 마스킹, 포함된 반올림/브로드캐스트 및 새 명령을 허용하는 또 다른 명령 인코딩 양식을 도입했습니다. 기본 벡터 길이AVX512
는 512비트이며 플래그를 사용하여/vlen
256비트로 변경할 수 있습니다.AVX10.1
에 더 많은 지침이AVX-512
추가됩니다. 기본 벡터 길이AVX10.1
는 256비트이며 플래그를 사용하여/vlen
512비트로 변경할 수 있습니다.
최적화 프로그램은 지정된 항목에 따라 /arch
벡터 명령을 사용하는 시기와 방법을 선택합니다. 스칼라 부동 소수점 계산은 일반적으로 사용 가능한 경우 SSE 또는 AVX 명령으로 수행됩니다. 일부 호출 규칙은 x87 스택에서 부동 소수점 인수 전달을 지정하므로 코드는 부동 소수점 계산에 x87 및 SSE/AVX 명령의 혼합을 사용할 수 있습니다. 정수 벡터 명령은 사용 가능한 경우 일부 64비트 정수 작업에도 사용할 수 있습니다.
각 /arch
옵션은 벡터 및 부동 소수점 스칼라 명령 외에도 해당 옵션과 연결된 다른 비벡터 명령을 사용할 수 있습니다. 예를 들어 Intel Pentium Pro 프로세서에 처음 나타난 CMOVcc 명령 패밀리가 있습니다. 이후 Intel Pentium III 프로세서에서 SSE 명령이 도입되었으므로 CMOVcc 명령이 지정된 경우 /arch:IA32
를 제외하고 생성될 수 있습니다.
부동 소수점 연산은 일반적으로 x87 코드에서 배정밀도(64비트)로 반올림되지만 정밀도 컨트롤을 확장 정밀도(80비트) 또는 단정밀도(32비트)로 설정하는 등 FP 컨트롤 단어를 수정하는 데 사용할 _controlfp
수 있습니다. 자세한 내용은 다음을 __control87_2
_controlfp
참조하세요._control87
SSE 및 AVX에는 각 작업에 대해 별도의 단정밀도 및 배정밀도 명령이 있으므로 SSE/AVX 코드와 동일하지 않습니다. 부동 소수점 연산의 결과가 사용자 변수에 할당하는 대신 추가 계산에 직접 사용될 때 결과가 반올림되는 방식을 변경할 수 있습니다. 다음 작업을 고려합니다.
r = f1 * f2 + d; // Different results are possible on SSE/SSE2.
명시적 할당 사용:
t = f1 * f2; // Do f1 * f2, round to the type of t.
r = t + d; // This should produce the same overall result
// whether x87 stack is used or SSE/SSE2 is used.
/arch
함께 /QIfist
사용할 수 없습니다. 이 /QIfist
옵션은 부동 소수점의 반올림 동작을 정수 변환으로 변경합니다. 기본 동작은 잘라내기(0으로 반올림)하는 반면, /QIfist
옵션은 부동 소수점 환경 반올림 모드의 사용을 지정합니다. 이 옵션은 모든 부동 소수점의 동작을 정수 변환 /QIfist
으로 변경하므로 더 이상 사용되지 않습니다. SSE 또는 AVX용으로 컴파일할 때 기본 함수 시퀀스를 사용하여 부동 소수점 환경 반올림 모드를 사용하여 부동 소수점 값을 정수로 반올림할 수 있습니다.
int convert_float_to_int(float x) {
return _mm_cvtss_si32(_mm_set_ss(x));
}
int convert_double_to_int(double x) {
return _mm_cvtsd_si32(_mm_set_sd(x));
}
, __AVX__
,__AVX2__
, __AVX512F__
, __AVX512CD__
, __AVX512BW__
, __AVX512DQ__
__AVX512VL__
및 __AVX10_VER__
매크로는 _M_IX86_FP
컴파일러 옵션이 사용된 경우 /arch
해당 옵션을 나타냅니다. 자세한 내용은 미리 정의된 매크로를 참조 하세요. 이 /arch:AVX2
옵션 및 __AVX2__
매크로는 Visual Studio 2013 업데이트 2 버전 12.0.34567.1에서 도입되었습니다. 제한된 지원 /arch:AVX512
은 Visual Studio 2017에서 추가되었으며 Visual Studio 2019에서 확장되었습니다. Visual Studio 2022에 대한 /arch:AVX10.1
지원이 추가되었습니다.
Visual Studio에서 /arch
컴파일러 옵션을 설정하려면
프로젝트에 대한 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 컴파일러 및 빌드 속성 설정을 참조합니다.
구성 속성>C/C++>코드 생성 속성 페이지를 선택합니다.
고급 명령 집합 사용 속성을 수정합니다.
프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면
- EnableEnhancedInstructionSet을(를) 참조하세요.