Инструментарий многопоточности 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? или есть ли другие способы уменьшить накладные расходы времени выполнения?

0 ответов

Другие вопросы по тегам