使用CUDA加速MATLAB程序

MATLAB十分擅长矩阵计算,如能借助CUDA工具箱调用NVIDIA GPU加速并行运算,能起到如虎添翼的效果。

最简单的调用方法是使用gpuArray()函数数据放到GPU上运算,再用gather()函数将结果取回(前提是运算支持gpuArray类型的变量,目前尝试过的矩阵乘法、求逆、pdist、pdist2函数均支持,可惜进行二次规划的quadprog并不支持。)。

不过,我最初在windows版MATLAB下调用gather()函数经常报错,然后便无法再MATLAB中调用GPU,使用reset(gpuDevice(1)))也还是报错。百度一番之后发现原来是windows系统的显卡超时检测和恢复(TDR)功能惹的祸。关闭TDR的方法是在HKLM\System\CurrentControlSet\Control\GraphicsDrivers下创建Dword值TdrLevel,并赋值为0  (https://answers.microsoft.com/zh-hans/windows/forum/windows_7-hardware/win7%E4%B8%AD%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE/69384e71-5075-4afe-a437-372425c0a3bb?auth=1)


用常用的pdist2函数进行测试:

gpuDevice(1)
A=rand(10000,10000);
B=rand(8000,10000);

tic; C = (pdist2((A),(B))); toc
tic; D = gather(pdist2(gpuArray(A),gpuArray(B))); toc;

结果:
ans = 

  CUDADevice - 属性:

                      Name: 'GeForce GTX 1050'
                     Index: 1
         ComputeCapability: '6.1'
            SupportsDouble: 1
             DriverVersion: 9.1000
            ToolkitVersion: 8
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 4.2950e+09
           AvailableMemory: 3.4824e+09
       MultiprocessorCount: 5
              ClockRateKHz: 1493000
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 0
          CanMapHostMemory: 1
           DeviceSupported: 1
            DeviceSelected: 1

时间已过 161.138259 秒。
时间已过 41.843864 秒。
可见GPU执行pdist2这种高度并行化的运算效率高出不少。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值