我想要计算C或C++中复杂数组元素的绝对值。最简单的方法就是
for(int i = 0; i < N; i++)
{
b[i] = cabs(a[i]);
}但对于大的矢量,这将是缓慢的。是否有办法加快速度(例如,通过使用并行化)?语言可以是C语言或C++语言。
发布于 2015-11-10 10:46:44
考虑到所有循环迭代都是独立的,您可以使用以下代码进行并行化:
#pragma omp parallel for
for(int i = 0; i < N; i++)
{
b[i] = cabs(a[i]);
}当然,要使用它,您应该在编译代码时启用OpenMP支持(通常使用/openmp标志或设置项目选项)。
您可以在OpenMP中找到几个在维基中使用的示例。
发布于 2015-11-10 10:55:11
或者像这样使用Concurrency::parallele_for:
Concurrency::parallel_for(0, N, [&a, &b](int i)
{
b[i] = cabs(a[i]);
});发布于 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版本。
https://stackoverflow.com/questions/33627899
复制相似问题