> 백엔드 개발 > C++ > SIMD 벡터 포인터를 C에서 다른 유형의 정의되지 않은 동작으로 재해석하고 있습니까?

SIMD 벡터 포인터를 C에서 다른 유형의 정의되지 않은 동작으로 재해석하고 있습니까?

Patricia Arquette
풀어 주다: 2024-12-20 12:50:21
원래의
304명이 탐색했습니다.

Is Reinterpreting a SIMD Vector Pointer as a Different Type Undefined Behavior in C  ?

SIMD 벡터 포인터와 해당 유형을 정의되지 않은 동작으로 재해석

제시된 질문은 reinterpret_cast<__m256*>를 사용할 수 있는지 여부를 조사합니다. ;(&(스택_스토어[0])) ~ float*를 __m256*으로 재해석하고 이 다른 포인터 유형을 통해 float 객체에 액세스합니다. 그런 다음 이 관행이 엄격한 앨리어싱 규칙을 위반하는지 또는 C 언어 표준의 맥락에서 정의되지 않은 동작(UB)을 구성하는지 조사합니다.

정의되지 않은 동작 해결

합의는 다음과 같습니다. ISO C는 __m256 유형의 동작을 명시적으로 정의하지 않습니다. 그러나 이러한 벡터 유형에 대한 Intel의 내장 기능을 조사하면 ISO C의 char* 동작과 유사하게 __m256*과 같은 벡터 포인터를 다른 포인터 유형과 별칭으로 지정할 수 있다는 것이 분명해졌습니다. 결과적으로 _mm256_load_ps()와 같은 정렬 로드 내장 함수를 사용하는 대신 __m256*을 역참조하는 것이 안전한 것으로 간주됩니다.

엄격한 앨리어싱 문제

또한 __m256*은 C의 엄격한 앨리어싱 규칙을 위반하지 않습니다. [기본.lval]/11. 엄격한 앨리어싱은 다른 유형의 포인터를 통해 객체에 액세스하는 것을 금지하지만, 이 경우 __m256*과 같은 벡터 포인터는 스칼라 유형 및 기타 벡터 유형을 포함하여 다른 모든 것에 앨리어싱을 지정할 수 있도록 명시적으로 지정됩니다.

벡터 요소 액세스

__m256*을 역참조하는 것이 안전하지만 벡터 요소에 액세스하기 위해 __m256 벡터를 스칼라 배열로 처리하려고 시도하거나(예: hwvec1[0] 과 같은 인덱싱 연산자 사용) 스칼라 값을 벡터 요소에 직접 할당하는 것은 정의되지 않은 동작으로 간주됩니다. 개별 벡터 요소를 조작하려면 shuffle 내장 함수(_mm_shuffle_epi16 / _mm_shuffle_epi8/32/64), 삽입/추출 내장 함수(_mm_insert_epi16 / _mm_extract_epi16) 또는 적절한 GNU C 벡터 구문(예: v[3] = 1.25)을 사용하는 것이 좋습니다. ).

위 내용은 SIMD 벡터 포인터를 C에서 다른 유형의 정의되지 않은 동작으로 재해석하고 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿