如何使用 CUBLAS 对复数执行 Hadamard 乘积?

Posted

技术标签:

【中文标题】如何使用 CUBLAS 对复数执行 Hadamard 乘积?【英文标题】:How to perform Hadamard product with CUBLAS on complex numbers? 【发布时间】:2016-10-01 17:18:08 【问题描述】:

我需要使用 NVidia CUBLAS 计算复数的两个向量(Hadamard 积)的元素乘法。不幸的是,CUBLAS 中没有 HAD 操作。显然,您可以使用 SBMV 操作来做到这一点,但在 CUBLAS 中它没有实现复数。我不敢相信 CUBLAS 无法实现这一目标。对于复数,还有其他方法可以使用 CUBLAS 实现吗?

我无法编写自己的内核,我必须使用 CUBLAS(或其他标准 NVIDIA 库,如果 CUBLAS 确实无法实现)。

【问题讨论】:

【参考方案1】:

CUBLAS 基于参考 BLAS,reference BLAS 从未包含 Hadamard 产品(复杂的或真实的)。因此 CUBLAS 也没有。英特尔为此向 MKL 添加了v?Mul,但它是非标准的,并且在大多数 BLAS 实现中都没有。这是一种老派 fortran 程序员只会为其编写循环的操作,所以我认为它确实不需要在 BLAS 中使用专门的例程。

据我所知,没有“标准”CUDA 库实现了 Hadamard 产品。有可能使用 CUBLAS GEMM 或 SYMM 来执行此操作并提取结果矩阵的对角线,但从计算和存储的角度来看,这将是非常低效的。

Thrust 模板库可以使用 thrust::transform 轻松完成此操作,例如:

thrust::multiplies<thrust::complex<float> > op;
thrust::transform(thrust::device, x, x + n, y, z, op);

将遍历来自设备指针 x 和 y 的每对输入并计算 z[i] = x[i] * y[i] (可能需要进行一些转换来编译它,但是你明白了)。但这实际上需要在您的项目中编译 CUDA 代码,显然您不希望这样做。

【讨论】:

以上是关于如何使用 CUBLAS 对复数执行 Hadamard 乘积?的主要内容,如果未能解决你的问题,请参考以下文章

cublas如何实现异步标量变量传输

cublas 函数的重叠输入和输出

带有 cuBLAS 的 cudaMallocManaged(统一内存)

异步 cuBLAS 调用

如何在 Windows 上为 CUDA 链接库(例如 CUBLAS、CUSPARSE)

如何在 Windows 上为 CUDA 链接库(例如 CUBLAS、CUSPARSE)