Динамическая память замедляется на Intel Xeon Phi

Я создаю простую процедуру умножения матриц, работающую на архитектуре Intel Xeon Phi. Процедура выглядит следующим образом (параметры A, B, C), и время не включает инициализацию:

//start timing
for(int i = 0; i < size; i++){
for(int k = 0; k < size; k++) {
register TYPE aik = A[i][k];
for(int j = 0; j < size; j++) {
C[i][j] += aik * B[k][j];
}
}
}
//end timing

Я использую ограничение, выровненные данные и так далее. Однако если матрицы распределяются с использованием динамической памяти (posix_memalign), вычисление резко замедляется, т. Е. Для матриц TYPE = float и 512×512 в динамическом случае требуется ~ 0,55 с, а в другом случае ~ 0,25. На другой архитектуре (Intel Xeon E5) также наблюдается замедление, но оно едва заметно (около 0,002 с).

Любая помощь приветствуется!

1

Решение

Что произойдет с разницей во времени, если вы сделаете матрицу другого размера? (например, 513×513)

Причина, по которой я спрашиваю, заключается в том, что, возможно, вы наблюдаете этот эффект из-за превышения ассоциативности пути кеша и изгнания элементов C [i] [] из L2, когда вы зацикливаетесь на B в цикле на k. Если B и C выровнены, а размеры — степени 2, вы можете получить супер-выравнивание кэша, вызывающее эту проблему.

Если B и C находятся в стеке или иным образом не выровнены, вы не увидите этого эффекта, так как меньшее количество адресов выровнено по степени 2.

1

Другие решения

В «нединамическом» случае массивы являются просто глобальными переменными? Если это так, они попадают в BSS, и при загрузке ELF ОС по умолчанию инициализирует их нулями — так работает BSS. Если вы выделяете их динамически, независимо от того, какой метод вы используете (например, malloc, new, posix_memalign, исключение составляет mmap (MAP_POPULATE)), вы будете вызывать сбои в ОС при касании памяти. Обработка ошибок всегда стоит дорого. На сопроцессоре это относительно дороже, потому что вы работаете на крошечном ядре с точки зрения производительности с одной стороны.

0

По вопросам рекламы [email protected]