blas的C接口(我使用的是英特尔MKL)具有不同的功能,用于操作单数据类型和双数据类型的输入数据。例如,cblas_dgemm
对cblas_sgemm
。
我写了一个广泛使用这些函数的程序。我希望用户可以选择使用单精度或双精度进行计算。这仅仅意味着它所说的dgemm的每个地方都应该是sgemm(对于其他功能,依次类推)。我不想复制所有代码并替换dgemm的所有sgemm。如果没有同一代码的两个副本,我如何才能最优雅地为用户提供这两种功能?
一个可能的解决方案是用cblas gemm替换cblas dgemm的所有实例,并根据g++编译器标志-DDATATYPE_SINGLE
或-DDATATYPE_DOUBLE
使用宏将cblas gemm定义为cblas dgemm或cblas sgemm。然后,将有两个不同的可执行文件,具有相同的代码基。这是最好的解决办法吗?
最佳答案
由于不能只用单精度函数替换函数调用(参数类型也必须更改,我建议为float和double定义一个模板类,比如template <typename T> class processing
,并编写模板类的两个专门化,以便区别重要(即调用cblas例程的位置)。