内存复制速度比较:CPU<->GPU

4

我现在正在学习boost::compute开源OpenCL封装库。

我发现复制过程非常缓慢。

如果我们将CPU到CPU的复制速度比例设为1,那么GPU到CPU、GPU到GPU和CPU到GPU的复制速度有多快?

我不需要精确的数字,只需要一个大致的概念就可以了。例如,CPU到CPU至少比GPU到GPU快10倍。


2
完全取决于您的硬件设置和软件技术,但如果正确执行,应该在PCIe带宽的40到90%之间,前提是您的传输足够大(以及许多其他因素,包括您的GPU是否在16个通道插槽中)。如果我记得正确,我看到大约5-6 GB / s。 - Dithermaster
当我考虑通过Pixelcopy https://dev59.com/514c5IYBdhLWcg3wiKuU#65932521和OpenGL ES2复制图像缓冲区时,我遇到了这个问题。基本上,ram_location1到ram_location2和ram_location2到ram_location3是否比ram_location1到vram_location1和vram_location1到ram_location2更快。然而,我仍然不确定。我关心的是骁龙865。 - zeitgeist
1个回答

7

没有人回答我的问题。因此,我编写了一个程序来检查复制速度。

#include<vector>
#include<chrono>
#include<algorithm>
#include<iostream>
#include<boost/compute.hpp>
namespace compute = boost::compute;
using namespace std::chrono;
using namespace std;

int main()
{
    int sz = 10000000;
    std::vector<float> v1(sz, 2.3f), v2(sz);
    compute::vector<float> v3(sz), v4(sz);

    auto s = system_clock::now();
    std::copy(v1.begin(), v1.end(), v2.begin());
    auto e = system_clock::now();
    cout << "cpu2cpu cp " << (e - s).count() << endl;

    s = system_clock::now();
    compute::copy(v1.begin(), v1.end(), v3.begin());
    e = system_clock::now();
    cout << "cpu2gpu cp " << (e - s).count() << endl;

    s = system_clock::now();
    compute::copy(v3.begin(), v3.end(), v4.begin());
    e = system_clock::now();
    cout << "gpu2gpu cp " << (e - s).count() << endl;

    s = system_clock::now();
    compute::copy(v3.begin(), v3.end(), v1.begin());
    e = system_clock::now();
    cout << "gpu2cpu cp " << (e - s).count() << endl;
    return 0;
}

我原以为gpu2gpu的复制速度会很快。但事实上,在我的情况下,cpu2cpu是最快的,而gpu2gpu非常慢。(我的系统是Intel I3和Intel(R) HD Graphics Skylake ULT GT2。)也许并行处理是一回事,复制速度是另一回事。

cpu2cpu cp 7549776
cpu2gpu cp 18707268
gpu2gpu cp 65841100
gpu2cpu cp 65803119

我希望这个测试程序能让任何人受益。


1
如果我没记错的话,英特尔HD Graphics Skylake没有独立的显存,而是与CPU共享内存。比较不同系统的结果会很有意思。 - Pietro
1
StackOverflow需要改进。 - John Jiang
我对compute.hpp几乎一无所知,但我相信这里一定有一个大错误。也许你没有使用GPU的并行架构。或者你实际上是通过CPU发送所有内容的?CPU的复制速度绝不可能比GPU更快,这毫无意义。问候 - Stefan Reich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接