Предоставляемые поставщиком библиотеки LAPACK / BLAS (упоминались IPP / MKL от Intel, но есть и ACML от AMD, и другие производители ЦП, такие как IBM / Power или Oracle / SPARC, также предоставляют эквиваленты) часто высоко оптимизированы для конкретных возможностей ЦП это значительно повысит производительность на больших наборах данных.
Тем не менее, часто у вас есть очень специфические небольшие данные для обработки (скажем, матрицы 4x4 или 4-точечные продукты, т.е. операции, используемые в обработке трехмерной геометрии) и для подобных вещей, BLAS / LAPACK излишне из-за начальных тестов, выполняемых этими подпрограммами, какие пути кодирования выбрать в зависимости от свойств набора данных. В этих ситуациях простой исходный код C / C ++, возможно, с использованием встроенных функций SSE2 ... 4 и / или векторизации, генерируемой компилятором, может превзойти BLAS / LAPACK.
Вот почему, например, у Intel есть две библиотеки - MKL для больших наборов данных линейной алгебры и IPP для небольших (графических векторов) наборов данных.
В этом смысле
- какой именно у вас набор данных?
- Какие размеры матрицы / вектора?
- Какие операции линейной алгебры?
Также, что касается "простых циклов": дайте компилятору возможность векторизовать для вас То есть что-то вроде:
for (i = 0; i < DIM_OF_MY_VECTOR; i += 4) {
vecmul[i] = src1[i] * src2[i];
vecmul[i+1] = src1[i+1] * src2[i+1];
vecmul[i+2] = src1[i+2] * src2[i+2];
vecmul[i+3] = src1[i+3] * src2[i+3];
}
for (i = 0; i < DIM_OF_MY_VECTOR; i += 4)
dotprod += vecmul[i] + vecmul[i+1] + vecmul[i+2] + vecmul[i+3];
может быть лучше для векторизованного компилятора, чем обычный
for (i = 0; i < DIM_OF_MY_VECTOR; i++) dotprod += src1[i]*src2[i];
выражение. В некотором смысле то, что вы подразумеваете под вычислениями для циклов , окажет значительное влияние.
Если ваши векторные размеры достаточно велики, версия BLAS,
dotprod = CBLAS.ddot(DIM_OF_MY_VECTOR, src1, 1, src2, 1);
будет более чистым кодом и, скорее всего, быстрее.
На стороне ссылки они могут представлять интерес: