2012-01-13 5 views
15

다음 두 줄의 차이점은 무엇입니까? 즉_mm_load_ps 대 _mm_load_pd 대

__m128 x = _mm_load_ps((float *) ptr); 
__m128 y = _mm_load_pd((double *)ptr); 

, 왜 대신 일반적인 __m128 _mm_load(const void *)에, 이렇게 많은 다른 _mm_load_xyz 지침이 있습니까?

+3

'_mm_load_pd'의 리턴 타입은'__m128'이 아니라'__m128d'입니다. –

+0

@PaulR : 그건 .... 세상에서 모든 감각을 만듭니다. 나는 그것을 전혀 알지 못했다. 그것을 지적 주셔서 감사합니다. :) – Mehrdad

답변

13

다른 내장 함수는 서로 다른 명령에 해당하므로 다른 내장 함수가 있습니다.

Intel은 배정 밀도 벡터가 단 정밀도 벡터 또는 정수 벡터와 다른 실제 레지스터 파일에 의해 백업되거나 다른 실행 단위를 사용하는 프로세서를 설계 할 자유를 유지하기를 원하므로 다른로드 명령이 있습니다. 적절한 레지스터 파일 또는 전달 네트워크에 데이터를로드하도록 지정하는 방법이 없으면 이들 중 하나가 추가 대기 시간을 추가 할 수 있습니다.

다른 방법은 "같은 일"을하지만 추가적으로로드되는 데이터가 향후 지침에서 어떻게 사용되는지 힌트를 프로세서에 제공한다는 점입니다. 이렇게하면 프로세서가 데이터를 가능한 한 효율적으로 사용할 수있는 올바른 위치에 있는지 확인하거나 프로세서에서 무시할 수 있습니다.

이것은 단지 가설이 아니라는 점에 유의하십시오. 부동 소수점 연산에 사용되는 데이터를로드하기 위해 정수 벡터로드 (MOVDQA)를 사용하는 프로세서가있는 경우 부동 소수점 연산을 위해 데이터를 얻기 위해 부동 소수점로드를 사용하는 것보다 (또는 그 반대로) . 주제에 대한 자세한 내용은 인텔 최적화 매뉴얼 또는 Agner Fog의 노트를 참조하십시오. 나중에 이러한 성능 위험의 위험을 피하기 위해 데이터 사용 방법과 일치하는로드를 사용하십시오.

+0

아, 나도 틀렸어. 반환 유형이 다르다. 그것은 지금 총체적인 의미를 갖습니다. :) +1 고마워. – Mehrdad

+0

@Mehrdad 이것은 어제의 SSE 질문에서 언급했던 것과 같은 도메인 셔플 링과 관련이 있습니다. – Mysticial

3

_mm_load_ps로드 4 단 정밀도 부동 소수점 2 배정 밀도 부동 소수점

이 다른 일을 값, 그래서 난 그냥 다른 기능을 가지고 말이 생각

_mm_load_pd 부하 값. 또한 C에는 과부하가 없습니다.

+0

내보다 더 나은 설명 :) –

+0

그래서 의미 관련 문제가 아니라 CPU 관련 문제입니까? – Mehrdad

+0

@Mehrdad, 여기에 intrinsic을 사용하고 있기 때문에 이러한 함수는 구현이 다를 수 있으며 일반화를 허용하지 않을 수 있습니다. –