如何在复杂数字上使用CUBLAS执行Hadamard产品?

时间:2016-06-02 06:06:54

标签: cuda gpu nvidia cublas

我需要计算复数的两个向量(Hadamard乘积)的元素明智乘法与NVidia CUBLAS。不幸的是,CUBLAS中没有HAD操作。显然,您可以使用SBMV操作执行此操作,但它不适用于CUBLAS中的复数。我无法相信没有办法用CUBLAS实现这一目标。对于复杂的数字,有没有其他方法可以实现CUBLAS?

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

1 个答案:

答案 0 :(得分:5)

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代码,显然您不希望这样。