2016-06-24 8 views
1

여기에 표시된 PRIMATEs 암호의 비트 분할 구현을 작성했습니다 : (120 비트 버전으로 만들었습니다).QueryPerformanceCounter()에서 사이클/바이트를 계산합니다.

필자는 Intel Intrinsics를 C에서만 사용하고 AVX2 명령어 세트를 사용할 수 있도록했습니다.

구현을 약간 슬라이스했기 때문에 속도를 최적화하여 성능을 측정하고 싶었고 바이트 당 사이클을 계산했습니다. 이를 위해 Windows에서 제공하는 QueryPerformanceCounter() 함수를 사용합니다.

이제 문제가 해결되었습니다. 내 계산에서는 바이트 당 1,91 사이클을 사용하는데, 이는 reeeaaally 인 것 같습니다. 나는 내가 틀린 일을하고있는 것처럼 느껴진다. (나는 그 코더의 좋은 점이 아니다.) 이다 나는 그것을 어떻게 :

런타임 동안
//Size of testdata 
int testDataSize = 4000; //bytes 

//Get CPU frequency (cycles per sec) 
LARGE_INTEGER start, finish; 
double cpu_frequency; 
QueryPerformanceFrequency(&start); 
cpu_frequency = (double)(start.QuadPart) 

QueryPerformanceCounter(&start); 
encrypt(data); 
decrypt(data); 
QueryPerformanceCounter(&finish); 

double cyclesUsed = (double)(finish.QuadPart - start.QuadPart); 
double bytesSecond = (cpu_frequency/cyclesUsed) * testDataSize; 
double bytesCycle = bytesSecond/cpu_frequency; 
double cycles_per_byte = 1/bytesCycle; 

(즉, 시간이 암호화 및 해독)를 호출 QueryPerformanceCounter에 둘 사이에 소요되는주기가 약 7,674 사이클이다 및 을 완료 시작 사이의 델타,이다 . 4000 바이트의 시간입니다.

당연히 필자는 바이트 당 약 1.9 사이클을 사용하지만 실제로는 좋을 것 같습니다 ... 사이클/바이트 계산을 올바르게 구현하고 QueryPerformanceCounter()의 사용법을 올바르게 이해 했습니까? 아니면 지금 당장 임의의 숫자를 계산하고 있습니까?

또한 누군가가 알고있는 경우 : 현대 암호로 데이터를 암호화/암호 해독하는 것이 일반적으로 현실적인 가치입니까? 저는 이것이 지역에 주관적이며 대답하기가 어렵지만 한 발의 가치가 있다는 것을 알고 있습니다. 어느 경우 에든, 제가 올바르게 구현했는지 여부는 제가 테스트 벡터 패스를 볼 수 있기 때문에 제가 지금 알고있는 것에 가장 관심이 있습니다. 이 결과들.

Intel TurboBoost를 끄고 CPU 코어를 1 개만 사용하여 테스트를 수행합니다 .... 하이퍼 스레딩을 해제 할 수 없습니다 (Lenovo BIOS를 단순화 해 주셔서 감사합니다).하지만 코드가 다를 수 있으므로 차이가있을 수 있습니다. 싱글 스레드.

+1

rdtsc – Dani

+0

을 사용하는 것이 좋습니다. 나는 그렇게하지 않음으로써 어려운 학습 교훈을 배웠고, 지금부터 그렇게 할 것입니다. __rdtsc 유용하게 보이고, 수표를 줄 것입니다! – oPolo

답변

3

코드가 맞지만 데이터를 잘못 해석하고 있습니다. QueryPerformanceFrequency()은 CPU frenquency를 제공하지 않으며 성능 카운터 빈도를 제공합니다. 이것은 임의의 틱 (tick)의 기간으로 계산된다는 것을 의미하며 사이클이 아닙니다. Windows 성능 카운터 (CPU 빈도는 종종 동적 임)로주기 수를 구하는 쉬운 방법은 없지만 적절한 실행 시간을 얻을 수 있습니다.

+0

답변을 많이 주셔서 감사합니다. 나는 여기 뭔가가 있었다고 생각했습니다. 그것이 분명 해지면 기쁘다. 제 경우 QueryPerformanceFrequency가 2533192.00을 반환합니다. 내 CPU가 2.533Ghz (터보 부스트가 꺼져있어 그 값이 안정적이라면), 이는 내 계산이 1000 배의 계수라는 의미일까요? – oPolo

+1

@oPolo 예, 아마도. 성능 카운터는 측정시에만 유용하므로 처리량 (MB/s)을 계산해야합니다. 나는 "보통 100MHz"부분을 제거하고 있는데, 다른 부분과 혼동 스러울 것 같습니다. – ElderBug

+0

실제 성능 카운터 하드웨어는 TSC 사이클이 아닌 코어 클록 사이클을 측정하고 측정 할 수 있습니다. Windows 기능의 이름과 섞이지 마십시오. IDK는 Windows에서 어떻게 할 것인가?하지만 Linux에서는'perf stat./a.out'을 실행하고 전체 프로그램에서 몇 개의 코어 클럭 사이클을 볼 수 있습니다. –