I'm compiling a cpp file that includes mkl.h and contains a single cblas_dgemm call with the following:
icpc -DMKL_DIRECT_CALL_SEQ -DMKL_ILP64 -I/opt/intel/mkl/include -c -o main.o main.cpp
Compilation breaks and I get mutliple times the following message:
error: expression must be an lvalue or a function designator cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 4, 4, 4, 1, A, 4, B, 4, 1, C, 4);
If a remove -DMKL_DIRECT_CALL_SEQ the compilation works as expected.
Is this a bug or am I doing anything wrong?
Thank you for your interest in this functionality! Direct call support for CBLAS interfaces was introduced in Intel MKL 11.2.2, which may explain why the compilation works as expected for Intel MKL 11.2. The implementation assumes that variables, rather than literals, are passed as arguments to the cblas_dgemm call. We will need to change the implementation to allow both variables and literals to work for the CBLAS interfaces with direct call.
In the meantime, if you change your code to:
MKL_INT four = 4;
double one = 1.0;
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, four, four, four, one, A, four, B, four, one, C, four);
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, 4, 4, 4, 1, A, 4, B, 4, 1, C, 4);
does the compilation succeed?