CUDA固定小数据的内存

时间:2011-08-03 21:15:21

标签: cuda bandwidth

我正在为不同大小的数据运行设备带宽测试的主机,并注意到当主机内存固定为可分页时带宽增加。以下是我的带宽(MB / s)与数据传输大小(以字节为单位)的关系图。人们可以注意到,对于少量数据(<300K),可分页票价优于固定...它是否与O / S的内存分配有关? 这个带宽测试程序来自NVidia的代码示例sdk(稍微修改一下),我正在使用CUDA 4.0测试Tesla C2050。 O / S是64位Linux。

enter image description here

2 个答案:

答案 0 :(得分:1)

cudaMemcpy实现针对不同设备,源和目标位置以及数据大小具有不同的代码路径,以便尝试实现最佳吞吐量。

您看到的不同费率可能是由于数组大小更改时实施切换所致。

例如,Fermi GPU既有专用的复制引擎(可以与运行在SM上的内核并行运行),也有SM可以通过PCI-e访问主机内存。对于较小的阵列,cudaMemcpy可以更有效地实现为在直接读取主机内存的SM上运行的内核,并将加载的数据存储在设备内存中(反之亦然),因此驱动程序可以选择执行此操作。或者使用复制引擎可能更有效 - 我不确定它在实践中的作用,但我认为在它们之间切换是你在图表中看到的交叉的原因。

答案 1 :(得分:0)

测试可能是作弊。

这是一个定时代码:

cutilSafeCall( cudaEventRecord( start, 0 ) );
if( PINNED == memMode )
{
    for( unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++ )
    {
        cutilSafeCall( cudaMemcpyAsync( h_odata, d_idata, memSize,
                                cudaMemcpyDeviceToHost, 0) );
    }
}
else
{
    for( unsigned int i = 0; i < MEMCOPY_ITERATIONS; i++ )
    {
        cutilSafeCall( cudaMemcpy( h_odata, d_idata, memSize,
                                cudaMemcpyDeviceToHost) );
    }
}
cutilSafeCall( cudaEventRecord( stop, 0 ) );

注意,该测试使用不同的函数为不同类型的内存执行MemCPY。我认为,这是作弊,因为模式之间的主要区别在于如何分配内存,cudaHostAlloc用于固定,而malloc用于取消固定。

不同的Memcpy功能可以改变错误检查和传输设置的路径。

因此,尝试修改测试并使用cudaMemcpy()在两种模式下进行复制,例如将所有ifs更改为cudeEventRecord(...)if( 0 && (PINNED == memMode) )