2012-11-14 45 views
15

我知道它听起来很奇怪,但这里是我的场景:CUDA内核可以调用cublas函数吗?

我需要做矩阵矩阵乘法(A(n * k)* B(k * n)),但我只需要对角线元素对输出矩阵进行评估。我搜索cublas图书馆并没有发现任何可以做到这一点的2级或3级功能。 因此,我决定将A的每一行和B的每一列分配到CUDA线程中。对于每个线程(idx),我需要计算点积“A [idx,:] * B [:,idx]”并将其保存为相应的对角线输出。现在因为这个dot产品也需要一些时间,我想知道我是否可以在这里调用cublas函数(比如cublasSdot)来实现它。

如果我错过了一些cublas函数可以直接实现我的目标(只计算矩阵 - 矩阵乘法的对角元素),这个问题可以被丢弃。

回答

11

是的,它可以。

“CUDA C/C++中提供的语言界面和Device Runtime API是CUDA Runtime API的一个子集,CUDA Runtime API的语法和语义保留在设备上以便于可以在主机或设备环境中运行的API例程轻松实现代码重用内核还可以直接调用GPU库,例如CUBLAS,而无需返回CPU。 Source

Here你可以看到和使用CUDA和CUBLAS库函数cublasSgemv矩阵向量乘法。

+7

请注意,动态并行性,即允许嵌套内核调用的功能,仅在刚发布的Kepler GK110上受支持。 GK110仅适用于高端计算产品,中级产品是特斯拉K20,价格为3200美元。 –

+0

因此,对于特米拉m2090,这是一个费米GPU,可能不支持动态平行度,对不对? –

+0

它明确不支持,你可以创建一个不同的内核来在GPU上做到这一点 – RSFalcon7