繁体   English   中英

std :: valarray和并行化

[英]std::valarray and parallelization

可能是这么愚蠢的问题。

这个网站上我读到了

valarray规范允许库通过多种效率优化来实现它,例如某些操作的并行化

目前在不同平台和编译器上并行化std::valarray是什么? 海湾合作委员会,VS2010 / 2013,铿锵?

特别是C++11标准线程支持。

UPD :如果一些sompilers不支持此功能。 执行此操作的最佳方法是:在多个线程中将一些函数应用于容器的元素? 显然,天真的解决方案会很短并且与std::thread运行良好但可能存在更好的解决方案?

英特尔似乎已就此做了一些工作。

对于其他人:我不这么认为。 cppreference

一些C ++标准库实现使用表达式模板在std :: valarray上实现高效操作(例如GNU libstdc ++和LLVM libc ++)。 很少进一步优化valarrays,例如Intel Parallel Studio。

我也没有找到任何文档说明libc ++或libstdc ++在这方面做了什么花哨的事情,而且通常没有人隐藏很酷的功能。 :)

考虑到MSVC:我曾经遇到使用std::valarray编译但没有链接的代码因为Microsoft“忘记”实现某些方法。 这当然没有证据,但对我来说,听起来并不像在那里发生任何酷事。 我也找不到任何特殊功能的文档。

那么我们可以做些什么呢?

首先,我们可以使用并行模式使libstdc ++将以下算法与OpenMP并行化,它认为这些算法很有用:

std::accumulate    
std::adjacent_difference    
std::inner_product    
std::partial_sum    
std::adjacent_find    
std::count    
std::count_if    
std::equal    
std::find    
std::find_if    
std::find_first_of    
std::for_each    
std::generate    
std::generate_n    
std::lexicographical_compare    
std::mismatch    
std::search    
std::search_n    
std::transform    
std::replace    
std::replace_if    
std::max_element    
std::merge    
std::min_element    
std::nth_element    
std::partial_sort    
std::partition    
std::random_shuffle    
std::set_union    
std::set_intersection    
std::set_symmetric_difference    
std::set_difference    
std::sort    
std::stable_sort    
std::unique_copy

为此,只需在编译期间定义_GLIBCXX_PARALLEL即可。 我觉得这涵盖了一大堆用数字数组做的事情。 当然

请注意,_GLIBCXX_PARALLEL定义可能会更改标准类模板(如std :: search)的大小和行为,因此,如果没有在两者之间传递容器的实例化,则只能链接使用并行模式编译的代码和无并行模式编译的代码。翻译单位。 并行模式功能具有明显的链接,不能与普通模式符号混淆。

(从这里开始

另一个可以帮助您并行化的工具是英特尔顾问 这是更先进的,也可以处理我认为的循环(从未使用过它自己),但当然这是专有软件。

对于线性代数运算,您还可以寻找一个良好的并行LAPACK实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM