【问题标题】:How to use both "double" functions and "single" functions from Intel MKL (cblas)如何使用英特尔 MKL (cblas) 的“双”功能和“单”功能
【发布时间】:2015-01-10 01:04:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: c g++ blas intel-mkl


    【解决方案1】:

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

    【讨论】:

    • 你是对的,参数类型也会改变,但在我建议的方法中,这只是一个额外的宏:floating_point_datatype 将被 #defined 为 doublesingle at编译时间。如果我要使用模板,我将不得不在每个不同的地方写两个专业。我有几十个(如果不是几百个)重要的地方,这会导致大量的代码重复。为什么你认为这比宏观方法更好?
    • 这并不是更好,我同意,但它可以让你用一个独特的句柄处理这两个类——processing<T>,如果其他人可能会使用你的库,这可能会更容易。事实上,我也会使用#define 魔法来进行这两种专业化,但是,这只是一个偏好问题,而不是使用模板而不是通过使用像 processing_float 这样的名称将 1970 年的 Fortran 命名方案带入 2015 年。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2016-09-26
    • 2022-07-06
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多