可能这是一个愚蠢的问题。
在这个网站上我读到
valarray 规范允许库通过多种效率优化来实现它,例如某些操作的并行化
目前std::valarray
在不同平台和编译器上的并行化是什么?GCC,VS2010/2013,铿锵?
尤其是来自C++11
.
UPD:如果某些 sompilers 不支持此功能。最好的方法是什么:在多个线程中将某些功能应用于容器的元素?显然,天真的解决方案会很短并且可以很好地工作,std::thread
但可能存在更好的解决方案?
可能这是一个愚蠢的问题。
在这个网站上我读到
valarray 规范允许库通过多种效率优化来实现它,例如某些操作的并行化
目前std::valarray
在不同平台和编译器上的并行化是什么?GCC,VS2010/2013,铿锵?
尤其是来自C++11
.
UPD:如果某些 sompilers 不支持此功能。最好的方法是什么:在多个线程中将某些功能应用于容器的元素?显然,天真的解决方案会很短并且可以很好地工作,std::thread
但可能存在更好的解决方案?
英特尔似乎在这方面做了一些工作。
对于其他人:我不这么认为。cppreference说_
一些 C++ 标准库实现使用表达式模板来实现对 std::valarray 的高效操作(例如 GNU libstdc++ 和 LLVM libc++)。很少对 valarray 进行进一步优化,例如在 Intel Parallel Studio 中。
我也没有找到任何文档说明 libc++ 或 libstdc++ 在这方面做了什么花哨的事情,而且通常没有人隐藏很酷的功能。:)
考虑 MSVC:我曾经遇到过使用std::valarray
编译但没有链接的代码,因为微软“忘记”了实现某些方法。这当然不是证据,但对我来说,这听起来也不像那里发生了什么很酷的事情。我也在那里找不到任何特殊功能的文档。
一方面,我们可以使用并行模式使 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)的大小和行为,因此如果没有在两者之间传递容器的实例化,则只能链接以并行模式编译的代码和非并行模式编译的代码翻译单位。并行模式功能具有明显的联系,不能与正常模式符号混淆。
(从这里开始。)
另一个可以帮助您进行并行化的工具是Intel Advisor。这是更先进的,我相信也可以处理你的循环(我自己从未使用过),但当然这是专有软件。
对于线性代数运算,您还可以寻找一个好的并行 LAPACK 实现。