3

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

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

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

4

2 回答 2

2

如果 CPU 中有数据(普通 C++ 代码),则必须使用 C++ amp 方法将其复制到 GPU。C++ AMP Overview是学习基础知识的好地方。

如果它是一个简单的数组或向量,这涉及将数据包装到一个 array_view 对象中,然后使用标记为 restrict(amp) 的方法对数据执行操作。

于 2013-07-25T07:35:32.107 回答
0

这是我能找到的最简单有用的例子。它是使用 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();
}
于 2013-09-10T14:23:47.123 回答