我正在用c ++编写多线程应用程序,其中性能至关重要.我需要在线程之间复制小结构时使用大量锁定,为此我选择使用自旋锁.
我已经做了一些研究和速度测试,我发现大多数实现大致同样快:
__asm {}使用类似这样的代码,它得分约70个时间单位,但我不确定是否已创建适当的内存屏障.编辑:这里给出的时间是2个线程锁定和解锁螺旋锁1,000,000次所需的时间.
我知道这并没有太大的区别,但是由于自旋锁是一个使用频繁的对象,人们会认为程序员会同意以最快的方式制作自旋锁.谷歌搜索导致许多不同的方法.我认为如果使用内联汇编并使用指令而不是比较32位寄存器来实现上述方法将是最快的CMPXCHG8B.此外,必须考虑内存障碍,这可以通过LOCK CMPXHG8B(我认为?)来完成,这保证了内核之间共享内存的"专有权".最后[有人建议]对于繁忙的等待应该伴随NOP:REP,这将使超线程处理器切换到另一个线程,但我不确定这是否是真的?
根据我对不同螺旋锁的性能测试,可以看出没有太大区别,但出于纯粹的学术目的,我想知道哪一个是最快的.但是由于我在汇编语言和内存障碍方面的经验非常有限,如果有人可以为我在LOCK CMPXCHG8B中提供的最后一个示例编写汇编代码并在以下模板中使用适当的内存屏障,我会很高兴:
__asm
{
spin_lock:
;locking code.
spin_unlock:
;unlocking code.
}
Run Code Online (Sandbox Code Playgroud) 如果你有二进制数10110我怎么能让它返回11111?例如,在第一个1之后将所有位设置为1的新二进制数,下面列出了一些类似的例子:
101应返回111(3位长度)011应返回11(2位长度)11100应返回11111(5位长度)101010101应返回111111111(9位长度)
如何在Java中获得最简单的方法?我可以想出一些方法,但它们不是很"漂亮".
昨天我张贴这个问题上如何写一个快速自旋锁.感谢Cory Nelson,我似乎找到了一个比我的问题中讨论的其他方法更优越的方法.我使用该CMPXCHG指令来检查锁是否为0并因此是空闲的.CMPXCHG在'BYTE'上运作,WORD并且DWORD.我会假设指令运行得更快BYTE.但我写了一个实现每种数据类型的锁:
inline void spin_lock_8(char* lck)
{
__asm
{
mov ebx, lck ;move lck pointer into ebx
xor cl, cl ;set CL to 0
inc cl ;increment CL to 1
pause ;
spin_loop:
xor al, al ;set AL to 0
lock cmpxchg byte ptr [ebx], cl ;compare AL to CL. If equal ZF is set and CL is loaded into address pointed to by ebx
jnz spin_loop ;jump …Run Code Online (Sandbox Code Playgroud) 让我们假设整数x.我想将这个数量分成n大部分相等的块并将值保存在向量中.例如,如果x = 10和n = 4然后将所得的载体将是:
(3,3,2,2)
Run Code Online (Sandbox Code Playgroud)
如果n = 3:
(4,3,3)
Run Code Online (Sandbox Code Playgroud)
注意:结果向量的顺序无关紧要
在基准测试中,128位内部函数的执行速度比64位内部函数快?
_mm_sad_epu8(__m128i, __m128i) //Clocks: 0.0300
_mm_sad_pu8(__m64, __m64) //Clocks: 0.0491
Run Code Online (Sandbox Code Playgroud)
据我所知,英特尔参考手册指出(PSADBW)mmx寄存器的延迟为5,吞吐量为1,但没有说明mm寄存器的性能.
它们是否应该同样快速,并且对于采用128位参数的内部函数是否通用?
决定一个点是否在平行四边形/菱形内部的最快速度是什么?
是否可以让MySQL LIMIT的行总数偏移为2,这样查询看起来像这样:
SELECT * FROM test LIMIT COUNT(*) / 2, 5
Run Code Online (Sandbox Code Playgroud)
其中5只是一个数字.
如果你有二进制数10110我怎么能让它返回5?例如,一个数字告诉我们使用了多少位?下面列出了一些类似的例子:
如何在Java中获得最简单的方法?我已经提出了以下方法,但我可以更快地完成:
public static int getBitLength(int value)
{
if (value == 0)
{
return 0;
}
int l = 1;
if (value >>> 16 > 0) { value >>= 16; l += 16; }
if (value >>> 8 > 0) { value >>= 8; l += 8; }
if (value >>> 4 > 0) { value >>= 4; l += 4; }
if (value >>> 2 > 0) { value >>= 2; l += 2; } …Run Code Online (Sandbox Code Playgroud) 我刚刚问了一个涉及volatile:volatile array c ++的问题
然而,我的问题产生了关于什么volatile做的讨论.
有人声称在使用时CreateThread(),您不必担心volatiles.另一方面,Microsoft提供了一个volatile使用两个线程创建时的示例CreateThread().
我创建在Visual C下面的示例++速成2010年,如果你将其标记不要紧done作为volatile或不
#include "targetver.h"
#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <tchar.h>
using namespace std;
bool done = false;
DWORD WINAPI thread1(LPVOID args)
{
while(!done)
{
}
cout << "Thread 1 done!\n";
return 0;
}
DWORD WINAPI thread2(LPVOID args)
{
Sleep(1000);
done = 1;
cout << "Thread 2 done!\n";
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD …Run Code Online (Sandbox Code Playgroud) 如何在as3中的DisplayObjectContainer中遍历所有子节点?我想要这样的语法:
for each(var displayObject:DisplayObject in displayObjectContainer )
{
displayObject.x += 10;
displayObject.y += 10;
}
Run Code Online (Sandbox Code Playgroud)