2012-12-30 2 views
-5

성능에 영향을주는 내장 함수를 연구 중이므로 조금 혼란 스럽습니다. 전혀 영향을 미치지 않는 것 같습니다! 나는 두 개의 다른 함수로 두 배의 배열을 채우려고 노력하고 있는데 차이점이 없다. 정렬 매개 변수를 8로 설정하여 _aligned_malloc을 호출하여 배열을 할당했습니다. Visual Studio 2008을 사용하고 컴파일 모드 (/ O2 -/Od)가있는 경우와없는 경우 모두, 내장 모드가 있거나없는 경우 모두 (/ Oi) - 네 가지 조합 전부. 두 개의 다른 버전 따르내장 함수 사용/사용 안 함 C++

최후의 규격
#ifdef _NO_INTRIN 

void my_fill(double* vett, double value, int N) 
{ 
    double* last = vett + N; 
    while(vett != last) 
    { 
     *vett++ = value; 
    } 
} 

#else 

void my_fill(double* vett, double value, int N) 
{ 
    double* last = vett + N; 

    // set "classically" unaligned data, if any 
    while((0xF & (uintptr_t)vett) && vett != last) 
     *vett++ = value; 

    __m128d* vett_ = (__m128d*)vett; 
    uintptr_t fff0 = ~0 << 4; 
    // round address to nearest aligned data setting to zero least significant 4 bits 
    __m128d* last_ = (__m128d*)(fff0 & (uintptr_t)last); 
    // process until second-last element to manage odd values of N 
    for(; vett_ < last_-1; vett_++) 
    { 
     *vett_ = _mm_set1_pd(value); 
    } 

    vett = (double*)vett_; 
    while(vett != last) 
     *vett++ = value; 
}  

#endif 

, I는 8B 내 데이터를 정렬되지 16 I 어레이의 상이한 부분에 멀티 쓰레드 방식으로 이러한 함수를 수행 할 계획 때문이다. 따라서 데이터를 16B에 정렬해도 배열의 모든 부분이 정렬됩니다 (예 : 303 요소, 3 스레드, 스레드 당 101 요소, 16B에 정렬 된 첫 번째 부분, @ vett + 101을 시작하는 두 번째 부분). * 8 ==> 정렬되지 않음). 이것이 내가 정렬에 독립적 인 기능을 구현하려는 이유입니다. Intel Atom CPU N570 @ 1.66 GHz에서 1M 요소 배열을 채우려고했지만 항상 동일한 실행 시간을 가졌습니다. 그럼 ... 내 접근 방식에 문제가있어? 왜 나는 차이가 보이지 않는가? 모두에게 미리 감사드립니다.

+1

실행 시간 측정? – WildCrustacean

+0

벤치마킹 코드도 게시하십시오. – dan3

+1

이 C 또는 C++입니까? –

답변

0

정교한 계산을하지 않고 고정 값을 메모리에 쓰는 경우 프로그램 속도가 메모리 대역폭에 의해 제한 될 수 있습니다. CPU는 내부적으로 더 빠른 속도로 값을 생성 할 수 있지만 RAM으로 전송할 수있는 속도로 제한됩니다 (특히 CPU 캐시에 맞지 않는 대용량 메모리 영역을 처리 할 때 특히 그렇습니다).