小编Ant*_*ton的帖子

为什么 OpenMP 的性能优于线程?

我一直在 OpenMP 中调用它

#pragma omp parallel for num_threads(totalThreads)
for(unsigned i=0; i<totalThreads; i++)
{
workOnTheseEdges(startIndex[i], endIndex[i]);
}
Run Code Online (Sandbox Code Playgroud)

这在 C++11 std::threads 中(我相信这些只是 pthreads)

vector<thread> threads;
for(unsigned i=0; i<totalThreads; i++)
{
threads.push_back(thread(workOnTheseEdges,startIndex[i], endIndex[i])); 
}
for (auto& thread : threads)
{
 thread.join();
}
Run Code Online (Sandbox Code Playgroud)

但是,OpenMP 实现的速度是原来的 2 倍——更快!我本来期望 C++11 线程更快,因为它们更底层。注意:上面的代码不仅被调用一次,而且可能在循环中被调用 10,000 次,所以也许这与它有关?

编辑:为了澄清,在实践中,我要么使用 OpenMP 要么使用 C++11 版本——而不是同时使用两者。当我使用 OpenMP 代码时,需要 45 秒,当我使用 C++11 时,需要 100 秒。

c++ multithreading c++11

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

TBB 可能的内存泄漏

测试程序:

#include <tbb/parallel_invoke.h>

int main(void)
{
    tbb::parallel_invoke([]{},[]{});
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 编译使用 g++ -std=c++11 tmp.cpp -ltbb
  2. 检查过

    valgrind --tool=memcheck --track-origins=yes \
             --leak-check=full --log-file=report ./a.out`
    
    Run Code Online (Sandbox Code Playgroud)
  3. libtbb版本:4.0valgrind版本:3.8.1

以上部分测试结果:

possibly lost: 1,980 bytes in 6 blocks
Run Code Online (Sandbox Code Playgroud)

问题是:

这是一个TBB错误吗?

或者这possible lost实际上是安全的,这只是 valgrind 认为不安全的一些代码?

c++ valgrind memory-leaks tbb c++11

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

静态库中目标文件的顺序

我知道当链接到多个静态库或目标文件时,顺序很重要(依赖库应该在它们的依赖项之前列出).我想知道,在创建库文件时ar,是否应用此相同规则并且库中的顺序很重要,或者在同一.a文件中它是否有所作为.
我正在打包200多个带有复杂依赖关系图的目标文件,并且这样做

ar rcs mylib.a objs/*.o
Run Code Online (Sandbox Code Playgroud)

然后以正确的顺序列出它们要容易得多.

我正在使用gcc,如果它有所作为.

gcc static-libraries unix-ar static-linking

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

如何在tbb流程图中中止节点及其子节点的执行

我目前正在测试 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)

c++ multithreading tbb tbb-flow-graph

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

tbb并发哈希映射查找和插入

我目前正在使用tbb的并发哈希映射来执行并发插入哈希映射.每个键都是一个字符串,值是整数的向量.我想实现以下内容:在插入期间,如果密钥不存在,我插入它并将值添加到其向量.如果存在,我只需将值添加到其向量中.

在检查tbb并发哈希映射API之后,我注意到find和insert函数都只返回布尔值.那么如果它存在,如何返回指向键的指针呢?

c++ tbb concurrenthashmap

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

派生自模板基类的模板构造函数

只是好奇,是否有可能从模板类继承并在派生类的构造函数中调用基类的构造函数,该构造函数也是模板化的并且没有参数来推断其类型?

template<typename T>
struct Base {
    template<typename D>
    Base() {                // no argument of type D to infer from
        static_assert(std::is_same<T,D>::value, "");
    }
};

struct Derived : Base<int> {
    Derived()  : Base<int>::Base<int>() {} // is there a way to write it correctly?
};
Run Code Online (Sandbox Code Playgroud)

在我的特定情况下,我可以用模板方法替换模板构造函数,但这仍然是一个关于语言灵活性的有趣问题。

c++ inheritance templates c++11

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

concurrent_vector 无效数据

使用:VC++ 2013

concurrency::concurrent_vector<datanode*> dtnodelst
Run Code Online (Sandbox Code Playgroud)

有时,当我这样做时dtnodelst->at(i).... 我收到一个无效地址 (0XCDCD.. ofc) 这不应该是我推回后的原因,我从不删除或删除任何它(即使我删除它应该已返回已删除的旧地址...但我从未删除,因此情况并非如此)

dtnodelst itm = new dtnodelst ();
....
dtnodelst->push_back(itm);
Run Code Online (Sandbox Code Playgroud)

关于可能发生什么的任何想法?

ps 我正在使用 Windows 线程池。有时.. 我可以做 800 万次插入和查找,一切顺利......但有时甚至 200 次插入和查找都会失败。我有点失落。任何帮助将不胜感激!

感谢和最好的问候

实际代码作为参考

ps 我是否遗漏了某些东西,或者使用正确的格式对过去的代码感到痛苦?我记得它之前是自动对齐的... -_-

struct datanode {       
     volatile int nodeval;
     T val;
};
concurrency::concurrent_vector<datanode*> lst
inline T find(UINT32 key)
{
    for (int i = 0; i < lst->size(); i++)
    {
       datanode* nd = lst->at(i);
       //nd is invalid sometimes
       if (nd)  
       if (nd->nodeval == key)
       {
         return (nd->val);
       }
    }
    return …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency multithreading visual-c++ concurrent-vector

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

Tbb并发哈希映射迭代器

我正在使用迭代器遍历整个tbb并发哈希映射并检查每个(键,值)对.

for (MAP::pair = myHashTable.begin(); myHashTable.end(); pair++)
Run Code Online (Sandbox Code Playgroud)

如何并行化这个迭代器?

c++ parallel-processing multithreading tbb

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

无法将英特尔 TBB 库与 /usr/lib 中的 libtbb 链接

我从英特尔的 TBB 网站下载了英特尔 TBB 的预构建标头和库。我更新了 ldconfig 以将 tbb 共享库添加到 /usr/lib。然而,在使用 -tbb 编译时,使用 g++ ld 的代码返回 -1,因为它无法找到 libtbb

libtbb.so.2 存在于 /usr/lib/ 中

这是我完整的 g++ 输出

g++ hellotbb.cpp  -o htbb -I$HOME/libs/tbb43/include  -v  -ltbb 

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic …
Run Code Online (Sandbox Code Playgroud)

c++ tbb

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

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

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

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

c++ profiler multithreading tbb

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

TBB流程图条件执行

可以动态地控制TBB流图中的执行路径,使用节点的输出作为条件变量来确定是否应该启动另一个节点?

c++ multithreading asynchronous tbb tbb-flow-graph

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

在方法内声明散列映射

局部变量在Java中是线程安全的.hashmap在方法线程中使用声明是否安全?例如-

void usingHashMap()
{
    HashMap<Integer> map = new HashMap<integer>();
}
Run Code Online (Sandbox Code Playgroud)

java multithreading

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