Инструментарий многопоточности Intel Pin: Как обеспечить доступ только к разделяемым переменным между потоками?
Я использую Intel Pin для динамического инструментирования многопоточных программ с целью обнаружения некоторой гонки данных. Я инструктирую инструкции чтения / записи памяти, чтобы собрать следы памяти во время выполнения и затем проанализировать журнал. Коллекция трассировки проста: она хранит следы памяти (включая время, идентификатор потока, адрес и т. Д.) В буфере во время выполнения и записывает его в конце.
VOID PIN_FAST_ANALYSIS_CALL RecordMemRead(unsigned int ip, unsigned int addr, THREADID tid){
PIN_GetLock(&lock,tid+1);
membuf[instCounter].tid = tid;
membuf[instCounter].ip = ip;
membuf[instCounter].addr = addr;
membuf[instCounter].op = 'R';
instCounter++;
PIN_ReleaseLock(&lock);
}
VOID PIN_FAST_ANALYSIS_CALL RecordMemWrite(unsigned int ip, unsigned int addr, THREADID tid){
// similar to RecordMemRead()
}
VOID Instruction(INS ins, VOID *v){
if(INS_IsBranchOrCall(ins))
return;
if(INS_IsStackRead(ins))
return;
if(INS_IsStackWrite(ins))
return;
if (INS_IsMemoryRead(ins)){
INS_InsertPredicatedCall(ins, IPOINT_BEFORE, (AFUNPTR)RecordMemRead, IARG_FAST_ANALYSIS_CALL, IARG_INST_PTR, IARG_MEMORYREAD_EA,
IARG_THREAD_ID, IARG_END);
}
else if(INS_IsMemoryWrite(ins)){
INS_InsertPredicatedCall(ins, IPOINT_BEFORE, (AFUNPTR)RecordMemWrite, IARG_FAST_ANALYSIS_CALL, IARG_INST_PTR, IARG_MEMORYWRITE_EA,
IARG_THREAD_ID, IARG_END);
}
}
Моя проблема - серьезные накладные расходы (200x - 500x). Согласно другим работам, сбор данных трассировки должен вводить только менее чем в 100 раз. Я попытался оптимизировать его, пропустив доступ к стеку, но это не сильно помогает. Так как мои инструменты находятся на уровне детализации инструкций, регистрируется большое количество обращений. Таким образом, я думаю, что единственный способ уменьшить накладные расходы времени выполнения - это уменьшить количество обращений, которые будут собираться, то есть записывать только доступы к общим переменным между потоками (связанными с расой).
Могу ли я каким-то образом выяснить, какие обращения к общим переменным в Pin? или есть ли другие способы уменьшить накладные расходы времени выполнения?