Инструментарий многопоточности Intel Pin: Как обеспечить доступ только к переменным общего доступа между потоками? - PullRequest
0 голосов
/ 08 октября 2018

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

...