标签: tbb

concurrentdvector用于2d数组

我目前正在尝试使用表示2D数组tbb::concurrent_vector<T>.这个2d数组将被许多不同的线程访问,这就是为什么我希望它能够最有效地处理并行访问.

我想出了两个解决方案:

  • 用a tbb::concurrent_vector<tbb::concurrent_vector<T> >来存储它.

  • 将所有内容存储在一个tbb::concurrent_vector<T>和访问元素中x * width + y

我偏爱第二个,因为我不想锁定整行来访问一个元素(因为我假设要访问该元素array[x][y],tbb实现将锁定第xth行然后锁定第th y个元素).

我想知道哪种解决方案对你来说更好.

c++ parallel-processing multithreading tbb concurrent-vector

6
推荐指数
1
解决办法
1928
查看次数

OS X:将.dylib转换为.a/.o(动态到静态)?

假设我已经阅读过这个警告,我仍然希望将TBB用作静态链接库.(假装我在一个不允许用户创建自己的dylib 的环境中工作.)但我真的不想重写TBB makefile来生成libtbb.a而不是libtbb.dylib.

是否有一个简单的命令行方式将libtbb.dylib转换为libtbb.o并使用相同的入口点?

我听到了一个很好的论据,因为从静态到动态不能走另一条路.即:动态库需要是PIC,将非PIC静态库转换为PIC是不可行的.但据我所知,这一论点并不适用于其他方向.

这里有人说在Windows上将.dll转换为.a是不可能的,但我认为他们只是在讨论将.dll或.exe备份到其原始.o文件中的不可能性,并不一定说它不可能创建具有相同内容的可链接.o文件.此外,Windows上的情况比"真正的"PIC稍微有些奇怪,尽管我认为这并不重要.

tbb dylib static-libraries dynamic-library ios

6
推荐指数
1
解决办法
4163
查看次数

如何在visual studio 2010 Express Edition上启用C++ 11编译器?

我正在使用tbb :: parallel_for函数,它使用lambdas.我使用以下代码获得语法错误:

void parallel_relax( Class object, std::vector<Vertex *> verList ) {
    tbb::parallel_for (blocked_range<int>(0, verList.size()), [=](const blocked_range<Vertex *>& r) {
        for(Vertex *vit = r.begin(); vit != r.end(); ++vit) {
            Vertex *v = vit;
            object.function(v);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

语法错误:

syntax error : '['
1>main.cpp(16): error C2143: syntax error : missing ')' before '{'
1>main.cpp(16): error C2143: syntax error : missing ';' before '{'
1>main.cpp(17): error C2065: 'r' : undeclared identifier
1>main.cpp(17): error C2228: left of '.begin' must have class/struct/union
1>          type …
Run Code Online (Sandbox Code Playgroud)

c++ tbb visual-studio-2010 visual-c++ c++11

6
推荐指数
1
解决办法
3万
查看次数

提高OpenCV性能Android - 快速对象跟踪

我正在尝试在Android上实现快速对象跟踪应用

我的逻辑如下

  1. 除去所需的颜色范围以外的所有颜色.
  2. 使用GaussianBlur平滑图像
  3. 使用HoughCircles查找最大半径圆

该应用程序的工作正常,但性能不好,我想要加快我的性能至少快5倍.我借用了这个链接的大部分逻辑.

快速对象跟踪示例

public void apply(Mat src, Mat dst) {
    Mat mIntermediateMat = new Mat(src.rows(), src.cols(), CvType.CV_8UC1);

    Mat mHsv = new Mat(src.size(), CvType.CV_8UC3);
    Mat mHsv2 = new Mat(src.size(), CvType.CV_8UC3);

    Imgproc.cvtColor(src, mHsv, Imgproc.COLOR_RGB2HSV, 3);

    Core.inRange(mHsv, new Scalar(0, 86, 72), new Scalar(39, 255, 255), mHsv); // red
    Core.inRange(mHsv, new Scalar(150, 125, 100), new Scalar(180,255,255), mHsv2); // red
    Core.bitwise_or(mHsv, mHsv2, mHsv);

    /// Reduce the noise so we avoid false circle detection
    Imgproc.GaussianBlur(mHsv, mHsv, new Size(7, 7), 2);
    Imgproc.HoughCircles(mHsv, mIntermediateMat, …
Run Code Online (Sandbox Code Playgroud)

performance multithreading android opencv tbb

6
推荐指数
1
解决办法
5368
查看次数

如何使用TBB并行化std :: partition

有没有人有任何使用TBB有效并行化std :: partition的技巧?这已经完成了吗?

这是我在想的:

  1. 如果数组很小,std :: partition it(serial)并返回
  2. 否则,使用自定义迭代器将数组视为2个交错数组(在缓存大小的块中交错)
  3. 为每对迭代器启动一个并行分区任务(递归到第1步)
  4. 交换两个分区/中间指针之间的元素*
  5. 返回合并的分区/中间指针

*我希望在平均情况下,与阵列的长度相比,该区域将是小的,或者与在连续块中分区阵列所需的交换相比较.

我尝试之前的任何想法?

c++ sorting algorithm parallel-processing tbb

6
推荐指数
1
解决办法
869
查看次数

在c ++中实现Concurrent Queue + map

我不擅长数据结构,所以这可能是一个非常愚蠢的问题.我正在寻找一种方法来实现队列+映射的混合行为.

我目前正在www.threadingbuildingblocks.org中使用tbb::concurrent_bounded_queue(记录在英特尔开发人员专区)的多线程单一生产者单一消费者流程.队列具有市场数据报价对象,并且流程的生产者方面实际上是高度时间敏感的,因此我需要的是一个键入市场数据标识符的队列,例如USDCAD,EURUSD.价值指向(通过)我收到的此密钥的最新市场数据报价.unique_ptr

所以,让我们说我的队列有5个元素用于5个唯一标识符,突然我们得到队列中第3个位置的标识符的更新市场数据报价,然后我只存储最新的值并丢弃我以前的值.所以,基本上我只是将我的unique_ptr移动到这个密钥的新市场数据报价.

它就像是相似concurrent_bounded_queue<pair<string, unique_ptr<Quote>>>但却被锁定在该对的第一个元素上.

我不确定这是否已经在第三方库中可用(可能是tbb本身),或者如果它是标准数据结构则称它是什么.

我非常感谢对此提供任何帮助或指导.

谢谢.

c++ concurrency multithreading tbb data-structures

6
推荐指数
1
解决办法
627
查看次数

如何在Ubuntu 14.04中使用线程构建块

我想让TBB工作,但是我在编译Ubuntu 14.04时遇到了一些困难.我认为为编译器设置库的位置可能存在问题.

我使用以下命令安装TBB:

sudo apt-get install libtbb-dev
Run Code Online (Sandbox Code Playgroud)

我有一个小测试示例,我现在正在尝试编译.代码如下:

#include "tbb/task_scheduler_init.h"

int main(int argc, char* argv[]) {
    tbb::task_scheduler_init init;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在运行的编译此代码的命令如下:

g++ -std=c++11 -g -O2 -ltbb simple_test.cc -o simple_test
Run Code Online (Sandbox Code Playgroud)

我用G ++版本4.9.1运行它.当我尝试编译时,我收到以下错误:

/tmp/cc7Ls8Sb.o: In function `task_scheduler_init':
/usr/include/tbb/task_scheduler_init.h:126: undefined reference to `tbb::task_scheduler_init::initialize(int, unsigned long)'
/tmp/cc7Ls8Sb.o: In function `~task_scheduler_init':
/usr/include/tbb/task_scheduler_init.h:132: undefined reference to `tbb::task_scheduler_init::terminate()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

文件的位置task_scheduler_init.h/usr/include/tbb/task_scheduler_init.h.

你知道我做错了什么吗?


编辑:我重新排序了g ++的论据,这使它工作:

g++ simple_test.cc -std=c++11 -g -O2 -ltbb -o simple_test
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么这种改变使编译成功.

install tbb ubuntu-14.04

6
推荐指数
0
解决办法
2万
查看次数

如何完全关闭 TBB 代码中的线程

注意:这不是这个问题的重复。

给定一个与 TBB 并行的复杂软件,我如何完全关闭线程?我知道task_scheduler_init:

int nthreads = tbb::task_scheduler_init::default_num_threads();
const char* cnthreads = getenv("TBB_NUM_THREADS");
if (cnthreads) nthreads = std::max(1, atoi(cnthreads));

tbb::task_arena arena(nthreads, 1);
tbb::task_scheduler_init init(nthreads);
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案(与相关)不会关闭线程。TBB 仍然会创建大量线程,nthreads只是使其中一些线程未被使用。此外,如果有nthreads = 1,TBB 实际上会创建 1 个额外的线程 - 加上主线程总共 2 个线程。

是的,在某些情况下,您确实希望完全关闭线程,但仍保持 TBB 代码处于活动状态。我当前的解决方案是对 tbb 进行草率的包装:

namespace hddm {
bool enableTBB = true;
class task_group {
    unique_ptr<tbb::task_group> tbb;
public :
    task_group() {
        if (enableTBB)
            tbb.reset(new tbb::task_group());
    }

    template<typename F>
    void run(const F& f) { …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading intel tbb

5
推荐指数
1
解决办法
2890
查看次数

使用 oneDPL 时如何解决“命名空间 'tbb' 中没有名为 'task' 的成员”错误?

当我在代码中使用 oneDPL 时,我面临以下问题:

/usr/lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/pstl/parallel_backend_tbb.h:70:10: error: no member named 'task' in namespace 'tbb'
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况以及如何解决它?

tbb

5
推荐指数
1
解决办法
1981
查看次数

使用 CMake 链接到 TBB 库

我已经tbb下载并放置在我的存储库目录中:

\n
> tree deps/tbb/ -d \ndeps/tbb/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cmake\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 serial\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tbb\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tbb\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 compat\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 internal\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 machine\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ia32\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 gcc4.8\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 intel64\n \xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 gcc4.8\n
Run Code Online (Sandbox Code Playgroud)\n

在我的CMakeLists.txt我已经尝试过这个:

\n
include_directories("deps/tbb/include")\n\n\nfind_library(TBB_LIB\n    NAMES\n    tbbbind_debug\n    tbbbind\n    tbb_debug\n    tbbmalloc_debug\n    tbbmalloc_proxy_debug\n    tbbmalloc_proxy\n    tbbmalloc\n    tbb_preview_debug\n    tbb_preview\n    tbb\n    HINTS "${CMAKE_PREFIX_PATH}/deps/tbb/lib/intel64/gcc4.8"\n)\n\nadd_executable(${PROJECT_NAME}\nsrc/main.cpp\n)\n\ntarget_link_libraries(${PROJECT_NAME} PUBLIC ${TBB_LIB})\n
Run Code Online (Sandbox Code Playgroud)\n

但是使用cmake, 链接器构建会引发此错误:

\n
\n

/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld:找不到-lTBB_LIB-NOTFOUND

\n

collect2:错误:ld 返回 1 退出状态

\n
\n

我无法弄清楚缺少什么。谢谢。

\n

更新 …

c++ linker tbb cmake ld

5
推荐指数
2
解决办法
1万
查看次数