Bep*_*ppe 4 c performance multithreading declspec
我正在研究库的多线程实现.在该库的一个模块中,存在一些全局变量(在程序执行中经常使用).为了更安全地访问这些变量,我使用Thread-local storage(TLS)关键字声明它们__declspec(thread)
.
这是对库外部函数的调用.此函数使用具有全局变量的模块:
for(i = 0; i<n_cores; i++)
hth[i] = (HANDLE)_beginthread((void(*)(void*))MT_Interface_DimenMultiCells,0,(void*)&inputSet[i]);
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我猜每个线程都会复制库中使用的所有变量.
当我在x8内核处理器上运行程序时,完成操作所需的时间不会超过单个进程实现所需时间的1/3.
我知道不可能达到1/8的时间,但我认为至少1/6是可以达到的.
问题是:那些__declspec(线程)变量是如此糟糕表现的原因?
在此先感谢,GB
如果您将它们声明为__declspec(thread)
以前全局的位置,那么您已更改了程序的含义及其性能特征.
当变量是全局变量时,每个线程都会引用一个副本.作为本地线程,每个单独的线程都有自己的变量,并且对该线程的更改局部变量仅在该线程中可见.
假设你真的想要本地的线程,那么读取和编写线程局部变量比普通变量更昂贵.每当您面对需要很长时间才能执行的操作时,最好的解决方案是完全停止执行操作.在这种情况下,有两种显而易见的方法:
在这些选项中,前者通常是首选.选项2有一个很大的弱点,如果函数调用另一个使用该变量的函数,它就不能轻易应用.
选项1基本上等于不使用全局变量(线程本地是一种全局变量).
当然,这一切都可能是完全广泛的,因为你对你的代码实际做的事情说的很少.如果要解决性能问题,首先必须确定它的位置,这意味着您需要进行测量.
答案是:您需要分析应用程序,并测量花费最多时间的位置.如果事实证明是在经常引用TLS数据的函数中,那么"也许"可能就是答案.
即使在您自己编写的代码中,通常也很难找出性能不佳的原因:在两个简短的段落中描述的程序远程执行它会更加困难.
配置文件,然后优化.
归档时间: |
|
查看次数: |
1639 次 |
最近记录: |