- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
VexCL 似乎是一个非常有吸引力的 gpu 编程库。
不幸的是,这是一个非常年轻的图书馆,那里的信息很少。我一直在寻找如何执行矩阵 vector 乘法,但我发现的唯一矩阵表示是 vex::SpMat,它包含一个稀疏矩阵。
如果矩阵是稠密的,那么通常情况下,稀疏表示的计算效率较低。
我所有的矩阵都是密集的,我想知道如何在 VexCL 中有效地执行它。
最佳答案
我是 VexCL 的开发者图书馆。
我不得不承认密集的线性代数运算不在我的优先列表中。我认为很难以一种在 VexCL(即 OpenCL/CUDA)支持的各种设备之间实现性能可移植的方式来实现它们。此任务可能最好留给供应商 BLAS 实现(但欢迎打补丁!)。
您可能还想查看开源 ViennaCL库,它确实提供密集矩阵运算并支持 OpenCL、CUDA 和 OpenMP 后端。他们的autotuning framework允许他们获得接近供应商调优库的可移植性能。
话虽如此,对于 VexCL 中的稠密矩阵 - vector 积,您有几个选项(除了提供自定义内核外)。首先,您可以使用基于矩阵 vector 乘积定义的直接实现:
using namespace vex;
Context ctx(Filter::Env && Filter::Count(1));
// The n x m matrix stored row-wise.
vector<double> A(ctx, n * m);
// The LHS and RHS vectors.
vector<double> x(ctx, m);
vector<double> y(ctx, n);
// Make an n x m matrix from vector x by replicating it along the first
// dimension (reshape), multiply it elementwise by A, and reduce the result
// along the second dimension.
// In other words, y_i = sum_j (A_ij * x_j)
y = reduce<SUM>(
extents[n][m], // Shape of the expression to reduce,
A * reshape(
x,
extents[n][m], // (We need an n x m matrix...
extents[1] // ... but we only have vector of size m).
), // the expression,
1 // and the dimension to reduce along.
);
使用 C++14,这可以很容易地隐藏到函数调用中:
template <class M, class V>
auto prod(size_t n, size_t m, M &&A, V &&x) {
using namespace vex;
auto NxM = extents[n][m];
return reduce<SUM>(NxM, A * reshape(x, NxM, extents[1]), 1);
}
其次,您可以只使用供应商特定的库。例如,如果您将 CUDA 后端与 VexCL 一起使用,您可以获得指向 VexCL 分配的内存区域的原始指针并调用 cuBLAS gemv :
double one = 1;
double zero = 0;
cublasDgemv(
cublas_handle, CUBPLAS_OP_N, n, m,
&zero,
A(0).raw_ptr(), m,
x(0).raw_ptr(), 1
&one,
y(0).raw_ptr(), 1
);
第一种方法应该不如调用 cuBLAS 有效。它的优点是 reduce()
调用的结果是一个 vector 表达式,原则上您可以将其中的几个组合成一个单一的融合计算内核。例如,您可以计算 Ax + By
,或 sin(Ax) + cos(By)
,或 (A + B)(x - y)
,或单个内核调用中的任何其他 vector 表达式:
z = prod(n, m, A, x) + prod(n, m, B, y);
z = sin(prod(n, m, A, x)) + cos(prod(n, m, B, y));
z = prod(n, m, A + B, x - y);
这可能比几个链接的 cuBLAS 调用更有效。我有 examples因此,VexCL 的性能优于 cuBLAS 1.5 倍。
关于c++ - VexCL 中的密集矩阵 vector 乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20831683/
如何找到 VexCL vector 中最大值的索引?我可以找到最大值: int h[] = {3, 2, 1, 5, 4}; vex::vector d(ctx, 5); vex::copy(h, d
所以我知道可以在 OpenCL 中使用自定义类型。但我无法将它们与 VexCL 一起使用。创建结构的设备 vector 工作正常,但我无法执行任何操作。 由于我还没有找到任何将自定义类型与 VexCL
在 C++ 中使用 VexCL 我试图计算一个 vector 中高于某个最小值的所有值,我想在设备上执行此计数。默认的 Reductors 只提供 MIN、MAX 和 SUM 的方法,示例并没有非常清
我想制作一个“将分发给客户”的程序,所以我想保护我的内核代码免受黑客攻击“有人告诉我 AMD 驱动程序以某种方式将内核源代码放入二进制文件中,因此黑客可以登录带有 AMD 设备的内核" 因为我还没有使
VexCL 似乎是一个非常有吸引力的 gpu 编程库。 不幸的是,这是一个非常年轻的图书馆,那里的信息很少。我一直在寻找如何执行矩阵 vector 乘法,但我发现的唯一矩阵表示是 vex::SpMat
我有一个非常大的数据(不适合 GPU 内存),其中包含许多 vector ,其中每个 vector 有几个 MB。我想使用多个 GPU 设备计算使用高斯内核的 Gram 矩阵。 换句话说,对于每对 v
我使用光线追踪并使用 GPU 计算像素颜色。我之前使用的是 NVIDIA CUDA,现在想转到 VexCL。我正在尝试使用这样的代码: struct Ray; vex::Context ctx(...
只要粗略了解这些库,它们看起来就非常相似。我知道 VexCL 和 Boost.Compute 使用 OpenCl 作为后端(尽管 v1.0 版本的 VexCL 也支持 CUDA 作为后端),而 Thr
更新: 我已经在其他系统上运行过这个例子。在 Intel i7-3630QM、Intel HD4000 和 Radeon HD 7630M 上,所有结果都相同。对于 i7-4700MQ/4800MQ,
我是一名优秀的程序员,十分优秀!