可能是这么愚蠢的问题。
在this网站上,我读到了
valarray规范允许库实现它 几种效率优化,例如某些并行化 操作
目前在不同平台和编译器上并行化array(1) {
["fileField"]=>
array(5) {
["name"]=>
string(11) "101656b.jpg"
["type"]=>
string(10) "image/jpeg"
["tmp_name"]=>
string(14) "/tmp/phpZopcDK"
["error"]=>
int(0)
["size"]=>
int(16652)
}
}
是什么?海湾合作委员会,VS2010 / 2013,clang?
特别是std::valarray
的标准线程支持。
UPD :如果某些sompilers不支持此功能。执行此操作的最佳方法是:在多个线程中将一些函数应用于容器的元素?显然,天真的解决方案很短,适用于C++11
但可能存在更好的解决方案?
答案 0 :(得分:6)
Intel似乎已就此做了一些工作。
对于其他人:我不这么认为。
的cppreference says某些C ++标准库实现使用表达式模板在std :: valarray上实现高效操作(例如GNU libstdc ++和LLVM libc ++)。很少进一步优化valarrays,例如,英特尔Parallel Studio。
我也没有找到任何文档说明libc ++或libstdc ++在这方面做了什么花哨的事情,而且通常没有人会隐藏很酷的功能。 :)
考虑MSVC:我曾经遇到使用std::valarray
编译但未链接的代码,因为Microsoft“忘记”实现某些方法。这当然没有证据,但对我来说,听起来并不像在那里发生任何酷事。我也找不到任何特殊功能的文档。
首先,我们可以使用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 :: search)的大小和行为,因此,如果没有传递容器的实例化,则只能链接使用并行模式编译的代码和没有并行模式编译的代码两个翻译单位之间。并行模式功能具有明显的链接,不能与普通模式符号混淆。
(来自here。)
可以帮助您进行并行化的另一个工具是Intel Advisor。这是更先进的,也可以处理我认为的循环(我自己从未使用过),但当然这是专有软件。
对于线性代数运算,您还可以寻找一个良好的并行LAPACK实现。