【问题标题】:matlab fn to cuda using ptx or nvmexmatlab fn 到 cuda 使用 ptx 或 nvmex
【发布时间】:2012-10-11 12:11:27
【问题描述】:

我分析了我的 matlab 代码以识别最耗时的函数,它们主要是 gradientKron matlab 函数 in this file,以便将它们写入 cuda 内核,然后 PTX 并从 matlab 调用它们。任何想法或文章会很好。mb 的计算似乎是可分离的,使它们成为分配给不同块的好候选者,这是代码的快照@ 987654324@

i2w=g0*aff(i2,a0);
[ix,iy]=grad(i2w);

ix=ix.*region;iy=iy.*region;
ix2=ix.^2;iy2=iy.^2;ixiy=ix.*iy;
it=i1-i2w;

m1=sum(sum(kron(ones(1,limy)',(1-centx:limx-centx).^2).*ix2));
m2=sum(sum(kron((1-centy:limy-centy)',(1-centx:limx-centx)).*ix2));

ps:我最近读到了关于NVMEX 的信息,对于前面提到的此类代码上的此选项的一些帮助,将不胜感激。

【问题讨论】:

  • 我想你可能已经知道了,但是如果你想在 matlab 中调用一个 cuda 函数,you don't have to use the mex interface anymore。可以直接从 matlab 函数调用 cuda C/C+(或 PTX)函数。
  • tnx 发表评论,但我说问题可能是 kron 的实现,cuda 内核中的梯度......我认为整个函数可以在 cuda 中重写,因为 m &b 的计算是可分离

标签: image matlab cuda gpu gaussian


【解决方案1】:

这是一个太长的问题,无法在一篇文章中回答,但我会给你两个提示。

如果您依赖此代码的性能足以花费大约 2 周时间编写和测试 CUDA 代码,让我告诉您我加速 Matlab 代码的方法:

提示 1:

首先以这种方式(在 matlab 中)重写有问题的函数,使其仅使用循环、内存访问和可在 CUDA 手册中找到的基本函数,如加法、乘法等。 例如在伪matlab代码中

    function result_array = MyFunctionToParallelise(constants,source_arrays)
    for x_idx=xcoords
     for y_idx=ycoords
      local_result=inner_function(x_idx,y_idx,constants,source_arrays(x_idx,y_idx));
      store(local_result to result_array(x_idx,y_idx));
     end
    end

如果您这样做并且您的“inner_function”是可并行的(独立于其他 local_results,并且可以按 x_idx、y_idx 等的任意顺序获得),那么您就在家!

  1. 用 C 语言编写你的“inner_function”(你知道 C 和 MEX,对吗?),并确保它是可编译的,返回正确的结果,并且使用内部 y_idx 和 OpenMP- 的常规循环在 mex 文件中工作用于外部 x_idx 循环的化循环。如果这样做,您通常会获得 4 倍的加速度! (由于 4 核 CPU 上的 openMP)。不需要工具箱和其他付费的东西 - 默认情况下,您可以在 Matlab 和 MEX 中获得。

  2. 为“inner_function”编写一个 CUDA 启动器。无需商业工具箱。这是简单的部分!只需将“for 循环”替换为线程和块即可。 . . .并将其插入到您以前使用常规功能的 mex 文件中。在此步骤中,预计 C 的 10 倍 - 100 倍加速。

按照这种方法,您将能够在每个小步骤中调试和验证正确性。根据我的经验,管理缓冲区指针和缓冲区大小的代码中的拼写错误是崩溃和错误结果的主要来源。很快就得到错误的结果是没有意义的!

提示2:对于一些复杂的函数(比如kron),如果你的输入和输出是固定大小的,有可能获得寄存器级优化的、线性的、非迭代的,使用计算机代数系统(如 Wolfram Mathematica)的非分支代码。此类代码在 GPU 上执行速度超快。示例:Example use of Mathematica's formula optimising compiler

【讨论】:

  • 你对这些想法很有帮助,如果我希望你看到我现在在solving the problem上的位置,我希望我不要要求更多@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多