如何将intel的TBB库静态链接到我的应用程序?我知道所有警告,例如调度程序的不公平负载分配,但我不需要调度程序,只需要容器,所以没关系.
无论如何我知道这可以做到,虽然它没有记录,但我现在似乎无法找到方法(尽管我在某处之前已经看过它).
那么有人知道或有任何线索吗?
谢谢
我有一个算法将拜耳图像通道转换为RGB.在我的实现中,我有一个嵌套for循环,它遍历拜耳通道,从拜耳索引计算rgb索引,然后从拜耳通道设置该像素的值.这里要注意的主要事实是每个像素可以独立于其他像素计算(不依赖于先前的计算),因此该算法是并行化的自然候选者.但是,计算依赖于某些预设数组,所有线程将在同一时间访问但不会更改.
然而,当我尝试将主要for与MS 并行化时,我的cuncurrency::parallel_for性能没有提升.事实上,对于在4核CPU上运行的大小为3264X2540的输入,非并行化版本在~34ms内运行,并行化版本运行在~69ms(平均超过10次运行).我确认该操作确实是并行化的(为该任务创建了3个新线程).
使用英特尔的编译器提供tbb::parallel_for了接近完全的结果.为了比较,我开始使用这个算法实现,C#其中我也使用了parallel_for循环,在那里我遇到了接近X4的性能提升(我选择了C++因为这个特定任务C++即使使用单个核心也更快).
有什么想法阻止我的代码很好地并行化?
我的代码:
template<typename T>
void static ConvertBayerToRgbImageAsIs(T* BayerChannel, T* RgbChannel, int Width, int Height, ColorSpace ColorSpace)
{
//Translates index offset in Bayer image to channel offset in RGB image
int offsets[4];
//calculate offsets according to color space
switch (ColorSpace)
{
case ColorSpace::BGGR:
offsets[0] = 2;
offsets[1] = 1;
offsets[2] = 1;
offsets[3] = 0;
break;
...other color spaces
}
memset(RgbChannel, …Run Code Online (Sandbox Code Playgroud) 编辑:这里的代码仍然有一些错误在里面,它可以做在表演系的,而是试图解决这一问题更好,备案我把这个问题交给英特尔讨论组和得到了很多很好的意见,如果一切顺利的话,原子浮子的抛光版将包含在英特尔线程构建模块的近期版本中
好的,这是一个艰难的,我想要一个原子浮点数,不是为了超快的图形性能,而是常规地用作类的数据成员.而且我不想为在这些类上使用锁定付出代价,因为它不能为我的需求提供额外的好处.
现在有了intel的tbb和我见过的其他原子库,支持整数类型,但不支持浮点数.所以我继续实施了一个,它可以工作......但是我不确定它是否真的有用,或者我很幸运它有效.
这里的任何人都知道这不是某种形式的异端邪说吗?
typedef unsigned int uint_32;
struct AtomicFloat
{
private:
tbb::atomic<uint_32> atomic_value_;
public:
template<memory_semantics M>
float fetch_and_store( float value )
{
const uint_32 value_ = atomic_value_.tbb::atomic<uint_32>::fetch_and_store<M>((uint_32&)value);
return reinterpret_cast<const float&>(value_);
}
float fetch_and_store( float value )
{
const uint_32 value_ = atomic_value_.tbb::atomic<uint_32>::fetch_and_store((uint_32&)value);
return reinterpret_cast<const float&>(value_);
}
template<memory_semantics M>
float compare_and_swap( float value, float comparand )
{
const uint_32 value_ = atomic_value_.tbb::atomic<uint_32>::compare_and_swap<M>((uint_32&)value,(uint_32&)compare);
return reinterpret_cast<const float&>(value_);
}
float compare_and_swap(float value, float compare)
{
const uint_32 value_ = atomic_value_.tbb::atomic<uint_32>::compare_and_swap((uint_32&)value,(uint_32&)compare);
return reinterpret_cast<const …Run Code Online (Sandbox Code Playgroud) 我对英特尔线程构建模块商业版与开源许可证感到困惑.开源版本在GPLv2下获得了运行时异常的许可,但是这用普通英语意味着什么呢?它是否可以用于商业的闭源应用程序,只要它只与未修改的.dll链接?
英特尔线程构建块给我留下了深刻的印象.我喜欢我应该如何编写任务而不是线程代码,我喜欢它如何在我的有限理解下工作(任务在池中,4核上不会有100个线程,任务不能保证运行,因为它不是它自己的线程可能会进入池中.但它可能与另一个相关的任务一起运行,所以你不能做坏事,如典型的线程不安全的代码).
我想更多地了解写作任务.我喜欢这里的"基于任务的多线程 - 如何为100个内核编程"视频http://www.gdcvault.com/sponsor.php?sponsor_id=1(目前是第二个最后一个链接.警告它不是'很棒').我最喜欢的部分是"解决迷宫最好并行完成",大约是48分钟(你可以点击左侧的链接.如果有的话,这部分真的是你需要观察的).
但是,我希望看到更多的代码示例和一些如何编写任务的API.有没有人有很好的资源?我不知道一个类或多个代码片段在将它推入池中后可能看起来如何或当你需要复制所有内容以及将所有内容推送到池中时,它们看起来有多奇怪.
我正在尝试并且未能opencv_traincascade使用多个线程.我能找到的唯一文档说"用TBB构建OpenCV".我不确定我是否未能使用TBB成功构建OpenCV,或者是否需要设置一些标志opencv_traincascade.
我已经下载了OpenCV版本2.3.1 windows superpack tbb40_20111003oss_win.zip,我将其解压缩C:\tbb40_20111003oss.然后,我使用CMake,设置生成VC8 .sln和.proj文件
WITH_TBB: ON
TBB_INCLUDE_DIR:PATH=C:\tbb40_20111003oss\include
TBB_LIB_DIR:PATH=C:/tbb40_20111003oss/lib/intel64/vc8
OpenCV然后构建没有错误,但当我运行opencv_traincascade它的单线程.有谁知道我做错了什么?
由于 c++17 std 库支持并行算法,我认为它是我们的首选,但在与tbband比较后openmp,我改变了主意,我发现 std 库要慢得多。
通过这个帖子,我想请教一下我是否应该放弃标准库的并行算法,而使用tbbor 的专业建议openmp,谢谢!
环境:
基准代码:
#include <algorithm>
#include <cmath>
#include <chrono>
#include <execution>
#include <iostream>
#include <tbb/parallel_for.h>
#include <vector>
const size_t N = 1000000;
double std_for() {
auto values = std::vector<double>(N);
size_t n_par = 5lu;
auto indices = std::vector<size_t>(n_par);
std::iota(indices.begin(), indices.end(), 0lu);
size_t stride = static_cast<size_t>(N / n_par) + 1;
std::for_each(
std::execution::par,
indices.begin(),
indices.end(),
[&](size_t index) {
int begin = index * …Run Code Online (Sandbox Code Playgroud) 我有一个大文件(比RAM大,不能一次读取整个),我需要逐行处理它(在c ++中).我想利用多个内核,最好使用Intel TBB或Microsoft PPL.我宁愿避免预处理这个文件(比如把它分成4个部分等).
我正在考虑使用4个迭代器,在文件中初始化为(0,n/4,2*n/4 3*n/4)位置等.
这是一个很好的解决方案,有没有简单的方法来实现它?
或者您可能知道一些支持高效,并发读取流的库?
更新:
我做了测试.IO不是瓶颈,CPU是.我有很多缓冲区的RAM.
我需要解析记录(var大小,每个大约2000个字节,记录由唯一的'\ 0'char分隔),验证它,做一些计算,并将结果写入另一个文件