gpt4 book ai didi

具有临时消除功能的 C++ OpenCL 矩阵库

转载 作者:行者123 更新时间:2023-11-30 01:15:11 25 4
gpt4 key购买 nike

Armadillo 矩阵库写

Armadillo employs a delayed evaluation approach to combine several operations into one and reduce (or eliminate) the need for temporaries. Where applicable, the order of operations is optimised. Delayed evaluation and optimisation are achieved through recursive templates and template meta-programming.

这意味着你可以写这样的操作

arma::mat A, B;
arma::vec c, d;
...
d=(A % B)*c;

并且没有创建临时变量。 (注意 % 是 Armadillo 中的逐元素乘积操作)

我希望能够以类似的风格为 OpenCL 应用程序编写代码。

我看过的库有 VexCL、ViennaCL、Boost.Compute 和 clBLAS。 VexCL 和 Boost.Compute 甚至不提供基本的矩阵功能,例如乘法。 clBLAS 不能用作模板库,因此您需要手动调用这些操作。 ViennaCL 提供了我需要的所有操作,但它似乎无法将它们链接在一起。

例如

    d= linalg::prod(linalg::element_prod(A,B), c);

编译失败。

我认为有可能使用 VexCL 根据 Armadillo 决定的操作自动生成内核,但我看不出有任何方法可以直接实现这一点。

有什么建议吗?

最佳答案

您可能想查看 ArrayFire .

ArrayFire 是一个基于矩阵的库,带有 JIT 编译引擎,允许您将操作组合到一个内核中。这大大减少了您在上面发布的基本元素明智操作的内核调用次数。例如,您发布的代码可以写成:

array A = randu(5, 5);       // 5x5 Matrix
array B = randu(5, 5); // 5x5 Matrix
array c = constant(1, 1, 5); // 1x5 Matrix

array d = (A % B) + tile(c, 5);

在此示例中,模数和加法将在一个 OpenCL 内核中执行。没有创建临时文件。我们还有用于单线程 CPU、CUDA 和 OpenCL 的后端。

披露:我是 ArrayFire 库的开发人员之一。

关于具有临时消除功能的 C++ OpenCL 矩阵库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28911497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com