Intel似乎已经在这方面做了一些工作。
对于其他人:我不这么认为。 cppreference says该
一些C++标准库实现使用表达式模板来实现上的std ::的valarray有效操作(例如GNU的libstdC++和LLVM的libC++)。只有很少的数字是进一步优化的,如在例如。英特尔Parallel Studio。
我也没有找到任何文档说明libC++或libstdC++在这方面做了任何事情,通常没有人隐藏很酷的功能。 :)
考虑到MSVC:我曾经遇到过使用std::valarray
编译的代码,但没有链接,因为微软“忘记”实现了一些方法。这当然没有证据,但对我来说,听起来并不像在那里发生的任何酷事。我也找不到任何有关特殊功能的文档。
那么我们能做些什么呢?
其一,我们可以使用parallel mode做出的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 ::搜索行为,因此可以用并联模式和代码,如果没有实例化无并行模式下编译只编译链接代码的容器在两个翻译单元之间传递。并行模式功能具有独特的连接,不能与普通模式符号混淆。
(来自here。)
另一个可以帮助你并行化的工具是Intel Advisor。这是更先进的,也可以处理你的循环我相信(从来没有使用它自己),但当然这是专有软件。
对于线性代数运算,您还可以寻找一个良好的并行LAPACK实现。
更好的参考['std :: valarray'](http://en.cppreference.com/w/cpp/numeric/valarray) – Mgetz
请注意,某些优化是由编译器完成的,而不是库(''ftree -parallelize - 环= 4')。 –
@MarcGlisse确实如此,但这些比库中的实现更难处理。 –