基于Cuda的开源张量计算库ArrayFire
基于Cuda的开源张量计算库ArrayFire
1、ArrayFire介绍
关于ArrayFire ArrayFire是一个高性能的软件库,可通过易于使用的API进行并行计算。 其基于数组的功能集使并行编程更易于访问。
安装ArrayFire您可以使用Windows,OSX或Linux的二进制安装程序安装ArrayFire,也可以从源代码下载它:Windows,OSX和Linux的二进制安装程序从源代码构建易于使用数组对象非常简单。
基于数组的符号有效地表达了类似于可读数学符号的计算算法。 您不需要并行编程方面的专门知识即可使用ArrayFire。
几行ArrayFire代码完成了CUDA或OpenCL内核中可能需要数百条复杂代码的工作。
ArrayFire可扩展
支持多个域ArrayFire包含跨多个域的数百种功能,包括:矢量算法,图像处理,计算机视觉信号处理,线性代数统计等等。
ArrayFire开发人员使用所有可能的低级优化对每个功能进行了手动调整。
支持各种数据类型和大小ArrayFire可处理常见的数据形状和大小,包括矢量,矩阵,体积,并且支持常见的数据类型,包括单精度和双精度浮点值,复数,布尔值以及32位有符号和 无符号整数。
扩展ArrayFire ArrayFire可以用作独立应用程序,也可以与现有CUDA或OpenCL代码集成。 所有ArrayFire阵列都可以与其他CUDA或OpenCL数据结构互换。
编写一次代码,即可在任何地方运行!
凭借对x86,ARM,CUDA和OpenCL设备的支持,ArrayFire支持设备的完整列表。
每个ArrayFire安装都附带:用于NVIDIA GPU的CUDA版本(命名为“ libafcuda”),用于OpenCL设备的OpenCL版本(命名为“ libafccl”)和CPU版本(命名为“ libafcpu”),当CUDA或OpenCL设备为 无法使用。
ArrayFire是高效的矢量化和批处理操作ArrayFire支持N维数组上的批处理操作。 ArrayFire中的批处理操作并行运行,以确保CUDA或OpenCL设备的最佳使用。
您可以使用矢量化技术从ArrayFire中获得最佳性能。
ArrayFire还可以与gfor函数并行执行循环迭代。
即时编译ArrayFire对您的代码执行运行时分析,以提高算术强度和内存吞吐量,同时避免不必要的临时分配。 它具有一个很棒的内部JIT编译器,可以为您进行优化。
阅读有关ArrayFire JIT如何提高应用程序性能的更多信息。
简单示例这是一个实时示例,可让您查看ArrayFire代码。 您创建驻留在CUDA或OpenCL设备上的阵列。 然后,您可以在这些阵列上使用ArrayFire函数。
#include <iostream>
#include <arrayfire.h>
using namespace af;
int main() {
// sample 40 million points on the GPU
array x = randu(20e6), y = randu(20e6);
array dist = sqrt(x * x + y * y);
// pi is ratio of how many fell in the unit circle
float num_inside = sum<float>(dist < 1);
float pi = 4.0 * num_inside / 20e7;
af_print(pi);
std::cout << pi << std::endl;
return 0;
}
http://arrayfire.org/docs/installing.htm。
http://arrayfire.org/docs/index.htm
2、ArrayFire提供的数据结构
ArrayFire 主要提供了8种数据结构,分别是array,dim4,event,exception, features,index,randomEngines,seq。
class | |
| A multi dimensional data container. 是一个多维数组容器,存储的数据可以是1维、二维、三维、四维,提供了多种构造函数。More... |
class | |
| Generic object that represents size and shape. 表示有大小和形状的通用对象,More... |
class | |
| C++ RAII interface for manipulating events. 表示可以操作的对象More... |
class | |
| An ArrayFire exception class. 处理ArrayFire异常的函数 More... |
class | |
| Represents a feature returned by a feature detector. 表示特征探测器的返回结果More... |
class | |
| Wrapper for af_index. 对索引的封装More... |
class | |
| Random Number Generation Engine Class.随机数生成器 More... |
class | |
| seq is used to create sequences for indexing 带索引的序列数生成器af::array More |
3、ArrayFire提供的函数
ArrayFire提供了200多种函数,用于处理各种计算任务,这些函数可以归为15类,分别是计算机视觉类,事件类,用于生成和修改矩阵的函数,用于矩阵内部处理的函数,图像处理,输入输出函数,接口函数,线性代数,机器学习,数学函数,内存管理,信号处理,统一接口函数,向量函数。
1 | |||||||||||||||||||||||||||||||||||||||||||||||||
| A list of computer vision algorithms.一些计算机视觉的函数,包括特征描述,特征探测、特征匹配等,其中的函数大部分都要通过卷积运算完成。 | ||||||||||||||||||||||||||||||||||||||||||||||||
2 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Managing ArrayFire Events which allows manipulation of operations on computation queues.处理与计算顺序有关的事件 | ||||||||||||||||||||||||||||||||||||||||||||||||
3 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Array constructors, random number generation, transpose, indexing, etc. 矩阵的构造函数,随机数生成器,转置,索引,取行,取列,反转,数据在设备之间的移动,
| ||||||||||||||||||||||||||||||||||||||||||||||||
4 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Functions to work with arrayfire's internal data structure. 在arrayfire数组内部处理数据结构的函数 | ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
5 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Image filtering, morphing and transformations. 图像处理相关函数,比如过滤,变形、变换等
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
6 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Functions to read and write data.用于读写数据图片等
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
7 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Backend specific functions.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
8 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Matrix multiply, solve, decompositions, sparse matrix.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
9 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Machine learning functions.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
10 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Functions from standard math library.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
11 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Interfaces for writing custom memory managers.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
12 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Convolutions, FFTs, filters.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
13 | |||||||||||||||||||||||||||||||||||||||||||||||||
| A list of Statistics functions.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
14 | |||||||||||||||||||||||||||||||||||||||||||||||||
| Functions to set current backend and utilities.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
15 | |||||||||||||||||||||||||||||||||||||||||||||||||
| sum, min, max, sort, set operations, etc.
|
4、ArryFire的可视化
这部分单独在另一篇中介绍。
5、代码示例(生命游戏细胞自动机)
这是一个细胞自动机模拟生命游戏的示例
#include <iostream>
#include <arrayfire.h>
using namespace af;
int main0()
{
std::cout << "Hello World!\n";
static const float h_kernel[] = { 1, 1, 1, 1, 0, 1, 1, 1, 1 };
static const array kernel(3, 3, h_kernel, afHost);
array state = (randu(512, 512, f32) > 0.5).as(f32); // Generate starting state
Window myWindow(512, 512);
while (!myWindow.close()) {
array nHood = convolve(state, kernel); // Obtain neighbors
array C0 = (nHood == 2); // Generate conditions for life
array C1 = (nHood == 3);
state = state * C0 + C1; // Update state
myWindow.image(state); // Display
}
return EXIT_SUCCESS;
}
结果如下,可以看出计算效率非常高,显示很顺滑,即使矩阵增大为1024*1024,由于cuda的加持,实时显示仍很顺滑。