첫 번째 데이터 세트의 추가 실행 시간은 어떻게됩니까? 조립 지침은 동일합니다.부동 소수점 연산 실행 시간
DN_FLUSH 플래그가 켜져 있지 않으면 첫 번째 데이터 세트는 63 밀리 초가 걸리고 두 번째 세트는 15 밀리 초가 걸립니다.
DN_FLUSH 플래그가 켜지면 첫 번째 데이터 세트는 15 밀리 초가 걸리고 두 번째 세트는 ~ 0 밀리 초가 걸립니다.
따라서 두 경우 모두 첫 번째 데이터 집합의 실행 시간이 훨씬 더 깁니다.
실행 시간을 줄여서 두 번째 데이터 세트에 가까워 질 수있는 방법이 있습니까?
저는 Intel Core 2 Duo T7700 @ 2.4Ghz Windows XP Pro에서 C++ Visual Studio 2005,/arch : SSE2/fp : 빠른 실행을 사용하고 있습니다. 인텔의 최적화 설명서에서 인용
#define NUMLOOPS 1000000
// Denormal values flushed to zero by hardware on ALPHA and x86
// processors with SSE2 support. Ignored on other x86 platforms
// Setting this decreases execution time from 63 milliseconds to 16 millisecond
// _controlfp(_DN_FLUSH, _MCW_DN);
float denormal = 1.0e-38;
float denormalTwo = 1.0e-39;
float denormalThree = 1;
tickStart = GetTickCount();
// Run First Calculation Loop
for (loops=0; loops < NUMLOOPS; loops++)
{
denormalThree = denormal - denormalTwo;
}
// Get execution time
duration = GetTickCount()-tickStart;
printf("Duration = %dms\n", duration);
float normal = 1.0e-10;
float normalTwo = 1.0e-2;
float normalThree = 1;
tickStart = GetTickCount();
// Run Second Calculation Loop
for (loops=0; loops < NUMLOOPS; loops++)
{
normalThree = normal - normalTwo;
}
// Get execution time
duration = GetTickCount()-tickStart;
printf("Duration = %dms\n", duration);
GetTickCount()는 타이밍 코드에 거의 가치가 없다는 것을 알아야합니다. 입상 성은 시스템마다 매우 다양하며 아마도 100ms 정도의 큰 경향이 있습니다. QueryPerformanceCounter()를 대신 사용하십시오. –
QueryPerformanceCounter()는 사용할 고통입니다 ... timeGetTime()을 시도하십시오. 또한 GetTickCount()는 몇 초 이상 실행되는 것에 좋지 않습니다. 정확성을 알고 있어야합니다. – Inverse
BTW,/arch를 사용한다고 가정하지 마십시오 : SSE2/fp : fast는 실제로 코드를 빠르게 만듭니다.내 코드의 경우, 나는/fp : precise를 발견했으며 FP 스택을 사용하는 것이 실제로 더 빠릅니다. 마찬가지로, 수레가 double보다 빠르다고 가정하지 마십시오. 모든 옵션을 테스트하십시오. – Joe