gpt4 book ai didi

C - __declspec(thread) 变量性能

转载 作者:太空狗 更新时间:2023-10-29 15:16:56 26 4
gpt4 key购买 nike

我正在研究库的多线程实现。在这个库的一个模块中有一些全局变量(在程序执行中经常使用)。为了使对这些变量的访问更加安全,我使用线程本地存储 (TLS) 关键字 __declspec(thread) 来声明它们。

这里是对库外部函数的调用。此函数使用具有全局变量的模块:

for(i = 0; i<n_cores; i++)
hth[i] = (HANDLE)_beginthread((void(*)(void*))MT_Interface_DimenMultiCells,0,(void*)&inputSet[i]);

通过这种方式,我猜库中使用的所有变量都会为每个线程复制。

当我在 x8 核处理器上运行程序时,完成操作所需的时间不超过单进程实现所需时间的 1/3。

我知道不可能达到 1/8 的时间,但我认为至少有 1/6 是可以达到的。

问题是:那些 __declspec(thread) 变量是性能如此糟糕的原因吗?

最佳答案

如果您将它们声明为 __declspec(thread) 而它们以前是全局的,那么您已经改变了程序的含义及其性能特征。

当变量是全局变量时,每个线程都引用一个副本。作为线程局部变量,每个单独的线程都有自己的变量,对该线程局部变量的更改仅在该线程中可见。

假设你真的想要线程局部变量,那么读取和写入线程局部变量确实比普通变量更昂贵。每当您面临需要很长时间才能执行的操作时,最好的解决方案就是完全停止执行它。在这种情况下,有两种明显的方法可以做到这一点:

  1. 将变量作为参数传递,使其驻留在堆栈中。访问堆栈变量很快。
  2. 如果您有大量读写此变量的函数,则在函数开头复制它(放入局部变量),处理该局部变量,然后在返回时将其写回本地线程。

在这些选项中,通常首选前者。选项 2 有一个很大的弱点,如果该函数调用另一个使用该变量的函数,则无法轻松应用。

选项 1 基本上等于不使用全局变量(线程局部变量是全局变量的一种形式)。

当然,这一切都可能完全离谱,因为您对代码的实际作用说的太少了。如果你想解决一个性能问题,你首先必须确定它在哪里,这意味着你需要测量。

关于C - __declspec(thread) 变量性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5076853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com