2014-01-05 2 views
6

Intel의 Haswell CPU 마이크로 아키텍처를 사용한 병렬 프로그래밍에 대해 배우고 싶습니다. SIMD 사용 : asm/C/C++/(다른 langs)의 SSE4.2, AVX2? 책, 자습서, 인터넷 자원, 코스를 추천 할 수 있습니까?Haswell 아키텍처를 사용한 병렬 프로그래밍

감사합니다.

+1

질문 범위가 너무 넓지 만 인텔 매뉴얼과 Google for Agner Fog를 읽을 수 있습니다. –

+0

고마워, 이미 http://software.intel.com/en-us/non-commercial-software-development에서 Linux 용 무료 Intel 도구를 다운로드하여 Agner Fog를 확인했습니다. –

+2

인텔 내장 설명서 : http://software.intel.com/sites/landingpage/IntrinsicsGuide/ –

답변

25

CPU에 대해 일반적으로 병렬 프로그래밍에 대해 알아야 할 것 같습니다. SSE, OpenMP 또는 내장 함수를 사용하기 전에 약 10 개월 전에이 문제를 조사하기 시작 했으므로 배운 중요한 개념과 유용한 리소스에 대해 간단히 요약 해 보겠습니다.

사용할 수있는 병렬 컴퓨팅 기술은 여러 가지가 있습니다. MIMD, SIMD, 명령어 수준 병렬 처리, 다중 레벨 명령 및 FMA입니다. Haswell과 함께 IGP에서도 컴퓨팅이 이루어지고 있습니다.

매트릭스 곱셈 또는 만델 브로 세트와 같은 주제를 선택하는 것이 좋습니다. 그들은이 모든 기술의 이점을 누릴 수 있습니다. MIMD으로

MIMD

는 여러 개의 물리적 코어를 사용하여 계산을 참조하고있다. 나는 이것을 위해 OpenMP를 추천한다. 이 자습서를 통해 http://bisqwit.iki.fi/story/howto/openmp/#Abstract 을 확인한 다음 참조 번호 https://computing.llnl.gov/tutorials/openMP/으로 사용하십시오. MIMD를 사용하는 가장 일반적인 두 가지 문제는 race conditionsfalse sharing입니다. SO를 따라 regumar를 따르십시오. 내가 그에 보일 것이다, 그래서

SIMD

많은 컴파일러는 자동 벡터화 할 수 있습니다. MSVC의 자동 벡터화는 아주 원시적이지만 GCC는 정말 좋습니다.

intrinsics를 배우십시오. intrinsic이 무엇인지 알 수있는 최상의 리소스는 http://software.intel.com/sites/landingpage/IntrinsicsGuide/

입니다. 또 다른 훌륭한 리소스는 Agner Fog의 vectorclass입니다. SSE/AVX의 SO에 대한 질문 중 95 %는 vectorclass의 소스 코드를보고 대답 할 수 있습니다. 그 중에서도 대부분의 SIMD에서 vectorclass를 사용할 수 있으며 여전히 전체 속도를 얻고 내장 함수를 건너 뛸 수 있습니다.

많은 사람들이 SIMD를 비효율적으로 사용합니다. 구조체 배열 (AOS) 및 구조체 배열 (SOA) 및 배열 구조체 배열 (AOSOA)에 대해 읽어보십시오. 인텔 스트립 마이닝을 살펴보십시오. Calculating matrix product is much slower with SSE than with straight-forward-algorithm

레이 트레이싱에서 SIMD를 구현하는 흥미로운 방법은 Ingo Wald's PhD thesis을 참조하십시오. Mandelbrot이 SSE (AVX)를 사용하여 한 번에 4 (8) 픽셀을 계산하도록 설정 한 것과 동일한 아이디어를 사용했습니다.

SIMD 사용법을 더 잘 이해하려면 "휴대용 SIMD 프로그래밍을위한 C 유사 언어 확장"(Wald http://www.cdl.uni-saarland.de/papers/leissa_vecimp_tr.pdf)을 읽어보십시오.

FMA

FMA3은 하 스웰 이후의 새로운 기능입니다. 너무 새롭기 때문에 아직 그것에 대한 논의가 많지 않습니다. 그러나이 질문에 대한 답은 How to use Fused Multiply-Add (FMA) instructions with SSE/AVX입니다. FMA3은 최대 FLOPS를 두 배로 늘려 잠재적으로 행렬 곱셈이 Ivy Bridge와 비교하여 Haswell에서 두 배 빠릅니다.

this answer에 따르면 FMA의 가장 중요한 측면은 곱셈과 덧셈을 수행하는 것이 두 가지 지침 중 하나라는 사실이 아니라 "중간 결과의 (사실상) 무한 정밀도"입니다. 예를 들어 FMA가없는 이중 더블 곱셈을 구현하는 경우 FMA에서는 두 번의 연산 만하는 반면 여섯 번의 곱셈과 여러 개의 덧셈이 필요합니다. (이러한 AnandTech review 보지 모든 포트가 동일한 MIRCO 조합을 취할 수 있지만)

명령어 레벨 병렬

스웰은에 μ-OPS를 보낼 수 8 개 포트를 가진다. 이는 Haswell이 수행 할 수 있음을 의미합니다 (예 : two 256-bit loads, one 256-bit store, two 256-bit FMA operations, one scalar addition, and a condition jump at the same time (클럭 사이클 당 6 μ-ops).

CPU로 처리되므로 대부분 걱정할 필요가 없습니다. 그러나 코드가 잠재적 인 명령어 수준의 병렬 처리를 제한 할 수있는 경우가 있습니다. 가장 보편적 인 것은 루프 종속성입니다.

스웰가있다 : 다음 코드는 루프를 수행 의존성

for(int i=0; i<n; i++) { 
    sum += x(i)*y(i); 
} 

이 부분 합계

for(int i=0; i<n; i+=2) { 
    sum1 += x(i)*y(i); 
    sum2 += x(i+1)*y(i+1); 
} 
sum = sum1 + sum2; 

멀티 레벨 캐시를 루프를 풀다하고하는 것입니다 해결하는 방법이있다 네 가지 수준의 캐시로 캐시를 최적으로 사용하기위한 코드를 작성하는 것이 제 의견으로는 가장 어려운 문제입니다. 내가 가장 애를 먹고 가장 애쓰는 주제이기는하지만 대부분의 경우 캐시 사용을 향상 시키면 다른 어떤 기술보다 우수한 성능을 제공합니다. 나는 이것에 대해 많은 추천을하지 못했다.

페이지에 대한 세트 및 캐시 라인 (그리고 중요한 스트라이드) 및 NUMA 시스템에 대해 알아야합니다. 세트와 긴 보폭에 대해 조금 배우려면 Agner Fog의 http://www.agner.org/optimize/optimizing_cpp.pdf과이 Why is transposing a matrix of 512x512 much slower than transposing a matrix of 513x513?

을 참조하십시오. 또 다른 유용한 주제는 루프 차단 또는 타일링입니다. 예를 들어 내 대답 (가장 높은 표를 얻은 답변)을 What is the fastest way to transpose a matrix in C++?에 표시하십시오.

IGP (아이리스 프로)로 컴퓨팅.

모든 Haswell 소비자 프로세서 (Haswell-E는 아직 출시되지 않음)에는 IGP가 있습니다. IGP는 실리콘의 30 % 이상을 50 % 이상까지 사용합니다. 최소 2 개의 x86 코어가 있으면 충분합니다. 이것은 대부분의 프로그래머에게 컴퓨팅 잠재력을 낭비합니다. IGP를 프로그래밍하는 유일한 방법은 OpenCL입니다. 인텔은 Linux 용 OpenCL Iris Pro 드라이버를 가지고 있지 않으므로 Windows에서만 할 수 있습니다 (Apple의 구현이 얼마나 좋은지 잘 모르겠습니다). Programming Intel IGP (e.g. Iris Pro 5200) hardware without OpenCL.

아이리스 프로의 장점 중 하나는 엔비디아와 AMD에 비해 두 배의 부동 소수점은 one quarter the speed of single floating point with the Iris Pro (however fp64 is only enabled in Direct Compute and not with OpenCL)입니다. NVIDIA와 AMD (최근)는 이중 부동 소수점이 너무 많아 GPGPU 이중 부동 소수점 컴퓨팅이 소비자 카드에별로 효과적이지 않습니다.

+2

좋은 소개 주셔서 감사합니다! –

+1

작은 수정을하겠습니다. Haswell은 동시에 두 개의 128 비트로드와 한 개의 128 비트 스토어를 수행 할 수 있다고 말했습니다. 사실 두 개의 256 비트로드와 한 개의 256- 스토어를 동시에 수행 할 수 있습니다 (한 사이클에서). 다른 한편으로는 8 개의 포트가 있어도 클럭주기 당 4 개의 명령어 (융합으로 5 개) 만 수행 할 수 있습니다. –

+0

@ Zboson : 게시물을 편집하면 댓글이 표시됩니다. – einpoklum