我们如何将网络(图形)数据复制到GPU?

时间:2013-07-24 22:00:32

标签: gpu gpgpu c++-amp

如果我想用GPU在网络上做一些并行计算(通过C ++ AMP更好),我怎样才能在GPU的内存中使用网络数据?

如何将邻接列表复制到GPU的内存中使用?

邻接矩阵对于大型稀疏网络来说太大了,所以我不想使用邻接矩阵。

2 个答案:

答案 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();
}