VSIPL学习--(一)

矢量、信号和图像处理库VSIPL

目的是支持可移植的高性能应用程序。

添加了一层抽象,使其可以跨不同内存和处理器体系,具备可移植性。

VSIPL被指定为可以在各种各样的硬件上实现。

想要在给定的平台上使用VSIPL函数,必须为操作系统可用的特定硬件和工具集(链接器)提供符合VSIPL的库。由于库VSIPL API是为ANSI C定义的,因此对于实际应用,ANSI C编译器也是必要的。总之,想要在给定平台使用VSIPL函数,除了提供符合VSIPL的库之外,还需要C编译器。

功能:

支持(库初始化和最终确定•对象创建和交互•内存管理)

基本标量运算

基本向量运算

随机数生成

信号处理(FFT运算•滤波•相关和卷积)

线性代数(基本矩阵运算•线性系统解决方案•最小二乘问题解决方案)

规范性:

VSIPL规范定义的函数很多,但并非所有函数在所有实现中均可用,部分需要在特定的配置文件中定义。

VSIPL论坛批准两个配置文件:”Core“配置文件包括VSIPL库大部分信号处理和矩阵代数功能;”Core Lite“配置文件适用于基于矢量的信号处理应用。

VSIPL对象:

基于对象;

VSIPL中,块是用于存储数据的存储器的连续区域,块对象是访问块中信息所需的一种抽象数据类型;视图由一个块构成,块中的数据视图可以为向量、矩阵或更高维对象。

块和视图均不透明,只能通过库函数创建、访问和销毁;

对象数据成员是私有的;

VSIPL中的数据阵列存在于VSIPL数据空间、用户空间。VSIPL功能只能对VSIPL空间中的数据进行操作。用户提供的功能只能对用户空间中的数据进行操作。数据可以在这些逻辑空间之间移动。用户应认为VSIPL空间中的数据是不可访问的,除非通过VSIPL功能。

VSIPL特点:

支持浮点、整数数据类型,允许用户指定精度。

VSIPL库包含开发库、性能库两个版本,性能库速度高于开发库,开发库包含更多的错误检测功能,可以使用一个版本、两个版本或兼容版本。

总设计原理:

1 元素存储在一维数据阵列中,一维数据阵列是单个连续的内存块。

2 数据阵列可以被视为实数或复数向量、矩阵或张量。

3 对数据阵列的所有操作都是通过视图对象间接执行的,每个视图对象都指定具有特定偏移、长度和步长的数据阵列的特定视图。

4 一般来说,应用程序程序员不能在一条语句中组合运算符来计算表达式。返回标量的运算符可以组合,但大多数运算符将返回视图类型或为空,并且不能组合。

运算符仅限于可以通过偏移、长度和步长指定的数据数组的视图。

更随意的视图通过聚集等函数转换为这些简单的视图,并通过散射等函数再次转换为简单的视图。VSIPL不能很好地支持三角形或稀疏矩阵,尽管未来的扩展可能会解决这些问题。

“基于对象”的设计对上述原则进行了更干净的封装。

所有视图属性都封装在不透明对象中。

对象只能通过库函数创建、访问和销毁,库函数通过指针引用对象。

内存管理:

在VSIPL中,内存管理由实现来处理。

用户数据、VSIPL数据、允许、释放

对象内存分配--VSIPL中所有数据对象都由抽象数据类型组成,每次定义对象都必须在VSIPL中用VSIPL库函数为抽象数据类型分配内存

数据内存分配--VSIPL中的数据阵列存在于VSIPL数据空间、用户空间。使用不属于VSIPL标准方法分配的数据数组被视为用户数据数组,有一个指向用户数据数组的指针,可直接通过指针访问;

由VSIPL函数调用分配的数据阵列称为VSIPL数据阵列。用户没有适当的方法来检索指向这样一个数据数组的指针;它只能通过VSIPL函数调用来访问。用户可以使用被称为块的实体来访问VSIPL空间中的数据阵列。

将用户数据阵列”绑定“到块称为用户块,用户必须为用户块提供指向关联数据的指针;将VSIPL数据阵列”绑定“到块称为VSIPL块,VSIPL库将为与VSIPL块相关联的数据分配空间。没有数据绑定的块无法使用。

与数据相关联的块可能存在于两种状态中的一种,即允许和释放。允许的块中的数据在逻辑VSIPL数据空间中,而释放的块中数据在逻辑用户数据空间中。将数据从逻辑用户数据空间移动到逻辑VSIPL数据空间的过程称为准入;相反的过程称为释放。

允许块中的数据归VSIPL库所有,并且VSIPL函数在此数据上操作,假设数据将仅使用VSIPL功能进行修改。VSIPL块始终处于允许状态。用户块可能处于允许状态。除非通过VSIPL功能,否则不得对允许区块中的用户数据进行操作。通过指向分配的存储器的指针直接操纵绑定到允许的块的用户数据是不正确的,并且可能导致错误的行为。

用户可以访问已发布块中的数据,但VSIPL函数不应对其执行计算。用户块是在已发布状态下创建的。在VSIPL功能可以对绑定到块的数据进行操作之前,必须允许块进入VSIPL。用户块可以被允许由VSIPL使用,并且在应用程序需要直接访问数据时被释放。VSIPL块可能不会被释放。

用户通常希望对块的不连续子集进行操作。为了提供对此类操作的支持,VSIPL要求用户通过另一种称为视图的对象类型对块中的数据进行操作。视图允许用户指定数据阵列的不相邻子集,并通知VSIPL如何访问数据(例如,作为向量或矩阵)。创建矢量视图时,用户指定块的偏移、视图长度和步长值。对于矩阵视图,在每个维度中指定步幅和长度参数,并指定单个偏移。通过改变步长,可以创建行主矩阵或列主矩阵。

一个块上可以创建任意数量视图。

VSIPL程序结构:

在调用任何其他VSIPL函数之前,VSIPL程序必须通过调用vsip_init来初始化VSIPL库。任何使用VSIPL并终止的程序都必须在终止前调用vsip_finalize。

float.h  limit.h

1、基本标量类型

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

amyun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值