在 python 线程中调用 TBB 'parallel_for'
Calling TBB 'parallel_for' in python thread
我有一个用于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 是否需要特定的初始化以允许从"自定义"线程调用它?
在 TBB 2.1 中,每个使用 TBB 的外部线程都应该首先创建自己的 task_scheduler_init 对象;单个全局对象将不起作用。
更高版本的 TBB 放宽了这一要求;现在,如果不存在,则会隐式创建此类特定于线程的初始化对象。
您可以尝试用更新的版本机械替换 tbb.dll 是否会对您有所帮助。使用最新版本的 TBB 重新编译上述 C++ 模块会更好。重新设计模块以分别初始化每个调用它的线程的 TBB(以便它也适用于旧版本),如果没有设计约束禁止,也可能有意义。
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- 在Linux for Windows上编译C++代码时出错
- 调用专用模板时出错"no matching function for call to [...]"
- 为什么我的for循环不能正确获取argv
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- 函数中的"pragma omp parallel for"在另一个并行循环中调用函数时无效
- C++ + OpenMP for Parallel Computing:如何在Visual Studio中进行设置
- Parallel for with omp
- OpenMP:'parallel for loop'瓶颈
- 简单将 OpenMp Parallel for 转换为 C# Parallel for
- Parallel of std::reference_wrapper for std::shared_ptrs
- OpenMP 'parallel for'预先初始化
- omp parallel for:如何让线程写入私有数组,并在所有线程完成处理后合并所有数组
- OpenMP "master"杂注不得被"parallel for"杂注包围
- C++ Break omp parallel for
- OpenMP "parallel for"在特定程序中很奇怪
- 用OpenMP(Parallel for)并行化时分割错误