c - 如何使用英特尔 MKL (cblas) 中的 "double"函数和 "single"函数

标签 c g++ blas intel-mkl

blas 的 C 接口(interface)(我使用的是 Intel MKL)在对单数据类型和双数据类型的输入数据进行操作时具有不同的函数。例如,cblas_dgemmcblas_sgemm

我编写了一个广泛使用这些函数的程序。我希望用户可以选择使用单精度或 double 进行计算。这只是意味着它说 dgemm 的每个地方都应该是 sgemm(对于其他功能等等)。我不想复制所有代码并将所有 sgemm 替换为 dgemm。在没有相同代码的两个副本的情况下,如何才能最优雅地向用户提供这两种功能?

一个潜在的解决方案是将 cblas_dgemm 的所有实例替换为 cblas_gemm,并根据 g++ 编译器标志 -DDATATYPE_SINGLE-DDATATYPE_DOUBLE 使用宏将 cblas_gemm 定义为 cblas_dgemm 或 cblas_sgemm/。然后,将有两个不同的可执行文件,具有相同的代码库。这是最好的解决方案吗?

最佳答案

因为你不能只用单精度函数替换函数调用(参数类型也必须改变,我建议为 float 和 double 定义一个模板类,比方说 template <typename T> class processing ,和, 编写模板类的两个特化,用于差异重要的地方(即调用 cblas 例程的地方)。

关于c - 如何使用英特尔 MKL (cblas) 中的 "double"函数和 "single"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27871752/

相关文章:

c - 包括导致结构别名不可见?

c++ - 如何从 g++ 链接到 VS2008 生成的 .libs

c++ - 通过信号和返回地址改变程序执行流程

NumPy 和 SciPy。静态与动态加载

c++ - 将英特尔的 MKL(BLAS 和 LAPACK)链接到 GCC

c - 在汇编中实现矩阵 vector 乘法

c++ - #define 可以被赋予定义的结果吗?

C SDL2 - 选择图像的一部分然后放大

从 char16_t* 复制到 char16_t*

c++ - g++ 6.3,avx 内在函数的 Kahan 求和使用 volatile 关键字序列化