_mm_stream_ps 내장 함수를 가지고 놀고 있는데 성능을 이해하는 데 어려움이 있습니다. 정말 퍼즐 무엇스트림 내장 함수가 성능을 저하시킵니다.
2.3 GHz Core i7 (I7-3615QM) (Laptop):
305.176 MB allocated
Bandwidth (non-temporal): 24.2242 GB/s
Bandwidth: 21.4136 GB/s
Xeon(R) CPU E5-2650 0 @ 2.00GHz (cluster (exclusive job)):
305.176 MB allocated
Bandwidth (non-temporal): 8.33133 GB/s
Bandwidth: 8.20684 GB/s
내가 더 나은 성능을 볼 수 있다는 것입니다 - :
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <omp.h>
#include <immintrin.h>
#define NUM_ELEMENTS 10000000L
static void copy_temporal(float* restrict x, float* restrict y)
{
for(uint64_t i = 0; i < NUM_ELEMENTS/2; ++i){
_mm_store_ps(y,_mm_load_ps(x));
_mm_store_ps(y+4,_mm_load_ps(x+4));
x+=8;
y+=8;
}
}
static void copy_nontemporal(float* restrict x, float* restrict y)
{
for(uint64_t i = 0; i < NUM_ELEMENTS/2; ++i){
_mm_stream_ps(y,_mm_load_ps(x));
_mm_stream_ps(y+4,_mm_load_ps(x+4));
x+=8;
y+=8;
}
}
int main(int argc, char** argv)
{
uint64_t sizeX = sizeof(float) * 4 * NUM_ELEMENTS;
float *x = (float*) _mm_malloc(sizeX,32);
float *y = (float*) _mm_malloc(sizeX,32);
//initialization
for(uint64_t i = 0 ; i < 4 * NUM_ELEMENTS; ++i){
x[i] = (float)rand()/RAND_MAX;
y[i] = 0;
}
printf("%g MB allocated\n",(2 * sizeX)/1024.0/1024.0);
double start = omp_get_wtime();
copy_nontemporal(x, y);
double time = omp_get_wtime() - start;
printf("Bandwidth (non-temporal): %g GB/s\n",((3 * sizeX)/1024.0/1024.0/1024.0)/time);
start = omp_get_wtime();
copy_temporal(x, y);
time = omp_get_wtime() - start;
printf("Bandwidth: %g GB/s\n",((3 * sizeX)/1024.0/1024.0/1024.0)/time);
_mm_free(x);
_mm_free(y);
return 0;
}
성능 결과 :
여기은 ... 스트림 버전 내가 함께 일하고 있어요 코드 조각입니다 - Xeon CPU (랩탑에 있지 않음) - 정렬되지 않은로드 및 저장소 (예 : storeu_ps/loadu_ps)를 사용하는 경우 :
y의 중복로드로 인해 스트림 버전이 비 스트림 버전보다 빠르다고 기대합니다. 그러나 측정 결과 스트림 버전이 실제로 비 스트림 버전보다 2 배 느린 것으로 나타났습니다.
설명이 있으십니까?
사용 된 컴파일러 : Intel 14.0.1; 컴파일러 플래그 : -O3 -restrict -xAVX; CPU 사용 : Intel Xeon E5-2650;
감사합니다.
루프를 풀 필요가 없습니다.루프 언 롤링은 종속성 체인에서만 유용하며 종속성 체인은 없습니다. CPU가이를 처리 할 수 있습니다. 나는 질문이있다. 대역폭 계산에서 3의 요인은 무엇입니까? –
두 번의 읽기 + 한 번의 쓰기. 비 시간적 버전은 하나의 읽기만 수행하지만 비교를 간단하게하기 위해 3의 요소를 유지했습니다. – user1829358