여기에 표시된 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를 단순화 해 주셔서 감사합니다).하지만 코드가 다를 수 있으므로 차이가있을 수 있습니다. 싱글 스레드.
rdtsc – Dani
을 사용하는 것이 좋습니다. 나는 그렇게하지 않음으로써 어려운 학습 교훈을 배웠고, 지금부터 그렇게 할 것입니다. __rdtsc 유용하게 보이고, 수표를 줄 것입니다! – oPolo