【发布时间】:2012-03-16 03:02:14
【问题描述】:
我正在开发一个 GPU 加速程序,该程序需要读取整个可变大小的文件。我的问题是,从文件中读取并传输到协处理器(CUDA 设备)的最佳字节数是多少?
这些文件可能有 2GiB 大,因此创建该大小的缓冲区似乎不是最好的主意。
【问题讨论】:
标签: io cuda file-transfer large-files bandwidth
我正在开发一个 GPU 加速程序,该程序需要读取整个可变大小的文件。我的问题是,从文件中读取并传输到协处理器(CUDA 设备)的最佳字节数是多少?
这些文件可能有 2GiB 大,因此创建该大小的缓冲区似乎不是最好的主意。
【问题讨论】:
标签: io cuda file-transfer large-files bandwidth
您可以 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
如果您可以拆分功能以便处理卡上的块,您应该考虑使用流 (cudaStream_t)。
如果您在多个流中安排加载和内核执行,您可以让一个流加载数据,而另一个流在卡上执行内核,从而在内核执行中隐藏一些数据传输时间。
您需要声明一个缓冲区,无论您的块大小是多少倍,无论您声明多少流(据我所知,最多 16 个,计算能力为 1.x)。
【讨论】: