Я хочу использовать Precise Event-Based Sampling (PEBS) для записи всех адресов определенных событий (например, пропусков кеша), на Sandy Bridge XeonE5.
Однако руководство по анализу производительности для процессоров Core TM i7 и процессоров Intel® XeonTM 5500, стр. 24, содержит следующее предупреждение:
Поскольку механизм PEBS фиксирует значения регистра при завершение инструкции, разыменованный адрес для следующий тип инструкции по загрузке (соглашение Intel asm) не может быть реконструирован.
MOV RAX, [RAX+const]
Этот вид инструкция в основном связана с указателем, преследующимmystruc = mystruc->next;
Это является значительным недостатком этого подход к захвату адресов инструкций памяти.
У меня есть несколько инструкций загрузки этой формы в моей программе в соответствии с objdump. Есть ли способ избежать этого?
Поскольку это особая проблема с Intel, решение не должно быть каким-либо переносимым, оно просто должно работать. Мой код написан на C, и я идеально ищу решение на уровне компилятора (gcc или icc), но любые предложения приветствуются.
Некоторые примеры:
mov 0x18(%rdi),%rdi
mov (%rcx,%rax,8),%rax
В обоих случаях после отмены команды (при этом, когда я смотрю на значения регистра, чтобы выяснить, где я загружался в/из), значения адресов (соответственно %rdi + 18
и %rcx + 8 * %rax
в этих примерах) перезаписываются по результату mov
.