std :: valarray和并行化
std::valarray and parallelization
可能是如此愚蠢的问题。
在此网站上,我读到
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)的大小和行为在两个翻译单元之间。并行模式功能具有不同的链接,并且不能与普通模式符号混淆。
(从这里。)
另一个可以帮助您并行化的工具是英特尔顾问。这是更先进的,也可以处理您的循环(我自己从未使用过),但是这当然是专有软件。
对于线性代数操作,您也可以寻找一个良好的平行拉帕克实施。
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何使用 OpenMP 并行化最近邻搜索
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何使用 OpenMP 正确并行化 for 循环?
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- 如何使用 Pthreads 并行化图像翻转?
- MPI:反复并行化缓冲区
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 如何在Visual Studio中并行化armadillo
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 如何并行化增加循环的大小
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- OpenMP C++:并行化 for 循环的负载不平衡
- OpenMP 条件并行化 - 并行部分中 if 子句的语法
- C++ 犰狳和OpenMp:外积求和的并行化 - 定义犰狳矩阵的约简
- 将 for 循环与嵌套的 while 循环并行化时出现 OpenMP 分段错误
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- std :: valarray和并行化