идея с планировщиком, перебором всех процессов в списке ожидающих и успешно напоролась на пропускную способность памяти. стал исследовать сабж и наткнулся на интересный факт меряю время работы цикла из 30 нопов и 4 инструкций. p0: db 30 dup(90h) add eax,[ebx] add ebx,32 add ecx,8 jnz p0 время декодирования цикла никак не меньше 17 тактов, умножитель проц/шина=5. значит в начале мы ждем 3 такта шины потом пытаемся читать, снова 3 такта ждем. это потому что кэшу Л2 надо 3 цикла чтоб доставить остатки строки в проц. то есть время работы цикла - Твнутр.проц+5(T(L2)+3); потому что последние 4 инструкции не встанут на конвейере, кроме чтения памяти. это в теории, а на практике, щитая время по формуле (dT/колво итераций)-15 получаю отрицательное число. читаю я с шагом 64 байта, так что попаданий в L1 нет. ну плюс работает предвыборка(3-1-1-1-1-1-1)по промаху(2 строки грузятся вместо одной) что может быть не так? код вроде верный весь
нашол ошибку. вдвое общитываюсь ровно. в пределах L1 - все точно по теории. но результат все равно плохой, потому что разрыв 100 тактов при выходе за первый кэш это ужасно. единственное что могу предположить что идет подгрузка двух строк, а это 10-13 циклов шины, или 50-65 тактов. но все таки не 100 же