【发布时间】:2020-04-22 06:22:15
【问题描述】:
我正在尝试加快以下计算,但未能达到所需的速度。我确定问题出在我的代码上,而不是 GPU 的物理限制。
我有一个 10,000 x 6 x 6 的矩阵 V。 另一个矩阵 P 是 6 x 1,000
都复杂
我需要做 V * P(应该是 10,000 x 6 x 1000) 取它的大小(或 mag sq),然后在 6 维中求和。 产生 10,000 x 1000 的实际值。
我尝试了以下方法:
af::array V{ 10000, 6, 6, c32 };
af::array P{ 6, 1000, c32 };
af::array VP = af::matmul(V, P); (results in 10,000x1000x6 - ok, as long as i still sum in the 6 dim)
af::array res = af::sum(af::abs(VP),2);
这还不够快。然后我尝试将 V 转换为数组,所以我有:
af::array V[6] = { af::array{ 10000, 6, c32 },
af::array{ 10000, 6, c32 }, af::array{ 10000, 6, c32 }, af::array{
10000, 6, c32 }, af::array{ 10000, 6, c32 }, af::array{
10000, 6, c32 } };
af::array VP[6];
af::array res;
for (int i = 0; i < 6; i++)
{
VP[i] = af::matmul(V[i], P);
}
res= af::abs(mCalledData[0]);
for (int i = 1; i < 6; i++)
{
res+= af::abs(VP[i]);
}
这有大约 2 倍的加速。我想出了另一种解决方案,但是采用 3 个数组的 af::matmult 不支持选项(如 Hermitian)并且不支持 gfor,所以我无法尝试这条路线。
目前,矩阵乘法(在这两种方法中)大约需要 2.2 毫秒,看起来 arrayfire 可以将 abs 和 sum 组合成一个需要大约 2 毫秒的 JIT 内核。
我对arrayfire 的了解有限,所以我猜有一些我没有想到的东西。有谁知道如何提高这个算法的速度?
谢谢!
【问题讨论】:
-
嗨,我是 Pradeep,来自 ArrayFire 核心团队的开发人员。我有一些疑问。 1)您有一个 10k x 6 的矩阵和另一个 6 x 1 的矩阵。 2)您希望将这两个矩阵相乘以获得 10k x 1 矩阵。但是有 6 x 10k 这样的操作。是这样吗?
-
10k x 6 x6 和 6 x 1k。这导致 10k x 1k x 6(使用 arrayfire)或者我可以做 6 个矩阵乘法,每个乘法是 [10k x 6] * [6 x 1k]。
-
我想我了解您现在想要做什么。让我在运行代码检查运行时后回复您。你的 GPU 是什么?
-
NVIDIA GeForce GTX 1070
标签: c++ math matrix matrix-multiplication arrayfire