Lyn
조회 수 2040 추천 수 0 댓글 0
Atachment
첨부 '2'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

정말 오랫만에 로우레벨 관련 질문을 받았습니다...

바로 아래 코드에서

 

#include <smmintrin.h>

int main()
{
    __m128i m_128i;
    m_128i.m128i_i16[0] = 0;

    for (int i = 0; i < 15; i++)
    {
        auto a = _mm_extract_epi8(m_128i, i); // <-- 컴파일 에러
    }
}

 

error C2057: expected constant expression 에러가 발생 한다는 얘기입니다.

 

_mm_extract_epi8 의 prototype 을 확인 해 보면 extern int   _mm_extract_epi8 (__m128i /* src */, const int /* index */); 입니다. 일반적으론 변수 -> const 로의 변환은 자유로우므로 문제가 없어야 하는데... 오류가 나죠.

 

원인은 간단한데 _mm_extract_epi8 는 C++의 "함수" 가 아니라, 기계어와 매칭되는 Intrinsics 입니다. 저게 선언되어있는 헤더가 smminstrin.h 라는 것에서도 알 수 있지요. 해당명령어는 intel 명령어이니 intel 사이트에서 한번 해당 내용을 검색 해 봅시다

 

inst01.PNG

 

 

몇가지 정보가 나오네요. 해당 Intrinsics 에 대응되는 어셈블리는 pextrb r32, xmm, imm 이고, SSE4.1 지원이 필요하며, Latency 는 CPU 종류에 따라 2~3 클럭이네요.

 

여기는 Visual Studio 에 들어있는 헤더와 달리 각 파라메터에 이름이 붙어있습니다. a, 와 imm8 이네요.
그럼 imm8 은 뭐냐가 중요해지는데, 이 imm은 이름만 보면 무슨 레지스터 비슷한걸로 착각 할 수도 있는데, 실제로는 Immediate value 의 약자입니다.
한자로는 즉치값(즉시 계산되는 값) 이라고도 하는 것 같은데 C++ 프로그래머 입장에서 보자면 컴파일타임에 계산하여 결정이 가능한 상수(const) 를 이야기 합니다. 8은 뭐냐구요? 걍 bit 수 입니다. 저 값은 8bit 범위에서 작동한다는 거죠. 즉 imm8 을 풀어서 써보면 8-bit immediate value 라고 할 수 있겠습니다.

 

그럼 결론을 내보자면. Intrinsics 를 호출 할때는, C++의 호출/캐스팅 규칙 보다 CPU 명령어의 제약사항이 우선하며, _mm_extract_epi8 의 2번째 argument는  Immediate value 일 것을 요구하므로 변수를 사용할 수 없습니다.

 

기왕 하는김에 하나 더 해보자면, imm8 이라고 되어있긴 하지만, 128bit 변수를 8bit 단위로 쪼개서 값을 읽는 명령이므로, 실제 imm8의 사용 범위는 0~15 일 것입니다. 그런데 만약 그 이상의 값(ex : 16) 을 넣으면 어떻게 될까요?

 

 inst02.PNG

 

다행히도 컴파일러는 해당 명령어의 허용 범위를 알고 있으므로 

warning C4556: value of intrinsic immediate argument '16' is out of range '0 - 15' warning 을 띄워 줍니다.

 

TAG •
?

List of Articles
번호 제목 글쓴이 날짜 조회 수
123 .net 4.7 의 WPF 가 DX11 기반으로 돌아가네요 Lyn 2017.06.23 812
122 왜 MemberFunction Pointer 를 cout 으로 출력하면 1이 나올까 Lyn 2017.03.27 1625
» _mm_extract_epi8 함수에 변수 사용시 compile error file Lyn 2016.12.12 2040
120 [연속기획UD] 5. Afreeca Streaming file Lyn 2016.11.27 1960
119 Enhanced C++ debugging info at VS2012 over Lyn 2016.10.22 2342
118 사이트에서 http2 프로토콜을 지원 하기 시작 했습니다. Lyn 2016.10.01 4280
117 [연속기획UD] 4. INIPay Plugin file Lyn 2016.09.08 2311
116 where check http/2 online Lyn 2016.09.07 2039
115 how to rebuild ngnix with new version openssl Lyn 2016.09.07 2098
114 사이트에 SSL 인증서를 적용 했습니다... 적용 방법 Lyn 2016.09.07 2034
113 add "open as administrator" menu for gnome file explorer(nautilus) file Lyn 2016.06.25 4341
112 Visual C++ C4503 Warning Fix Lyn 2016.06.21 4720
111 New Calling Convention for AMD64(=EM64T, x64) and IA32(=x86) file Lyn 2016.04.17 5374
110 What is the calling convention of the C++ lambda file Lyn 2016.04.11 5314
109 Nuget error after Visual Studio 2015 Update 2 install file Lyn 2016.04.04 5394
108 Geforce 364.72 Vulkan Support file Lyn 2016.03.31 4041
107 [연속기획UD] 3. OpenVPN GUI Client file Lyn 2016.03.14 4738
106 How to Windows Disk Drive Performance Counter On Lyn 2016.03.12 3232
105 [연속기획UD] 2. NAVER Font Installer file Lyn 2016.03.06 4641
104 [연속기획UD] 1. Windows Service Manager file Lyn 2016.03.06 4256
Board Pagination Prev 1 2 3 4 5 6 7 ... 8 Next
/ 8