2015-05-03 31 views
6

可能是这么愚蠢的问题。std :: valarray和并行化

this网站,我读了

的valarray的规范允许库与 几个效率的优化,如某些 操作的并行执行它

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

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

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

+1

更好的参考['std :: valarray'](http://en.cppreference.com/w/cpp/numeric/valarray) – Mgetz

+1

请注意,某些优化是由编译器完成的,而不是库(''ftree -parallelize - 环= 4')。 –

+0

@MarcGlisse确实如此,但这些比库中的实现更难处理。 –

回答

5

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实现。