2012-04-08 2 views
-1

Учитывая следующий код:Ошибка кэша? как я могу это увидеть?

for (int i=0; i<n; i++) 
{ 
    counter += myArray[i]; 
} 

И в разворачивания версии Loop:

for (int i=0; i<n; i+=4) 
{ 
    counter1 += myArray[i+0]; 
    counter2 += myArray[i+1]; 
    counter3 += myArray[i+2]; 
    counter4 += myArray[i+3]; 
} 

total = counter1+ counter2 + counter3+ counter4; 
  1. Почему мы промаха кэша в первой версии?
  2. Является ли вторая версия более эффективной, чем первая? Зачем ?

С уважением

+3

Что заставляет вас думать, что есть кэш-промах в первой версии? – templatetypedef

+0

Я не уверен, что будет много разницы ... –

+0

Пахнет как домашнее задание слишком много ... – m0skit0

ответ

4

Почему мы промаха кэша в первой версии?

Как Оли указывает на комментарии. Этот вопрос необоснован. Если данные уже находятся в кеше, то промахов в кеше не будет.

В стороне, нет разницы в доступе к памяти между двумя примерами. Таким образом, это вряд ли будет фактором в любой разнице в производительности между ними.

Есть ли у второй версии лучшая производительность, чем первая? Зачем ?

Как правило, дело в том, чтобы на самом деле измерить. Но в этом конкретном примере я бы сказал, что он, скорее всего, будет быстрее. Не из-за лучшего доступа к кешу, а из-за разворачивания цикла.

Оптимизация, которую вы выполняете, называется «Разделение узлов», где вы разделяете переменную counter с целью разбить цепочку зависимостей.

Однако в этом случае вы выполняете операцию тривиального сокращения. Многие современные компиляторы могут распознать этот шаблон и сделать это разделение узлов для вас.

Так это быстрее? Скорее всего. Но вы должны проверить, не делает ли компилятор для вас.


Для записи: я только проверил это на Visual Studio 2010.
И я очень удивлен, что это не в состоянии сделать эту оптимизацию.

; 129 : 
; 130 :  int counter = 0; 
; 131 : 
; 132 :  for (int i=0; i<n; i++) 
    mov ecx, DWORD PTR n$[rsp] 
    xor edx, edx 
    test ecx, ecx 
    jle SHORT [email protected] 
[email protected]: 

; 133 :  { 
; 134 :   counter += myArray[i]; 

    add edx, DWORD PTR [rax] 
    add rax, 4 
    dec rcx 
    jne SHORT [email protected] 
[email protected]: 

; 135 :  } 

Visual Studio 2010, кажется, не способен выполнять «Node Нарезка» для этого (тривиальный) пример ...

Смежные вопросы