有效地将大文件(最高2GB)传输到CUDA GPU?

sj7*_*755 6 io cuda bandwidth file-transfer large-files

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

这些文件可能与2GiB一样大,因此创建这样大小的缓冲区似乎不是最好的主意.

Ash*_*ppa 4

您可以 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 );    
Run Code Online (Sandbox Code Playgroud)

  • 您可以考虑使用比内存适合的块稍小的异步内存副本(最多一半),并在将块“k-1”传输回主机并从主机传输块“k+1”的同时并行处理块“k”。主机到设备。双向重叠需要 Tesla GPU,但即使在 GeForce 上也可以单向重叠。 (5认同)