我正在阅读线程积木书。我不明白这段代码:
FibTask& a=*new(allocate_child()) FibTask(n-1,&x);
FibTask& b=*new(allocate_child()) FibTask(n-2,&y);
Run Code Online (Sandbox Code Playgroud)
这些指令是什么意思?类对象引用和 new 一起工作吗?谢谢解释。
下面的代码是这个类FibTask的定义。
class FibTask: public task
{
public:
const long n;
long* const sum;
FibTask(long n_,long* sum_):n(n_),sum(sum_)
{}
task* execute()
{
if(n<CutOff)
{
*sum=SFib(n);
}
else
{
long x,y;
FibTask& a=*new(allocate_child()) FibTask(n-1,&x);
FibTask& b=*new(allocate_child()) FibTask(n-2,&y);
set_ref_count(3);
spawn(b);
spawn_and_wait_for_all(a);
*sum=x+y;
}
return 0;
}
};
Run Code Online (Sandbox Code Playgroud) 我正在尝试为线程构建块构建一些测试。不幸的是,我无法配置 tbb 库。链接器找不到库 tbb。我试过在 bin 目录中运行脚本,但没有帮助。我什至尝试将库文件移动到 /usr/local/lib/ ,这又失败了。任何的意见都将会有帮助。
我们可以在 openmp 中使用 TBB concurrent_vector 吗?
是否允许并发更新?
TBB中有类似PPL的任务延续的东西吗?我知道手动分配tbb::tasks 和手动分配连续任务以及手动管理它们的引用计数的低级 TBB 方法:
struct FibContinuation: public task {
long* const sum;
long x, y;
FibContinuation( long* sum_ ) : sum(sum_) {}
task* execute() {
*sum = x+y;
return NULL;
}
};
struct FibTask: public task {
const long n;
long* const sum;
FibTask( long n_, long* sum_ ) :
n(n_), sum(sum_)
{}
task* execute() {
if( n<CutOff ) {
*sum = SerialFib(n);
return NULL;
} else {
// long x, y; This line removed
FibContinuation& c = …Run Code Online (Sandbox Code Playgroud) 如何在启用TBB的情况下安装Opencv?
我尝试了以下方法:
1)下载TBB包.
2)使用以下命令构建
mingw32-make compiler=gcc arch=ia32 runtime=mingw default
Run Code Online (Sandbox Code Playgroud)
3)我将环境变量路径设置为"d:\ tbb\build\windows_ia32_gcc_mingw_release
3)现在使用cmake,我启用了"WITH_TBB"并编译了opencv.
它抛出以下错误.
[ 22%] Built target pch_Generate_opencv_core
Linking CXX shared library ..\..\bin\libopencv_core245.dll
c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe: cannot fin
d -ltbb
collect2: ld returned 1 exit status
make[2]: *** [bin/libopencv_core245.dll] Error 1
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
我错过了什么...请建议..
我目前正在测试 tbb 的流程图功能。为了使用它,我必须能够中止图中某个节点的执行,包括所有依赖它的子节点,但让其他不依赖它的子节点执行。从主体抛出异常或调用 task::cancel_group_execution() 会中止所有节点的执行。
#include <cstdio>
#include "tbb/flow_graph.h"
using namespace tbb::flow;
struct body
{ std::string my_name;
body( const char *name ) : my_name(name)
{
}
void operator()( continue_msg ) const
{ if (my_name == "B")
tbb::task::self().group()->cancel_group_execution();
else
{ sleep(1);
printf("%s\n", my_name.c_str());
}
}
};
int main()
{
graph g;
broadcast_node< continue_msg > start(g);
continue_node<continue_msg> a( g, body("A"));
continue_node<continue_msg> b( g, body("B"));
continue_node<continue_msg> c( g, body("C"));
continue_node<continue_msg> d( g, body("D"));
continue_node<continue_msg> e( g, body("E"));
make_edge( start, a );
make_edge( start, …Run Code Online (Sandbox Code Playgroud) 我目前正在使用tbb的并发哈希映射来执行并发插入哈希映射.每个键都是一个字符串,值是整数的向量.我想实现以下内容:在插入期间,如果密钥不存在,我插入它并将值添加到其向量.如果存在,我只需将值添加到其向量中.
在检查tbb并发哈希映射API之后,我注意到find和insert函数都只返回布尔值.那么如果它存在,如何返回指向键的指针呢?
我正在尝试为 Tegra TK1 编译 C++ 库。该库链接到我使用包管理器拉取的 TBB。在编译期间我收到以下错误
/tmp/cc4iLbKz.s: Assembler messages:
/tmp/cc4iLbKz.s:9541: Error: thumb conditional instruction should be in IT block -- `strexeq r2,r3,[r4]'
Run Code Online (Sandbox Code Playgroud)
有点谷歌搜索,这个问题让我尝试添加-mimplicit-it=thumb到 CMAKE_CXX_FLAGS,但编译器无法识别它。
我正在使用内核 3.10.40-grinch-21.3.4 在 tegra 上编译,并使用 gcc 4.8.4 编译器(这就是我输入 c++ -v 时返回的内容)
我不确定最初的错误消息是什么意思,但我认为它与 TBB 链接库而不是我正在编译的源有关。修复的问题也很神秘。任何人都可以对此有所了解吗?
我是一个非常新的程序员,我对intel的例子有些麻烦.我认为如果能看到tbb中最基本的可能循环是如何实现的话会有所帮助.
for (n=0 ; n < songinfo.frames; ++n) {
sli[n]=songin[n*2];
sri[n]=songin[n*2+1];
}
Run Code Online (Sandbox Code Playgroud)
这是我用来解交错音频数据的循环.这个循环会从tbb中受益吗?你会如何实现它?