std :: valarray和并行化

std::valarray and parallelization

本文关键字:并行化 valarray std      更新时间:2023-10-16

可能是如此愚蠢的问题。

在此网站上,我读到

valarray规范允许库用它实现 几种效率优化,例如某些并行化 操作

在不同平台和编译器上std::valarray并行化目前是什么?GCC,VS2010/2013,clang?

尤其是在C++11的标准线程支持的情况下。

upd :如果某些Sompilers不支持此功能。做到这一点的最佳方法是什么:将一些功能应用于几个线程中的容器的元素?显然,幼稚的解决方案会很短,并且可以很好地与std::thread配合使用,但也许存在更好的解决方案?

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

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

一些C 标准库实现使用表达模板在std :: valarray上实现有效的操作(例如GNU LIBSTDC 和LLVM LIBC )。像瓦拉雷(Valarrays)很少进行更优化,例如英特尔并行工作室。

我还没有找到任何文档,表明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_PARALALE定义可能会更改标准类模板(例如STD :: search)的大小和行为在两个翻译单元之间。并行模式功能具有不同的链接,并且不能与普通模式符号混淆。

(从这里。)

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

对于线性代数操作,您也可以寻找一个良好的平行拉帕克实施。