Понимание производительности и поведения инструкции 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 для ее обратной записи. Однако время, затрачиваемое на запись, почти равно времени чтения, которое я не могу понять. Если время записи не включает время обратной записи грязной строки кэша в память (или контроллер памяти)