【问题标题】:Calling TBB 'parallel_for' in python thread在 python 线程中调用 TBB 'parallel_for'
【发布时间】:2011-08-23 02:55:55
【问题描述】:

我有一个用于 python 的自定义 c++ 模块,它公开了一些函数,其中一些使用 TBB (tbb21_015oss) 来加速处理。

到目前为止,我在 Win32 环境中从 Python (2.6.2) 调用 TBB 加速函数时没有问题。

但是现在,我在从 Python 线程(使用 threading.Thread 类创建)调用这样的函数时遇到了问题 - 在从主 Python 线程调用相同的函数时工作正常。

调用该函数导致应用程序崩溃,并显示以下消息:

First-chance exception at 0x03522e96 in python.exe:
0xC0000005: Access violation reading location 0x000000c8.

TBB.dll 基地址为 0x03510000,根据 MSVC 2005 调试器,崩溃发生在 TBB 的“parallel_for.h”代码中,执行时显然在static void start_for::run( const Range& range, const Body& body, const Partitioner& partitioner )

start_for& a = *new(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));

似乎有一个 NULL 指针被取消引用。

FWIW,TBB 使用延迟初始化机制进行初始化:

// at 'global' scope
tbb::task_scheduler_init g_tbbinit(tbb::task_scheduler_init::deferred);  
...
// in a function
g_tbbinit.initialize();

有没有办法做到这一点?例如,TBB 是否需要特定的初始化以允许从“自定义”线程调用它?

【问题讨论】:

  • @Ugo - 更新问题以添加更多信息

标签: c++ python windows tbb


【解决方案1】:

在 TBB 2.1 中,每个使用 TBB 的外部线程应该首先创建自己的 task_scheduler_init 对象;单个全局对象将不起作用。

TBB 的后期版本放宽了这一要求;现在,如果不存在这种特定于线程的初始化对象,则会隐式创建。

您可以尝试用更新的版本机械替换 tbb.dll 是否会对您有所帮助。用最新版本的 TBB 重新编译提到的 C++ 模块会更好。重新设计模块以分别为调用它的每个线程初始化 TBB(以便它也可以与旧版本一起使用),如果不被设计约束禁止,也可能是有意义的。

【讨论】:

  • 谢谢,它看起来像我需要的,我很难从 tbb 文档中弄清楚这一点。我会尽快试一试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多