для рабочего кода.
от вопрос уже есть ответ здесь:
Получить количество тактов процессора? 4 ответаЯ успешно написал несколько встроенных ассемблеров в gcc, чтобы они вращались вправо, следуя некоторым хорошим инструкциям:http://www.cs.dartmouth.edu/~sergey/cs108/2009/gcc-inline-asm.pdf
Вот пример:
static inline int ror(int v) {
asm ("ror %0;" :"=r"(v) /* output */ :"0"(v) /* input */ );
return v;
}
Тем не менее, я хочу, чтобы код подсчитывал тактовые циклы, и видел некоторые в неправильном (вероятно, Microsoft) формате. Я не знаю, как сделать эти вещи в GCC. Любая помощь?
unsigned __int64 inline GetRDTSC() {
__asm {
; Flush the pipeline
XOR eax, eax
CPUID
; Get RDTSC counter in edx:eax
RDTSC
}
}
Я старался:
static inline unsigned long long getClocks() {
asm("xor %%eax, %%eax" );
asm(CPUID);
asm(RDTSC : : %%edx %%eax); //Get RDTSC counter in edx:eax
но я не знаю, как заставить пару edx: eax возвращаться как 64 бита чисто, и не знаю, как действительно очистить конвейер.
Кроме того, лучший исходный код, который я нашел, был по адресу:http://www.strchr.com/performance_measurements_with_rdtsc
и это было упоминание о Pentium, так что, если есть разные способы сделать это на разных вариантах Intel / AMD, пожалуйста, дайте мне знать. Я бы предпочел что-то, что работает на всех платформах x86, даже если это немного некрасиво, ряду решений для каждого варианта, но я не прочь узнать об этом.