问题标签 [gpuarray]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
90 浏览

matlab - 如何使用 MATLAB 在 GPU 上评估一个非常复杂的函数

我在 Matlab 中有一个非常复杂的符号函数,我想在 GPU 上对其进行评估。

当我搜索时,为了评估,我们需要使用gpuArray,但是当我尝试使用以下代码在 GPU matlab 上评估函数时:

然后我收到以下错误:

问题是如果我像这样在 CPU 上运行代码,它工作正常:

我将不胜感激您能提供的任何帮助。

0 投票
2 回答
72 浏览

matlab - 如何从 3D 数组的选定列构造矩阵?

我有一个A具有维度K x M x N和长度int向量的 3D GPU 数组,并且想要构建以下形式的 2D GPU 数组vM

X = [A(:,1,v(1)), A(:,2,v(2)),..., A(:,M,v(M))](取决于v

以最省时的方式。由于所有这些都是 GPU 数组,我想知道是否有比预分配X和使用明显for循环更快的方法来完成此任务。我的代码需要调用数百万个这样的实例,所以这成为了相当大的瓶颈。如果这很重要,典型的数量级将是K = 350 000, 2<=M<=15, N<=2000

编辑:这是我试图改进的原始瓶颈代码的最小工作版本。对 3D 数组的转换A已被注释掉。根据需要调整数组大小参数。

0 投票
1 回答
112 浏览

performance - 可以用 arrayfun() (或其他方式)加速这个 gpuArray 计算吗?

我有一个复杂的矩阵A,想Nt根据A = exp( -1i*(A + abs(A).^2) ). 的大小A通常为 1000x1000,运行次数约为 10000。

我希望减少执行这些操作所需的时间。对于 CPU 上的 1000 次迭代,我测量大约 6.4 秒。根据Matlab 文档,我能够将其移至 GPU,从而将所需时间减少到 0.07 秒(令人难以置信的 x91 改进!)。到目前为止,一切都很好。

但是,我现在也阅读了文档中的这个链接,它描述了如果我们也使用元素计算,有时我们可以如何找到进一步的改进arrayfun()。如果我尝试按照教程进行操作,所花费的时间实际上更糟,时间为 0.47 秒。我的测试如下所示:

结果是:

我的问题是:

  1. 在这种情况下我是否正确使用了 arrayfun(),并且预计 arrayfun() 应该更糟?
  2. 如果是这样,并且真的只是预期它比直接 gpuArray 方法慢,是否有任何简单的(即非 MEX)方法来加快这样的计算?(例如,我看到他们还提到使用pagefun)。

提前感谢您的任何建议。

(显卡是Nvidia Quadro M4000,我运行的是Matlab R2017a)

编辑

阅读@Edric 的回答后,我认为展示更多更广泛的代码很重要。我在 OP 中没有提到的一件事是,在我的实际主代码中,在 k=1:Nt 循环中还有一个额外的操作,即矩阵乘法与稀疏三对角矩阵的转置。这是一个更充实的 MWE 真正发生的事情:

我很抱歉没有将其包含在 OP 中 - 当时我没有意识到它可能与解决方案有关。这会改变事情吗?在 GPU 上使用 arrayfun() 是否仍有收益,或者现在不适合转换为 arrayfun() ?