- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对两个程序进行了一些比较,这两个程序使用梅森扭曲器中的伪随机整数填充给定的 vector ,关键是 TBB 版本非常慢,std 版本在大约 0.6 秒内执行任务当TBB至少需要1.1s时。
我还注意到 TBB 并没有真正提供优化的算法来处理容器,但它只提供通用构造(parallel_for、parallel_for_each 和类似的)来处理 std 提供的通用任务 std::generate
在这种情况下,这是一个更好、更清晰的解决方案。
您可以在此处下载我的小测试,其中包含 2 个小源文件 + 用于 gcc 的 Makefile http://www.sendspace.com/file/ew73h8
我这里做错了什么?我增加这个 vector 的大小越多,TBB 就越慢,我在 Ubuntu 13.04 64 位和 Intel Q6600 下。
TBB 版本在某些方面可能会更好?
编辑:2 个文件的完整来源
config.hpp
#define N 10000000
标准.cpp
#include <random>
#include <iostream>
#include <vector>
#include <algorithm>
#include "config.hpp"
int main() {
std::vector<u_int32_t> v(N);
std::mt19937 mt;
std::uniform_int_distribution<u_int32_t> dist(0,499);
std::generate(v.begin(),v.end(),[&]{return dist(mt);});
return(0);
}
tbb.cpp
#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for_each.h>
#include <random>
#include <iostream>
#include "config.hpp"
int main()
{
tbb::concurrent_vector<u_int32_t> v(N);
std::mt19937 mt;
std::uniform_int_distribution<u_int32_t> dist(0, 499);
tbb::parallel_for_each(v.begin(),v.end(),[&](u_int32_t& e){e = dist(mt); });
return(0);
}
最佳答案
您正在为 ITBB 将控制的所有工作人员共享随机数生成器 (RNG),正如我从您的问题中看到的那样,这将是四个。撇开从多个线程改变 RNG 状态的线程安全问题不谈,我会指出对缓存的影响:从四个处理器读取和写入访问 RNG 状态使用的相同内存,这很可能是使缓存无用。
让我们试试这个:
#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for_each.h>
#include <vector>
#include <functional>
#include <random>
#include <iostream>
#include "config.hpp"
static thread_local std::mt19937 mt;
static thread_local std::uniform_int_distribution<u_int32_t> dist(0, 499);
int main()
{
std::vector<u_int32_t> v(N);
auto f = [&v](std::pair<u_int32_t, u_int32_t> const& p) {
for (size_t i=p.first; i < p.second; i++)
{
v[i] = dist( mt );
}
};
std::vector< std::pair< u_int32_t, u_int32_t > > work;
work.push_back( std::make_pair( 0, N/2) );
work.push_back( std::make_pair( N/2, N) );
tbb::parallel_for_each(
work.begin(),
work.end(),
f
);
return(0);
}
现在时间减少到标准版本的近一半(我只有双核)。代码所做的是强制 itbb 在连续的内存块中工作,而不是分发数据,而是分发工作分配。我不认为这是使用 ITBB 的最佳方式,但另一方面 parallel_for_each 不能以 block 大小提供(从我在 docs 中看到的),而使用 *parallel_for* 需要一些研究。但这并不难:
#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for.h>
#include <vector>
#include <functional>
#include <random>
#include <iostream>
#include "config.hpp"
static thread_local std::mt19937 mt;
static thread_local std::uniform_int_distribution<u_int32_t> dist(0, 499);
int main()
{
std::vector<u_int32_t> v(N);
auto f = [&v](const tbb::blocked_range<u_int32_t>& p) {
for (auto i=p.begin(); i < p.end(); i++)
{
v[i] = dist( mt );
}
};
tbb::parallel_for(
tbb::blocked_range<u_int32_t>(0,N),
f
);
return(0);
}
不使用 ITBB,您可能想在 OpenMP 中使用一些并行结构,无论如何它已经与 gcc 捆绑多年(并且您仍然可以将 ITBB 与 OpenMP 一起使用,但要小心)。
随机数和并行代码呢?他们很乱。如果您想独立地为 RNG 播种并计时,上面的代码可能就足够了。如果您想获得可重现的结果和不相关的 RNG,那么您必须注意每个生成器都由特定于线程的种子初始化,并且您还需要一种方法让每个种子通过其线程接触确定性部分工作...
关于c++ - 英特尔 TBB 比标准慢 2 倍 - tbb vs std,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252402/
我有疑问。 对于 tbb::memory_pool shared_memory_pool_; 如果在主线程中实例化。而且,我在工作线程中调用了 shared_memory_pool_.malloc(s
我想遍历图像并处理一些与元素的顺序相关的特定值。图像有一个 unsigned char*包含掩码的数组(如果应处理像素则为 255,否则为 0)和 unsigned short*具有像素值的数组。 我
我正在 MinGW32(在 Windows 7 64 位上)下构建 TBB 并成功地将一个简单的程序链接到它。不幸的是,我的同事无法成功链接。我们都运行相同版本的 Windows,相同版本的 MinG
寻找要使用的示例代码 tbb::concurrent_hash_map来自英特尔线程构建模块 (TBB)。 我可以插入,但我似乎无法读回值。 official Intel documentation示
刚刚看了TBB最新的文档。我找不到任何关于 tbb::thread 的信息,但我看到了一些关于互斥锁的信息。 顺便说一句,如果 TBB-4.x 有线程库,请帮我找到使用 tbb 线程的资源。请不要推荐
我对两个程序进行了一些比较,这两个程序使用梅森扭曲器中的伪随机整数填充给定的 vector ,关键是 TBB 版本非常慢,std 版本在大约 0.6 秒内执行任务当TBB至少需要1.1s时。 我还注意
这是我用来学习如何使用 TBB 的玩具示例。 Parallel::operator() 应该并行运行,但它有一个临界区,一次只能由一个处理器访问,因此它打印的消息不会被扰乱。我的问题是它无法编译,而且
我正在使用 SDL Tridion World 的 XSLT 中介器来创建 XSLT TBB。我的要求是,我想将一个 XSLTTBB 的输出传递到另一个 XSLT TBB。 假设我有一个名为“1”的
只是想知道 boost 或 C++11 是否具有与 tbb::queuing_mutex 和 tbb::spin_mutex 相同的互斥锁? 最佳答案 您可以在 reference 中找到支持的互斥锁
有人可以帮我解决这个错误吗? 我尝试在互联网上进行研究并尝试了不同的方法来解决问题(例如:卸载其他版本的 visual c++,添加代码等),但它们似乎都不起作用:( 我做了什么: under c/c
我正在尝试构建一个具有许多依赖项的大型项目。阻止它构建的最后一件事(?)是 TBB 未能处理 int 的类型转换进入 const tbb::& .烦人的是,同一个 Actor 使用std::atomi
我有一个用 C 语言编写的串行(非并行)应用程序。我使用英特尔线程构建模块对其进行了修改和重写。当我在四核机器 AMD Phenom II 机器上运行这个并行版本时,我获得了超过 4 倍的性能增益,这
我有一个视频检索系统,在检索过程中会占用大量内存。我知道 tbb 可扩展分配器将释放的内存释放到内存池,并且不会将其返回给操作系统。这是否意味着该池将始终在其池中拥有那些先前分配的内存,而当其他线程需
我正在tbb::parallel_for_each中深入运行task_group。 task_group被取消,这似乎导致tbb::parallel_for_each在不满足其后置条件的情况下退出。这
我有一个非常简单的parallel_for循环 tbb::parallel_for(tbb::blocked_range(0, values.size()), [&](tbb::blo
假设我有一个并行算法,它使用带有一个或两个锁的显式线程进行同步,并经过优化以利用缓存行(包括多个内核之间的共享 L3 缓存),将其合并到 TBB 程序中的好方法是什么?所讨论的算法并没有像分解成线程那
我想在大型数据集上运行 tbb::parallel_for 并生成一个唯一的集。 parallel_for 主体中包含一些额外的逻辑,用于确定原始数据集的每个子元素是否应包含在该集合中。结果集通常比原
在我之前的问题中,我使用带有输入、转换和输出过滤器的 C++ (Linux) 实现了一个 TBB 管道: incorrect output with TBB pipeline Input 过滤器正在从
我们有一段代码利用 TBB 生成任务来执行一些处理,这是使用以下 TBB 代码初始化 TBB 线程池(以匹配核心数)完成的: tbb::task_scheduler_init(8); 然后对于我们想要
我正在尝试通过 TBB 任务和延续来遍历树。代码如下。当我运行代码时,它不断中止(经常,但不总是)并出现以下错误: Assertion t_next->state()==task::allocated
我是一名优秀的程序员,十分优秀!