假设我有一个64位字(高32位,低32位),我对32位变量(比如low32)做了__sync_val_compare_and_swap
。在两个线程同时在high32和low32上尝试使用CAS的情况下,它们都可以成功吗?在64位字上进行32位比较和交换
1
A
回答
2
在Windows 64位上,无论对齐方式如何,无论缓存行是否交叉(除非我的测试应用程序有错误),相邻ints上的CAS总是成功。我只测试了Windows 7,64位。
编辑: 这可能是CAS如何工作在所有现代英特尔芯片,无论操作系统。我正在使用I7。
#include <stdio.h>
#include <windows.h>
volatile __declspec(align(64)) char a[128];
int _nAlign = 0;
DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
auto iElem = (int)lpThreadParameter;
volatile auto* p = (int*)(a + _nAlign + sizeof(int) * iElem);
for (long long i = 0; i < 1000000000; ++i) {
int nOld = *p, nNew = nOld + 1;
if (InterlockedCompareExchange((DWORD*)p, (DWORD)nNew, (DWORD)nOld) != nOld)
return 1;
}
return 0;
}
int main(int argc, char* argv[])
{
if (argc == 2)
_nAlign = atoi(argv[1]);
HANDLE aThread[2];
for (int i = 0; i < 2; ++i) {
aThread[i] = CreateThread(NULL, 0, ThreadProc, (LPVOID)i, 0, NULL);
SetThreadAffinityMask(aThread[i], 1<<(2*i)); // hyperthreading is on, so make sure on actual separate cores
}
WaitForMultipleObjects(2, aThread, true, INFINITE);
DWORD aCode[2];
if (!GetExitCodeThread(aThread[0], &aCode[0]) || !GetExitCodeThread(aThread[1], &aCode[1]))
printf("GetExitCodeThread failed\n");
if (aCode[0] || aCode[1])
printf("CAS failed\n");
else
printf("CAS Succeeded\n");
return 0;
}
+0
感谢您的详细验证。我猜想CAS都会成功。但我会尝试记录缓存统计信息,看看是否会导致缓存未命中。 – arunmoezhi
相关问题
- 1. C# - 在32位和64位
- 2. 在32位或64位matlab上运行?
- 3. 64位OS/32位进程
- 4. 在32位和64位平台上总是处理32位?
- 5. 64位JVM上运行的Eclipse 32位
- 6. 在64位机器上运行32位二进制
- 7. 在64位Windows上进行Python 32位开发
- 8. 在64位Linux上执行32位二进制时的SIGSEGV
- 9. 32位和64位CPU/OS
- 10. 64位debian和32位酒
- 11. 32位和64位性能
- 12. 上32位和64位架构寻址
- 13. 在32位系统上安装64位glib2进行交叉编译
- 14. 运行32位和64位java代码
- 15. 在32位和64位Windows中使用WIX进行COM注册
- 16. Windows 7(64位)上的IIS 7和Ms Access 32位32位
- 17. 在64位和32位系统上运行程序
- 18. 在SharePoint 2007上的64位webpart 32位
- 19. 在64位Linux上编译32位libGLEW.so
- 20. 在64位OSX上构建32位libcurl
- 21. 在64位DMD上编译32位
- 22. 对32位系统中的64位字进行操作
- 23. SharePoint 2010加上VS 2010在Windows 7上的32位和Sql Server 32位64位
- 24. 在Windows 7 64位上使用Java 32位的Eclipse 32位
- 25. 编码/在32位和64位
- 26. int_max在32位和64位环境中
- 27. 128位比较和交换固有
- 28. XOR高32位,低32位,64位数
- 29. 在32位和64位机器中总是长64位
- 30. 在64位Windows上以32位进程启动MSIL exe
我不明白downvote。很高兴知道2个相邻的__int32是否会产生干扰?如果不占用相同的缓存行,它们会干涉吗?我假设一切都需要对齐,但如果不是,两个相邻的未对齐__int32会干涉。 – johnnycrash
@johnnycrash:这一天日益恶化。至少,我们需要迫使人们在对某些事情下调时发表评论。 – arunmoezhi
猜猜没有人有答案。你可以用无限循环中的两个线程来测试它,每个线程都使用CAS。看看CAS是否失败。 – johnnycrash