왜 cblas_dgemm 및 cblas_sgemm 다른 포인터 유형에 함수 포인터 배열?
-
12-11-2019 - |
문제
내가 함수 포인터 배열 이는 내가 사용하여 적절한 통화 cblas_xgemm
(예를 들어, cblas_dgemm
나 cblas_sgemm
,etc., 아틀라스에서/CBLAS).
이 위대한 작품에게 말할 때 사용 cblas_dgemm
에 의해 함수 포인터;dgemm 라 적합한 인수 및 반환하는 올바른 결과입니다.
그러나 때,나는 통화 cblas_sgemm
에 의해 함수 포인터,나는 다음과 같이 출력:
ldc must be >= MAX(N,1): ldc=0 N=2Parameter 14 to routine cblas_sgemm was incorrect
내가 쓴 짧은 테스트 프로그램 는 문제를 보여 줍니다. 전화 cblas_sgemm
지 않고 함수 포인터이 잘 작동합니다.
참고 특히 다음과 같은 경고 gcc(도의 요점은 위 링크,는 방식으로 개발되었습니다 gcc 출력):
test_cblas_sgemm.c:20:3: warning: initialization from incompatible pointer type [enabled by default]
면 나는 주석으로 cblas_sgemm
라인 함수 포인터 배열의 정의하지 않은 경고,심지어 cblas_dgemm
라인입니다.하지만 그 의미가 없기 때문에 이들 모두 함수해야 하는 이와 같이!
여기에는 적절한 라인에서 cblas.h
:
void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
const int K, const float alpha, const float *A,
const int lda, const float *B, const int ldb,
const float beta, float *C, const int ldc);
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
const int K, const double alpha, const double *A,
const int lda, const double *B, const int ldb,
const double beta, double *C, const int ldc);
그래서 무엇이 있나요?그것은 어떻게든 점점 중 하나 xgemm
기능 중 하나에서 헤더와는 다른 에서 또 다른?또는 나 다루는 몇 가지 이상한 함수 포인터이 문제인가요?
해결책
귀하의 질문은 기능 포인터 배열에서 호출하려는 상이한 서명의 기능이 있다는 사실로 끓인 것으로 보인다.나는 이것을 나 자신을 시도한 적이 없지만 조금만 연구에서는 이것이 가능하다는 것처럼 보이지 않는다.이는 정적으로 입력 한 언어 가이 기동의 유형을 평가할 수 없기 때문에 의미가 있습니다.
Boost :: Variant 및 다른 해결 방법을 사용하는 제안을 보았습니다. 그러나 우리의 유익이 아닌 라이브러리에 연결하기 때문에 나는 그 옵션을 추구하는 데 많은 가치가 있는지 모르겠습니다.
증명하거나 불리 해드하는 경우 테스트 프로그램에서 CBLAS를 제거하고 여러 서명 방법이있는 클래스를 구현할 수 있으므로 데이터 유형에서만 다릅니다.
측면 메모에서는 칼럼 전공이 주요 통증입니다.