2014-10-12 6 views
0

확실하지 ICC를 사용하지만 고유 SSE의 주소를 취할 수 연타를 사용할 때이 를 사용하여 같은 일을하려고 불행하게도 때, 많은 문제없이, SSE 내장 함수에 연결하는 방법<strong>GCC</strong>에 대해 OS X에

sse.h :

#include <immintrin.h> 

static __m128i (*load)(const __m128i *) = &_mm_load_si128; 
012,351,641 OS X에 ICC
, 그것은 예를 들면

... 잘 링커 기본 함수를 찾을 수없는 정확하게는 실패

을 main.c :

#include <stdio.h> 
#include "sse.h" 

int main(void) { 

    char buffer[sizeof(__m128i)] __attribute__((aligned(sizeof(__m128i)))); 

    __m128i b = load((void *)buffer); 
    printf("%i\n", _mm_extract_epi16(b, 0)); 
    return 0; 
} 

이 명확하게하기 위해 나는 은하지 내가 이런 짓을 했을까 이유에 호기심이 사람들을 위해 매크로를 사용하려면, 내 주요 목표는 바람직하게는, 디스패처를 작성하는 것입니다 컴파일러가 얼마나 공격적인지에 따라 컴파일 시간이 달라 지지만 다른 이야기가 있습니다.

$ gcc main.c -O0 
$ 
$ gcc --version 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn) 
Target: x86_64-apple-darwin13.4.0 
Thread model: posix 
$ 
$ icc main.c -O0 
Undefined symbols for architecture x86_64: 
    "__mm_load_si128", referenced from: 
     _load in icckt7T6c.o 
ld: symbol(s) not found for architecture x86_64 
$ icc --version 
icc (ICC) 13.0.0 20120731 
Copyright (C) 1985-2012 Intel Corporation. All rights reserved. 
$ 
$ uname -a 
Darwin *****-MacBook-Pro.local 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64 
+1

intrinsics에 자신의 래퍼를 작성 하시겠습니까? gcc/clang은 내장 함수를 내장 함수로 구현합니다 (하나의 인수가 상수 일 때만 유효한 내장 함수는 -O0에 몇 가지 예외가 있습니다). –

+0

@MarcGlisse 나쁜 생각이 아니라면 컴파일러는 현존하는 명령어가 있다면 체인을 붕괴시킬만큼 똑똑 할 것입니다. –

+0

@MarcGlisse '하나의 인수가 상수 일 때만 유효합니다.' 일부 컴파일러는'짜증나게하는'정적 const'를 사용하는 것에 대해 불평하기 때문에 ** 즉각적인 **을 의미합니다. 그렇습니다. 여러분의 권리, 정말 이상합니다. 나는 일관성이 있었으면합니다. –

답변

0

내가 한 번 코드를 작성하고 256 비트 AVX 또는 128 비트 SSE 중 하나로 컴파일 할 수있는 대한 좋은 해결책이 잘 모르는 것 같아요. 그래도이게 아니란 걸 나는 확신한다.

icc는 문제가 있기 전에 링크 단계까지 도달했습니다. 어쩌면 최적화를 켜 놓은 경우 호출을 인라인하고 심볼로 참조하지 않았을 것입니다.

그래도 함수 포인터에 대한 호출을 인라인하려면 컴파일러가 필요합니다. 함수 포인터를 통해 단일 SSE 명령을 실행하면 이 아닌 빠른 코드를 작성합니다. (특히 컴파일러가 일반적인 ABI를 따르는 함수를 만드는 경우, 모든 xmm 레지스터가 호출자 저장 (즉, 호출 수신자가 호출자를 방해한다고 가정해야 함)).