конфликты определения API cblas между OpenBLAS и Eigen 3.3.4

Я новичок в Eigen и надеюсь использовать OpenBLAS в качестве бэкенда Eigen 3.3.4 на Android/ARMv7. На следующем сайте я попробовал использовать их в одном приложении (среда компиляции — ubuntu 16.04 + Android NDK r15c.),

http://eigen.tuxfamily.org/dox-devel/TopicUsingBlasLapack.html

gemm.cpp имеет следующий код:

#include <iostream>
#include <Eigen/Dense>

#include "cblas.h"

using namespace Eigen;

int main()
{
    double A[6] = {1.0, 2.0, 1.0,-3.0, 4.0,-1.0};
    double B[6] = {1.0, 2.0, 1.0,-3.0, 4.0,-1.0};
    double C[9] = {.5 , .5 , .5 , .5 , .5 , .5 , .5 , .5 , .5};
    cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans, 3, 3, 2, 1, A, 3, B, 3, 2, C, 3);

    return 0;
}

Мой Android.mk выглядит так,

LOCAL_PATH := $(call my-dir)
#build a test executable
include $(CLEAR_VARS)

LOCAL_MODULE := gemm 
LOCAL_C_INCLUDES := /home/yangfan/workspace/study/eigen-3.3.4
LOCAL_C_INCLUDES += /home/yangfan/workspace/study/openBLAS
LOCAL_SRC_FILES := $(LOCAL_PATH)/gemm.cpp
LOCAL_CFLAGS += -DEIGEN_USE_BLAS

LOCAL_CFLAGS += -fPIC -frtti -fexceptions -lz -O3
LOCAL_LDLIBS += -lm -llog -lz
LOCAL_LDLIBS += $(LOCAL_PATH)/openblas-libs/libopenblas.a

include $(BUILD_EXECUTABLE)

При попытке скомпилировать проект я столкнулся со следующими ошибками (я выбрал одну для вставки сюда),

In file included from ././gemm.cpp:4:    
In file included from /home/yangfan/workspace/study/openBLAS/cblas.h:5:    
In file included from /home/yangfan/workspace/study/openBLAS/common.h:751:    
/home/yangfan/workspace/study/openBLAS/common_interface.h:105:9: error: functions that differ only in their return type cannot be overloaded    
void BLASFUNC(dcopy) (blasint *, double *, blasint *, double *, blasint *);

/home/yangfan/workspace/study/eigen-3.3.4/Eigen/src/Core/util/../../misc/blas.h:44:8: note: previous declaration is here
int    BLASFUNC(dcopy) (int *, double *, int *, double *, int *);

Существуют разные типы возврата для одних и тех же функций blas в openblas и eigen.

Q1. Why are there different return types for the same blas APIs in OpenBLAS and Eigen?

Q2. Is there something missing? Hope some guides to use OpenBLAS as a backend of Eigen.

Q3. Which version is higher, 3.3.4 or 3.3.90? ^-^

Большое спасибо за Вашу помощь.


person yang0773    schedule 12.12.2017    source источник
comment
как насчет удаления #include "cblas.h"?   -  person ggael    schedule 12.12.2017
comment
Спасибо @ggael за быстрый отзыв.   -  person yang0773    schedule 12.12.2017
comment
Инструментальная цепочка Android жалуется на использование необъявленного идентификатора CblasColMajor, CblasNoTrans, CblasTrans. Если удалить cblas.h, где набор инструментов будет искать определения cblas? Я имею в виду, что не могу найти файлы, подобные cblas.h, в каталоге NDK.   -  person yang0773    schedule 12.12.2017


Ответы (1)


Кажется, у него есть два стиля интерфейса - fortran blas и cblas. Eigen поддерживает только вызовы fortran blas, и разработчикам не нужно предоставлять заголовочный файл. Я должен удалить Eigen/Dense, если использую только функции cblas. Но я все еще озадачен этим вопросом. Почему Eigen и openblas определяют разные типы возврата для функций в стиле fortran?

в common_interface.h OpenBLAS,

void BLASFUNC(dgemm)(char *, char *, blasint *, blasint *, blasint *, double *,
       double *, blasint *, double *, blasint *, double *, double *, blasint *);

в misc/blas.h Эйгена,

int BLASFUNC(dgemm)(const char *, const char *, const int *, const int *, const int *, const double *, 
       const double *, const int *, const double *, const int *, const double *, double *, const int *);   
person yang0773    schedule 13.12.2017