如何使用" double"功能和"单身"英特尔MKL(cblas)的功能

时间:2015-01-10 01:04:51

标签: c g++ blas intel-mkl

blas的C接口(我使用的是英特尔MKL)具有不同的功能,可以对单数据类型和双数据类型的输入数据进行操作。例如,cblas_dgemmcblas_sgemm

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

一个可能的解决方案是用cblas_gemm替换cblas_dgemm的所有实例,并使用宏来#define cblas_gemm作为cblas_dgemm或cblas_sgemm,具体取决于g ++编译器标志-DDATATYPE_SINGLE-DDATATYPE_DOUBLE。然后,将有两个不同的可执行文件,具有相同的代码库。这是最好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

由于您不能通过单精度函数替换函数调用(参数类型也必须更改,我建议为float和double定义模板类,让&#39 ; s说template <typename T> class processing,并且,对于差异很重要的地方(即你调用cblas例程的地方),写两个模板类的特化。