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

标签 c++ templates matrix opencl viennacl

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/

相关文章:

python - Scipy 稀疏三角矩阵?

c++ - 尝试在 vector 类中创建调整大小函数

变量周围的 C++ 堆栈已损坏

c++ - 具有与实例一样多的参数的可变参数模板

c++ - 容器作为函数参数

Python在列表二维矩阵列表中设置一列

c++ - 替换派生对象 vector 中的对象 "no matching function to call"

c++ - 使用正则表达式提取带引号和不带引号的值

c++ - 派生为模板参数的基本转换

c - 初始化 union 类型的二维数组(整数或字符)