首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算复杂数组的abs()-values的最快方法

问计算复杂数组的abs()-values的最快方法
EN

Stack Overflow用户
提问于 2015-11-10 10:30:05
回答 6查看 4.3K关注 0票数 16

我想要计算C或C++中复杂数组元素的绝对值。最简单的方法就是

代码语言:javascript
复制
for(int i = 0; i < N; i++)
{
    b[i] = cabs(a[i]);
}

但对于大的矢量,这将是缓慢的。是否有办法加快速度(例如,通过使用并行化)?语言可以是C语言或C++语言。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-11-10 10:46:44

考虑到所有循环迭代都是独立的,您可以使用以下代码进行并行化:

代码语言:javascript
复制
#pragma omp parallel for
for(int i = 0; i < N; i++)
{
    b[i] = cabs(a[i]);
}

当然,要使用它,您应该在编译代码时启用OpenMP支持(通常使用/openmp标志或设置项目选项)。

您可以在OpenMP中找到几个在维基中使用的示例。

票数 14
EN

Stack Overflow用户

发布于 2015-11-10 10:55:11

或者像这样使用Concurrency::parallele_for:

代码语言:javascript
复制
Concurrency::parallel_for(0, N, [&a, &b](int i)
{
b[i] = cabs(a[i]);
});
票数 5
EN

Stack Overflow用户

发布于 2015-11-10 11:40:39

使用向量运算。

如果您有glibc2.22(最近的),您可以使用OpenMP 4.0的SIMD功能到对向量/阵列进行操作。

Libmvec是Glibc 2.22中添加的向量数学库。 通过增加矢量数学函数的向量实现,增加了向量数学库来支持OpenMP4.0 (http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf中的#2.8)的SIMD结构。 向量数学函数是使用SIMD扩展实现的相应标量数学操作的向量变体(例如,用于x86_64的SSE或AVX )。它们获取填充向量参数,对填充向量参数的每个元素执行操作,并返回打包向量结果。使用向量数学函数比重复调用标量数学例程更快。

此外,请参见并行vs omp simd:何时使用?

如果在Solaris上运行,则可以显式地使用libmvec.so对复数向量进行操作,以获得每个值的绝对值:

描述 这些函数同时计算整个值向量的函数once (x,y)。..。

libmvec的源代码可以在http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libmvec/上找到,vhypot()代码(特别是在vhypot.c上)--我不记得source是否提供过libmvec.so版本。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33627899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档