标签: tbb

使用TBB并行化OpenCV代码

我试图并行化使用TBB在OpenCV中编写的一些图像匹配代码.问题是,根据我的匹配(在左图像中创建一个5x5窗口并在右边逐个像素地查找匹配)本质上是一个只读操作,目前我正在尝试并行化内部循环(即在给定高度.我指定不同的像素到不同的线程).令我惊讶的是,cvSetImageROI当并行完成时命令会中断.这是代码.

//Code below just carves out a window(5x5) at a current width which is to be matched
cvSetImageROI(leftImageROI, cvRect(curWidth - 2, 0, 5, 5));
IplImage* currentROI = cvCreateImage(cvSize(5, 5), leftImageROI->depth, leftImageROI->nChannels);
cvCopy(leftImageROI, currentROI);                   
cvResetImageROI(leftImageROI);
Run Code Online (Sandbox Code Playgroud)

现在这一切对我来说都是安全的,因为它们只是在读取图像.但是代码崩溃了.如果我在一开始就放锁,虽然它有效.有人可以帮忙吗?

parallel-processing opencv intel tbb

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

TBB与Homegrown Workqueue

我知道TBB(Thread Building Blocks)声称拥有一个复杂的引擎,但从算法的角度来看:

如果我们有一个工作队列(在Linux上说)N的工作线程(POSIX线程,N是核心数量)和任务的互斥体同步队列,每个工作线程然后从队列中取任务时空闲的,也有一些同步调用,还有什么可以TBB提供,不算好C++语法?我没有看到比核心任务贪婪更好的算法.

c c++ parallel-processing tbb linux-kernel

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

英特尔TBB concurrent_queue如何工作?它是否实现了细粒度的并行性?

我是英特尔TBB的新手.我正在使用concurrent_queue,以便在我的项目中实现细粒度的并行性.我几乎没有怀疑.这就是我的实施方式.

   thread_fun(arguments) {
      while(concurrent_queue.try_pop(v))
          operation on v;  //each thread executes its own operation(seperate v for each thread)
   }
   main() {
      for(..)
         concurrent_queue.push(); //fill the queue
      _beginthreadex(..); //create 8 win32 threads and pass concurrent_queue as an argument
   }
Run Code Online (Sandbox Code Playgroud)
  1. 我明确提到了线程的数量.我读到TBB将根据处理器核心数创建线程.我怎样才能实现这一目标?所以我不需要使用_beginthreadex函数显式创建线程?

  2. 我是否通过使用concurrent_queue实现了细粒度的并行性?

  3. 任务级并行性是什么意思?你如何用intel tbb实现任务级并行?我从队列中弹出元素.流行操作是否被视为一项任务?这意味着,所有弹出操作都被视为不同的任务.我用8个线程一次弹出8个元素.这意味着,我正在实现任务级并行性.我对么?

  4. 如果我在四核处理器(支持8个线程)上将线程数增加到32,那么concurrent_queue如何工作?是否只有8个线程同时在队列上执行或共32个线程同时执行?

请帮我.

c++ parallel-processing multithreading intel tbb

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

线程构建块(TBB)使用lambda排队任务

TBB的文档提供了这个例子中使用与parallel_for时lambda表达式,但不提供使用与lambda表达式的例子tbb::task::enqueue.

我正在寻找一个tbb::task::enqueue使用lambda表达式的简单示例.

c++ lambda multithreading tbb c++11

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

使用TBB时如何检查当前正在运行的线程数?

我在集群上运行英特尔 TBB。但是,我不知道如何检查有多少线程处于活动状态并正在运行。有办法检查吗?

假设我有 16 个核心,所以我想知道我的 TBB 代码中是否使用了所有 16 个核心。这将确保我的系统没有问题。

c++ profiler multithreading tbb

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

std::vector 上的 tbb::parallel_reduce

下面是一个简单的并行程序,用于使用 tbb 计算标准向量中的元素之和。
有人可以帮我理解为什么它输出错误的结果吗?

#include  <iostream>
#include <algorithm>
#include <numeric>

#include <tbb/tbb.h>

struct Sum {
    int value;

    Sum() : value(0) {}
    Sum(Sum&s, tbb::split) : value(0) {}

    void operator()(const tbb::blocked_range<std::vector<int>::iterator>& r) {

        value = std::accumulate(r.begin(), r.end(), 0);
    }

    void join(Sum& rhs) { value += rhs.value; }
};


int main()
{   
    std::vector<int> a(100);
    std::fill(a.begin(), a.end(), 1);

    Sum sum;
    tbb::parallel_reduce(tbb::blocked_range<std::vector<int>::iterator>(a.begin(), a.end()), sum);

    std::cout << sum.value << std::endl;

    return 0;  
}
Run Code Online (Sandbox Code Playgroud)

c++ concurrency tbb c++11

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

静态链接英特尔tbb的问题

我最近读了这个问题如何静态链接到TBB?我仍然不明白使用tbb作为静态链接库的问题(如果你这样做,可以使用它们的makefile make extra_inc=big_iron.inc tbb)

答案似乎是说问题在于单个程序中可能存在多个单例,单个子的所有(大多数?)实现都不会让这种情况发生.我不明白这背后的原因.

问题在于,当您进行fork()另一个处理时,单例会在两个单独的进程中成为两个独立的单例吗?那是"程序"的意思吗?如果就是这样,为什么他们不能mmap()共享内存并将其用作通信媒介?

也不动态链接只意味着库本身在内存中共享,即代码段?

谢谢!

c++ tbb dynamic-linking

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

为什么 golang 通道在使用 8 个生产者 1 个消费者进行测试时比 intel tbb concurrent_queue 快得多

我做了一个测试来比较 golang 通道和 C++ tbb 并发队列性能,我设置了 8 个写入器和 1 个读取器,它们位于不同的线程中。结果显示 golang 比 C++ 版本快得多(无论延迟和整体发送/接收速度如何),是是真的?或者我的代码有什么错误?

golang 结果,单位是微秒

延迟最大值:1505,平均:1073 发送开始:1495593677683232,接收结束:1495593677901854,时间:218622

package main

import (
    "flag"
    "time"
    "fmt"
    "sync"
    "runtime"
)

var (
    producer = flag.Int("producer", 8, "producer")
    consumer = flag.Int("consumer", 1, "consumer")
    start_signal sync.WaitGroup
)

const (
    TEST_NUM = 1000000
)

type Item struct  {
    id int
    sendtime int64
    recvtime int64
}

var g_vec[TEST_NUM] Item

func sender(out chan int, begin int, end int) {
    start_signal.Wait()
    runtime.LockOSThread()
    println("i am in sender", begin, end) …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency performance tbb go

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

C++除了使用tbb :: task_group之外,如何同时运行三个不同的parallel_for函数?

我有代码,我必须并行地运行parallel_for(彼此独立).

代码是这样的:

tbb::parallel_for(range1,func1());//first

tbb::parallel_for(range2,func2());//second

tbb::parallel_for(range3,func3());//third
Run Code Online (Sandbox Code Playgroud)

我尝试过使用task_group.还有其他方法吗?

c++ multithreading tbb parallel-for

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

Microsoft TPL(任务并行库)与英特尔TBB(线程构建块)

我的问题是,正如标题所说:在一般水平上(易用性,对发生的事情的控制程度等)你会推荐哪一个小型并行程序?微软的TPL还是英特尔的TBB?

先感谢您

c# c++ multithreading tbb task-parallel-library

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