2017-03-24 1 views
2

여러 버전 (sse4, ssse3, avx2, avx512)을 사용하는 glibc-2.25의 일부 메모리 함수 (memcpy, memset, memmove)가 Google 서버 프로그램의 성능 향상을 가져올 수 있는지 조사 중이었습니다. Linux (glibc 2.12).
첫 번째 시도는 여기 https://sourceware.org/glibc/wiki/Testing/Builds 지침에 따라 glibc-2.25의 타르 볼을 다운로드하고 빌드/테스트하는 것이 었습니다. 필자는 수동으로 커널 버전 검사를 주석 처리했으며 모든 것이 잘 진행되었습니다. 그런 다음 테스트 프로그램이 절에 나와있는 절차에 새로 건설의 glibc에 링크 된 glibc는 위키와 'LDD 테스트'의 "glibc는 빌드 트리에 대해 컴파일은"이 참으로 기대 라이브러리에 달려 있음을 보여줍니다포트 glibc 2.25 및 테스트 메모리 함수

# $GLIBC is /data8/home/wentingli/temp/glibc/build 
    libm.so.6 => /data8/home/wentingli/temp/glibc/build/math/libm.so.6 (0x00007fe42f364000) 
    libc.so.6 => /data8/home/wentingli/temp/glibc/build/libc.so.6 (0x00007fe42efc4000) 
    /data8/home/wentingli/temp/glibc/build/elf/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fe42f787000) 
    libdl.so.2 => /data8/home/wentingli/temp/glibc/build/dlfcn/libdl.so.2 (0x00007fe42edc0000) 
    libpthread.so.0 => /data8/home/wentingli/temp/glibc/build/nptl/libpthread.so.0 (0x00007fe42eba2000) 

내가 사용하는 어떤 memset/memcpy가 실제로 호출되었는지 확인하기 위해 gdb를 실행했지만, 좀 더 진보 된 함수 (avx2, avx512)가 in use 일 수 있다고 기대하면서 항상 __memset_sse2_unaligned_erms가 사용되었음을 보여줍니다. 내 질문은 :

  1. 는 glibc에-2.25은 자동으로 CPU/OS/메모리 주소에 따라 메모리 기능의 가장 적합한 버전을 선택 했습니까? 그렇지 않다면 glibc를 빌드하는 동안 어떤 설정이 없거나 설정이 잘못 되었습니까?
  2. 새로운 glibc에서 메모리 기능을 이식하기위한 다른 대안이 있습니까?

도움이나 제안을 보내 주시면 감사하겠습니다.

답변

0

x86에서 glibc는 일반적으로 시스템의 CPU에 가장 적합한 구현을 자동으로 선택합니다. 일반적으로 Intel의 지침을 기반으로합니다. (많은 벡터 명령의 성능 절충이 매우 복잡하기 때문에이 시나리오가 최선의 선택인지 여부는 분명하지 않을 수 있습니다.) 도구 체인에서 IFUNC를 명시 적으로 사용하지 않도록 설정 한 경우에만 발생하지만, __memset_sse2_unaligned_erms isn ' 기본 구현이므로 여기서는 적용되지 않습니다. ERMS 기능은 꽤 최근의 것이므로 완전히 비합리적인 것은 아닙니다.

새로운 glibc를 빌드하는 것이 이러한 문자열 함수를 테스트하는 올바른 방법 일 것입니다. 이론적으로는 LD_PRELOAD을 사용하여 glibc 제공 함수를 무시할 수 있지만 glibc 빌드 시스템 외부에서 문자열 함수를 작성하는 것은 약간 번거로운 작업입니다.

패치 된 glibc를 설치하지 않고 프로그램을 실행하려면 glibc 빌드 디렉토리 (또는 비슷한 접근 방식)에서 testrun.sh 스크립트를 사용해야합니다.

+0

[glibc 위키] (https://sourceware.org/glibc/wiki/Testing/Builds)는 새로운 glibc를 테스트 할 수있는 몇 가지 접근법을 제공하지만 프로덕션 환경에는 조금 복잡하고 적합하지 않은 것으로 보입니다. 일반적으로 우리는 fundermantal 핵심 시스템 구성 요소 인 glibc가 대체되어서는 안된다는 제안을 따른다. 이러한 문자열 함수를 별도로 구현하는 것은 약간 번거로운 일입니다 (특히 캐시/CPU 감지). – WindLeeWT

+0

답장을 보내 주셔서 감사합니다. 내 마음에 LD_PRELOAD와 함께 새로운 glibc를 사용하면 프로그램이 불안정 해지고 예기치 않게 충돌이 발생합니다. 맞습니까? – WindLeeWT

+0

빌드 디렉토리에있는'testrun.sh' 스크립트와 마찬가지로 제거 된 glibc에 대해 프로그램을 실행하려면 명시 적 동적 링커 호출을 사용해야합니다. –