비 상업용 개발에 사용할 수있는 Linux 용 인텔 C++ 컴파일러 인 Composer XE 2013을 최근에 다운로드하여 설치했습니다. http://software.intel.com/en-us/non-commercial-software-development인텔 C++ 컴파일러 인 ICC가 SSE/AVX 시음을 내고있는 것 같습니다.
아이비 브리지 시스템 (AVX가 있음)에서 실행 중입니다. 나는 같은 일을하는 두 가지 버전의 함수를 가지고있다. 하나는 SSE/AVX를 사용하지 않습니다. 다른 버전은 AVX를 사용합니다. GCC에서 AVX 코드는 스칼라 코드보다 약 4 배 빠릅니다. 그러나 인텔 C++ 컴파일러를 사용하면 성능이 훨씬 떨어집니다. 인텔은이
gcc m6.cpp -o m6_gcc -O3 -mavx -fopenmp -Wall -pedantic
나는이 시점에서 (omp_get_wtime()
포함) 타이밍 난 단지 OpenMP를 사용하고이
icc m6.cpp -o m6_gcc -O3 -mavx -fopenmp -Wall -pedantic
처럼 컴파일처럼 GCC와 나는 컴파일합니다. 이상한 점은 내가라고 말하는 avx 옵션을 변경하면 코드가 GCC로 컴파일되지 못하고 ICC로 잘 컴파일된다는 것입니다. 사실 나는 mavx
을 모두 삭제할 수 있으며 여전히 컴파일됩니다. 어떤 옵션을 컴파일하든 관계없이 AVX 코드를 최적으로 사용하지는 않습니다. 그래서 ICC로 SSE/AVX를 활성화/비활성화 할 때 뭔가 잘못하고 있는지 궁금합니다.
여기에 내가 사용하고있는 AVX의 기능이 있습니다.
inline void prod_block4_unroll2_AVX(double *x, double *M, double *y, double *result) {
__m256d sum4_1 = _mm256_set1_pd(0.0f);
__m256d sum4_2 = _mm256_set1_pd(0.0f);
__m256d yrow[6];
for(int i=0; i<6; i++) {
yrow[i] = _mm256_load_pd(&y[4*i]);
}
for(int i=0; i<6; i++) {
__m256d x4 = _mm256_load_pd(&x[4*i]);
for(int j=0; j<6; j+=2) {
__m256d brod1 = _mm256_set1_pd(M[i*6 + j]);
sum4_1 = _mm256_add_pd(sum4_1, _mm256_mul_pd(_mm256_mul_pd(x4, brod1), yrow[j]));
__m256d brod2 = _mm256_set1_pd(M[i*6 + j+1]);
sum4_2 = _mm256_add_pd(sum4_2, _mm256_mul_pd(_mm256_mul_pd(x4, brod2), yrow[j+1]));
}
}
sum4_1 = _mm256_add_pd(sum4_1, sum4_2);
_mm256_store_pd(result, sum4_1);
}
여기에 초 단위의 시간 정보가 있습니다. 나는 L1, L2, L3 캐시 범위에 해당하는 세 가지 범위를 돌린다. L1 영역에서 4 배 밖에 얻을 수 없습니다. ICC는 훨씬 더 빠른 스칼라 코드를 가지고 있지만 느린 AVX 코드를 가지고 있습니다.
GCC:
nvec 2000, repeat 100000
time scalar 5.847293
time SIMD 1.463820
time scalar/SIMD 3.994543
nvec 32000, repeat 10000
time scalar 9.529597
time SIMD 2.616296
time scalar/SIMD 3.642400
difference 0.000000
nvec 5000000, repeat 100
time scalar 15.105612
time SIMD 4.530891
time scalar/SIMD 3.333917
difference -0.000000
ICC:
nvec 2000, repeat 100000
time scalar 3.715568
time SIMD 2.025883
time scalar/SIMD 1.834049
nvec 32000, repeat 10000
time scalar 6.128615
time SIMD 3.509130
time scalar/SIMD 1.746477
nvec 5000000, repeat 100
time scalar 9.844096
time SIMD 5.782332
time scalar/SIMD 1.702444
의견 주셔서 감사합니다. 나는 "#include"을 포함하고있다. GCC는 예를 들어 -mavx를 사용하지 않으면 "__m256d '가이 범위에서 선언되지 않았습니다. 나는 -xHost -fast-xavx를 시도했다. 아무런 차이가 없습니다. 인텔 컴파일러의 무료 버전으로 CPU 디스패처에 대해 궁금해지기 시작했습니다. 비교할 정식 버전이 없습니다. –
FAQ에 따르면 상업용 버전과 동일한 기능이 포함되어있어 문제가 될 가능성이 적습니다. "비상업적 인 제품과 상용 제품간에 기능이 다릅니 까? 현재 비상업적 제품에는 상용 제품과 동일한 기능이 있습니다." http://software.intel.com/en-us/articles/non-commercial-software-faq/#7 –
"GCC는"-mavx를 사용하지 않으면 "이 범위에서"__m256d '가 선언되지 않았다고 말합니다. " 플래그를 전달하지 않으면 gcc가 내장 함수를 정의하지 않는다는 것을 의미합니다. – hazydev