如果我想使用 GPU 在网络上进行一些并行计算(通过 C++ AMP 更好),我如何使用 GPU 内存中的网络数据?
如何将邻接列表复制到 GPU 的内存中使用?
邻接矩阵对于大型稀疏网络来说太大了,所以我不想使用邻接矩阵。
如果 CPU 中有数据(普通 C++ 代码),则必须使用 C++ amp 方法将其复制到 GPU。C++ AMP Overview是学习基础知识的好地方。
如果它是一个简单的数组或向量,这涉及将数据包装到一个 array_view 对象中,然后使用标记为 restrict(amp) 的方法对数据执行操作。
这是我能找到的最简单有用的例子。它是使用 C++AMP 进行矩阵乘法的未优化示例。
几个关键点:
此代码未优化。查看C++ AMP Book Codeplex 项目的第 4 章文件夹中的示例以获取优化示例,并查看本书以讨论为什么以这种方式编写。根据 Dan H. 的建议,MSDN 上也有一些示例。
array_view
通过将输入声明为const
,以防止复制输出,并调用discard_data
输出以防止复制输入,可以最大限度地减少与 GPU 之间的array_view
复制。
该示例显式调用array_view::synchronize()
以保证结果已被复制回 CPU 内存。这不是严格要求的,因为在访问 array_view 数据时会发生隐式副本。例如通过读取一个元素c[i]
。
C++ AMP 队列适用于 GPU。所以工作在 GPU 上异步执行。只有在 CPU 上访问结果或进行显式同步调用时,才能保证完成。在这方面 is 的行为类似于 a std::future
。
这是代码:
void MatrixMultiply(std::vector<float>& vC,
const std::vector<float>& vA,
const std::vector<float>& vB, int M, int N, int W)
{
// Create read-only wrappers to the input data.
array_view<const float,2> a(M, W, vA);
array_view<const float,2> b(W, N, vB);
// Create a write-only wrapper to the output data.
array_view<float,2> c(M, N, vC);
c.discard_data();
// Declare a kernel to use one GPU thread per matrix element.
parallel_for_each(c.extent, [=](index<2> idx) restrict(amp)
{
int row = idx[0];
int col = idx[1];
float sum = 0.0f;
for(int i = 0; i < W; i++)
sum += a(row, i) * b(i, col);
c[idx] = sum;
});
// Force a synchronization of the result array_view data onto the CPU.
c.synchronize();
}