假設我有一個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