성능에 영향을주는 내장 함수를 연구 중이므로 조금 혼란 스럽습니다. 전혀 영향을 미치지 않는 것 같습니다! 나는 두 개의 다른 함수로 두 배의 배열을 채우려고 노력하고 있는데 차이점이 없다. 정렬 매개 변수를 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 요소 배열을 채우려고했지만 항상 동일한 실행 시간을 가졌습니다. 그럼 ... 내 접근 방식에 문제가있어? 왜 나는 차이가 보이지 않는가? 모두에게 미리 감사드립니다.
실행 시간 측정? – WildCrustacean
벤치마킹 코드도 게시하십시오. – dan3
이 C 또는 C++입니까? –