如果我想用GPU在网络上做一些并行计算(通过C ++ AMP更好),我怎样才能在GPU的内存中使用网络数据?
如何将邻接列表复制到GPU的内存中使用?
邻接矩阵对于大型稀疏网络来说太大了,所以我不想使用邻接矩阵。
答案 0 :(得分:2)
如果您拥有CPU中的数据(普通C ++代码),则必须使用C ++放大器方法将其复制到GPU。 C++ AMP Overview是学习基础知识的好地方。
如果它是一个简单的数组或向量,则涉及将数据包装到array_view对象中,然后使用标有restrict(amp)的方法对数据执行操作。
答案 1 :(得分:0)
这是我能找到的最简单有用的例子。它是使用C ++ AMP进行矩阵乘法的未经优化的例子。
一些关键点:
此代码未优化。查看C++ AMP Book Codeplex project的Chapter4文件夹中的示例以获取优化示例,并阅读本书以讨论为何以这种方式编写。 Dan H建议在MSDN上也有例子。
将输入array_view
声明为const
,以防止复制,并在输出discard_data
上调用array_view
以防止复制,从而最大限度地减少与GP的复制复制。
该示例显式调用array_view::synchronize()
以保证结果已复制回CPU内存。这不是严格要求的,因为访问array_view数据时会发生隐式副本。例如,通过阅读元素c[i]
。
C ++ AMP队列适用于GPU。因此,工作在GPU上异步执行。只有在CPU上访问结果或进行显式同步调用时才能保证完成。在这方面,其行为类似于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();
}