пятница, 30 января 2009 г.

Производительность операции умножения матриц на процессоре IBM CELL

По результатам исследования, представленном на сайте IBM, указана производительность SPE-ядра процессора CELL на уровне 25 GFl/sec при выполнении умножения матриц. Цифра довольно-таки приличная, поэтому было решено её проверить.
Как оказалось, при типовой реализации операции умножения матриц тройным вложенным циклом производительность получается в районе 400 MFl/sec. Код примерно такой:


for (i = 0; i < _elemCount; ++i)
{
vectRes = (vector float*) (_vectRes[i]);
for (j = 0; j < _elemCount; ++j)
{
vectA = spu_splats(_vectA[i][j]);
vectB = (vector float*) (_vectB[j]);
for (k = 0; k < vectCount; ++k)
{
vectRes[k] = spu_madd(vectA, vectB[k], vectRes[k]);
}
}
}


Коэффициент зависимых инструкций данного кода порядка 64%. Это означает, что конвейер практически не загружается.
Учитывая, что размерность вектора нам, в принципе известна, можно произвести раскрытие третьего вложенного цикла и получить произвоительность на уровне 2GFl/sec. А используя опции оптимизации gcc можно добиться даже 8GFl/sec.
Понять, куда пропали оставшиеся 17GFl/sec можно изучив исходный код умножения матриц, рожденный в кулуарах IBM [5]. Программа эта содержит порядка 1000 строк кода.
Не каждый разработчик решиться реализовывать процедуру умножения матриц 1000 строками кода вместо 10.
Таким образом, в зависимости от того важна эффективность программы либо оптимальность её кода, можно расчитывать на те или иные числа производительности процедуры умножения матриц.

На сайте ГУАП "Неоднородный многоядерный процессор CELL: архитектура и программирование" представлена полная версия научной работы. Научная работа была защищена на Втором Всероссийском форуме студентов, аспирантов и молодых ученых "Наука и инновации в технических университетах".

Использовались источники:
1. Cell Broadband Engine Programming Handbook v1.1
2. Software Development Kit for Multicore Acceleration v.3.0 “Programming Tutorial”
3. C/C++ Language Extensions for Cell Broadband Engine Architecture v2.4
4. Performance Analysis with the IBM Full-System Simulator v3.0
5. Cell Repository. “src/workloads/matrix_mul/spu/block.c”, sw.workloads, sdk_pub 10/11/05 15:29:21
6. Cell Broadband Engine Architecture and its first implementation