2013-01-24 3 views
2

일부 기본 벤치마킹을 배우려고합니다. Java 프로그램에 루프가 있습니다.초당 부동 소수점 연산 (FLOPS) 및 초당 정수 연산 (IOPS) 계산

float a=6.5f; 
int b=3;  
for(long j=0; j<999999999; j++){    
     var = a*b+(a/b); 
    }//end of for 

내 프로세서가 처리하는 데 약 0.431635 초 걸립니다. Flops (초당 부동 소수점 연산) 및 Iops (초당 정수 연산) 측면에서 프로세서 속도를 어떻게 계산합니까? 몇 가지 단계를 설명해 줄 수 있습니까?

답변

1

반복 횟수가 999999999 회인 단일 루프가 있습니다. 간단하게하기 위해 1e9 (10 억 개)를 호출 할 수 있습니다. 정수는 두 가지를 모두 포함하는 계산에서 부동 소수점으로 승격되므로 루프에는 3 개의 부동 소수점 연산이 포함됩니다 (하나는 멀티, 하나는 add, 하나는 div이므로 3e9가 있음). 이것은 0.432 초가 걸리므로 대략 6.94 GFLOP/s (3e9/0.432)가됩니다. 마찬가지로 루프 반복 당 1 개의 정수 연산 (j++)을 수행하므로 1e9/0.432 또는 약 2.32 GIOP/s가됩니다.

그러나 계산 a*b+(a/b)은 루프 불변입니다. 따라서 최적화되지 않은 경우 상당히 놀랍습니다. Java에 대해서는 잘 모르지만 C 컴파일러는 컴파일 타임에 이것을 평가할 것이고 ab 변수와 루프를 제거하고 전체적으로 lot을 var=21.667;으로 바꿀 것입니다. 이것은 매우 기본적인 최적화이므로, javac도 그렇게하지 않으면 놀랄 것입니다.

자바에서 어떤 일이 벌어지고 있는지 전혀 알지 못하지만, 나는 7 대의 GFLOP를 얻는 것에 대해 의심 스럽습니다. 최신 Intel CPU (원칙적으로)는 올바른 명령어 조합 (하나의 add와 하나의 mult per cycle)으로 클록 사이클 당 2 개의 벡터 산술 연산이 가능하기 때문에 3 GHz 4 CPU를 사용하면 이상적인 조건에서 3e9 * 4 * 8 = 96 단 정밀도 GFLOP를 얻을 수도 있습니다. 다양한 muladd 명령어는 1 사이클의 역방향 처리량을 갖지만 div은 10 배 이상 소요되므로 한 번만 CLK/12 FLOP (단일 코어의 스칼라 분할) 이상을 얻는 것은 매우 의심 스럽습니다. 컴파일러가 코드를 벡터화 및/또는 병렬화하여 충분히 수행 할 수 있다면, 전체 루프를 최적화 할 수있을만큼 똑똑 할 것입니다.

요약하면 루프가 완전히 최적화되고 있으며보고있는 0.432 초가 오버 헤드라고 생각합니다. 위의 루프를 어떻게 타이밍을 잡을 지 아무런 언급도하지 않았으므로 확신 할 수 없습니다. 1e9 ~ 1e9 루프 반복을 1e10으로 대체하여 직접 확인할 수 있습니다. 시간이 10 배 정도가 아니라면, 당신이 생각하는 시간을 정하는 것이 아닙니다.

벤치마킹 및 프로파일 링에 대해 더 많은 이야기가 있지만 그 부분을 남겨 두겠습니다.

나는 이것이 매우 늦었다 고 알고 있지만, 누군가를 돕기를 바랍니다.

Emmet.