【问题标题】:Efficiently transfer large file (up to 2GB) to CUDA GPU?高效地将大文件(最大 2GB)传输到 CUDA GPU?
【发布时间】:2012-03-16 03:02:14
【问题描述】:

我正在开发一个 GPU 加速程序,该程序需要读取整个可变大小的文件。我的问题是,从文件中读取并传输到协处理器(CUDA 设备)的最佳字节数是多少?

这些文件可能有 2GiB 大,因此创建该大小的缓冲区似乎不是最好的主意。

【问题讨论】:

    标签: io cuda file-transfer large-files bandwidth


    【解决方案1】:

    您可以 cudaMalloc 一个您设备上最大大小的缓冲区。在此之后,将这种大小的输入数据块从主机复制到设备,处理它,复制回结果并继续。

    // Your input data on host
    int hostBufNum = 5600000;
    int* hostBuf   = ...;
    
    // Assume this is largest device buffer you can allocate
    int devBufNum = 1000000;
    int* devBuf;
    
    cudaMalloc( &devBuf, sizeof( int ) * devBufNum );
    
    int* hostChunk  = hostBuf;
    int hostLeft    = hostBufNum;
    int chunkNum    = ( hostLeft < devBufNum ) ? hostLeft : devBufNum;
    
    do
    {
        cudaMemcpy( devBuf, hostChunk, chunkNum * sizeof( int ) , cudaMemcpyHostToDevice);
        doSomethingKernel<<< >>>( devBuf, chunkNum );
    
        hostChunk   = hostChunk + chunkNum;
        hostLeft    = hostBufNum - ( hostChunk - hostBuf );
    } while( hostLeft > 0 );    
    

    【讨论】:

    • 那部分我已经计划好了,但是输入数据块应该是什么大小?
    • 您可以在设备上分配的最大数组的大小。
    • 您可以考虑使用比内存(最多一半)更小的块的异步内存副本,并在将块 k-1 传输回主机并传输块 @ 的同时处理块 k 987654325@ 从主机到设备。双向重叠需要 Tesla GPU,但您甚至可以在 GeForce 上重叠一个方向。
    • 另外,您可以使用cuGetMemInfo 获取可用内存量。 forums.nvidia.com/index.php?showtopic=102339
    • @JasonR.Mick:从 CUDA 3.1 开始,运行时 API 中就有 cudaGetMemInfo,它可以做同样的事情,但不必在主机代码中混合运行时和驱动程序 API。
    【解决方案2】:

    如果您可以拆分功能以便处理卡上的块,您应该考虑使用流 (cudaStream_t)。

    如果您在多个流中安排加载和内核执行,您可以让一个流加载数据,而另一个流在卡上执行内核,从而在内核执行中隐藏一些数据传输时间。

    您需要声明一个缓冲区,无论您的块大小是多少倍,无论您声明多少流(据我所知,最多 16 个,计算能力为 1.x)。

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 2023-03-23
      • 1970-01-01
      • 2012-01-24
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      相关资源
      最近更新 更多