如何使用 CUBLAS 对复数执行 Hadamard 积?
How to perform Hadamard product with CUBLAS on complex numbers?
我需要使用 NVidia CUBLAS 计算复数的两个向量(Hadamard 乘积)的逐元素乘法。不幸的是,CUBLAS 中没有 HAD 操作。显然,您可以使用 SBMV 操作来执行此操作,但它并未在 CUBLAS 中针对复数实现。我不敢相信没有办法用 CUBLAS 实现这一目标。对于复数,还有其他方法可以通过 CUBLAS 实现吗?
我无法编写自己的内核,我必须使用 CUBLAS(如果 CUBLAS 真的不可能的话,或者另一个标准的 NVIDIA 库)。
CUBLAS 基于参考 BLAS,reference BLAS has never contained a Hadamard product (complex or real). Hence CUBLAS doesn't have one either. Intel have added v?Mul
到 MKL 来执行此操作,但它是非标准的,并且不在大多数 BLAS 实现中。老派的 Fortran 程序员只会为这种操作编写一个循环,所以我认为它真的不需要在 BLAS 中专门设置一个例程。
据我所知,没有 "standard" 实现 Hadamard 产品的 CUDA 库。有可能使用 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 代码,显然您不希望这样。
我需要使用 NVidia CUBLAS 计算复数的两个向量(Hadamard 乘积)的逐元素乘法。不幸的是,CUBLAS 中没有 HAD 操作。显然,您可以使用 SBMV 操作来执行此操作,但它并未在 CUBLAS 中针对复数实现。我不敢相信没有办法用 CUBLAS 实现这一目标。对于复数,还有其他方法可以通过 CUBLAS 实现吗?
我无法编写自己的内核,我必须使用 CUBLAS(如果 CUBLAS 真的不可能的话,或者另一个标准的 NVIDIA 库)。
CUBLAS 基于参考 BLAS,reference BLAS has never contained a Hadamard product (complex or real). Hence CUBLAS doesn't have one either. Intel have added v?Mul
到 MKL 来执行此操作,但它是非标准的,并且不在大多数 BLAS 实现中。老派的 Fortran 程序员只会为这种操作编写一个循环,所以我认为它真的不需要在 BLAS 中专门设置一个例程。
据我所知,没有 "standard" 实现 Hadamard 产品的 CUDA 库。有可能使用 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 代码,显然您不希望这样。