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

Bap*_*cht 0 cuda gpu nvidia cublas

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

我不能编写自己的内核,我必须使用CUBLAS(或其他标准的NVIDIA库,如果CUBLAS真的不可能).

tal*_*ies 6

CUBLAS基于参考BLAS,参考BLAS从未包含Hadamard产品(复杂或真实).因此CUBLAS也没有.英特尔已经添加v?Mul到MKL这样做,但它是非标准的,而不是在大多数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);
Run Code Online (Sandbox Code Playgroud)

将迭代来自设备指针x和y的每对输入并计算z [i] = x [i]*y [i](可能需要进行几次转换才能编译它,但是你得到了理念).但这实际上需要在项目中编译CUDA代码,显然你不希望这样.