Matlab中GPU计时异常:GeForce GT 720数据传输耗时过高
这是个很典型的Matlab GPU延迟执行特性结合入门级显卡带宽限制导致的现象,我来一步步拆解:
1. Matlab的GPU延迟执行机制
Matlab对GPU操作做了延迟执行(Lazy Execution)优化:当你执行Agpu = gpuArray(A)这类数据传输操作时,Matlab并不会立刻把数据从CPU内存传到GPU显存,而是会把这个操作加入到GPU任务队列,直到你第一次真正需要使用GPU上的数据时(比如执行矩阵乘法C = Agpu * Bgpu),才会触发所有前置任务的执行,并且同步等待任务完成。
所以当你的代码包含矩阵乘法时,tic/toc会完整记录下「传输数据到GPU + 等待传输完成 + 执行乘法」的总时间;但当你注释掉乘法代码后,Matlab没有触发实际的传输执行(或者传输在后台异步进行,toc结束时传输还没完成),你测到的0.02秒其实只是「发起传输请求」的时间,而非数据完全传到GPU的真实耗时。
2. GT720的带宽瓶颈放大了差异
GeForce GT 720是定位极低的入门级显卡,它的PCIe接口带宽通常只有PCIe 2.0 x8甚至更低,加上显存带宽也有限,真实的数据传输速度本就很慢。当有后续GPU计算时,Matlab必须等待数据完全传输完成才能开始计算,所以传输的真实耗时(约4秒)就被完整记录了下来;而没有计算任务的话,延迟执行机制让传输任务停留在队列里,没有被强制同步执行,导致计时结果严重偏小。
验证方法
要准确测量数据传输的真实耗时,你需要在传输后强制等待GPU任务完成,用wait(gpuDevice())即可:
% 初始化GPU设备 gpu = gpuDevice(); % 创建大测试矩阵(根据你实际用的矩阵大小调整) A = rand(10000, 10000); % 准确计时数据传输 tic; Agpu = gpuArray(A); wait(gpu); % 强制等待所有GPU任务完成 toc;
不管有没有后续的矩阵乘法,这段代码的计时结果都会接近4秒,因为wait命令确保了数据完全传到GPU后才停止计时。
内容的提问来源于stack exchange,提问作者Liz Salander

