У меня где-то есть это объявление в моем заголовке:
typedef float real;
typedef int integer;
extern "C" {
extern int sgemm_(char *transa, char *transb,
integer *m, integer *n, integer *k,
const real *alpha,
const real *a, integer *lda,
const real *b, integer *ldb,
const real *beta,
real *c, integer *ldc);
}
Затем я создаю ссылки на библиотеку OpenBLAS (или, возможно, также на другие библиотеки BLAS, например MKL).А потом я прямо звоню sgemm_
в своем коде C ++.(Код должен в принципе работать с любой библиотекой BLAS.)
Я не уверен, является ли это плохой идеей или нет.Или о чем я должен позаботиться.Например, мне нужно специальное выравнивание?Или мне нужно позаботиться в многопоточных средах?
(Например, я немного искал код OpenBLAS (особенно ядро SGEMM
), и похоже, что он предполагает особые требования к выравниванию (но, возможно,Я понял это неправильно).)
В основном это работает нормально.За исключением того, что в некоторых случаях (недетерминированно, может быть, в 10% случаев, для некоторых сложных тестовых случаев я получаю nan
в моем результате; и, похоже, этого не происходит в нашем производственном коде).