Понимание производительности и поведения инструкции clwb

Я пытаюсь понять производительность чтения / записи инструкции clwb и проверить, как она изменяется в случае записи в строку кеша по сравнению с тем, когда я ее только читаю. Я ожидаю, что для случая записи затраченное время должно быть больше, чем для случая чтения. Чтобы проверить то же самое, вот небольшой фрагмент кода, который я запускаю на процессоре Intel Xeon (skylake) и использую энергонезависимую память (NVM) для хранилища чтения и записи.

/* nvm_alloc allocates memory on NVM */
uint64_t *array = (uint64_t *) nvm_alloc(pool, 512);
uint64_t *p = &array[0];
/* separated p & q by the size of write unit in Optane (256B) */
uint64_t *q = &array[32];

uint64_t time_1 = 0;
uint64_t time_2 = 0;
uint64_t start;

volatile uint64_t x;
for(int i = 0; i < 1000000; i++)
{
        /* issues an mfence instruction */
        mfence();
        /* this is for the read case, bring p into cache */
        /* commented read case */
        //x = *p;
        /* this is for the write case, update cacheline containing p */
        *p = *p + 1;
        *q = *q + 1;
        /* rdtscp here to flush instruction pipeline */
        start = rdtscp();
        /* issue clwb on cacheline containing p */
        clwb(p);
        time_1 += rdtsc() - start;

        start = rdtsc();
        clwb(q);
        time_2 += rdtsc() - start;
}

Поскольку clwb явно не вытесняет строку кэша, следующие итерации чтения могут быть выполнены из самого кеша. В случае записи строка кэша изменяется на каждой итерации, а затем выдается clwb для ее обратной записи. Однако время, затрачиваемое на запись, почти равно времени чтения, которое я не могу понять. Если время записи не включает время обратной записи грязной строки кэша в память (или контроллер памяти)

0 ответов

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