64 비트 워드 (high32, low32)가 있다고 가정하면 32 비트 변수 (예 : low32)에서 __sync_val_compare_and_swap
을 수행한다고 가정 해보십시오. 두 스레드가 동시에 high32에서 CAS를 시도하고 low32에서 둘 다 성공할 수 있습니까?64 비트 워드에서 32 비트 비교 및 스왑
1
A
답변
2
windows 64 비트에서 인접한 int에있는 CAS는 정렬에 관계없이 그리고 캐시 라인이 교차 되더라도 (내 테스트 앱에 버그가없는 한) 항상 성공합니다. 나는 윈도우 7, 64 비트만을 테스트했다.
편집 : 이것은 CAS가 OS와 상관없이 모든 최신 Intel 칩에서 작동하는 방법입니다. 나는 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. 32 비트/64 비트 OS?
- 2. 32 비트 및 64 비트 프로세스에서 작동해야하는 64 비트 라이브러리
- 3. 32 비트 및 64 비트 ASP.NET 배포
- 4. ODBC .NET 32 비트 및 64 비트
- 5. SWT (32 비트 및 64 비트 JRE)
- 6. 32 비트 및 64 비트 Windows에서 레지스트리
- 7. 32 비트 및 64 비트 설치 프로젝트
- 8. 32 비트 및 64 비트 Python이 충돌합니까?
- 9. 32 비트 및 64 비트 CPU/OS
- 10. 32 비트 64 비트 호환
- 11. 32 비트 서버 및 32/64 비트 클라이언트가있는 서브 버전
- 12. MySQL 32 비트 또는 64 비트 - Apache 32 비트 Windows 64 비트?
- 13. 32 비트 및 64 비트 시스템에서 항상 64 비트입니다.
- 14. 32 비트 및 64 비트 컴퓨터에서 비트 연산
- 15. SharePoint 64 비트 또는 32 비트
- 16. 64 비트 대 32 비트 실행 파일
- 17. 64 비트 머신에서 32 비트 생성
- 18. Gluegen 32 비트 대 64 비트 라이브러리
- 19. 64 비트 대 32 비트 플랫폼의 보급
- 20. Java JDK 32 비트 대 64 비트
- 21. 64 비트 대 32 비트 Windows 결정
- 22. 32 비트 MS 사무용 64 비트 OS
- 23. 32 비트 모드에서 64 비트 값 계산
- 24. iconv() 32 비트 대 Linux의 64 비트
- 25. 64 비트 어셈블리의 32 비트 명령어들
- 26. 64 비트 코드에서 32 비트 DLL에 액세스
- 27. 64 비트 서버에서 32 비트 포트란
- 28. * .WAR (64 비트 x 32 비트) 생성
- 29. 64 비트 Windows에서 후크 32 비트 프로세스
- 30. 64 비트 Linux 스왑 공간
나는 downvote를 이해하지 못합니다. 인접한 2 개의 __int32가 간섭 하는지를 아는 것이 좋을까요? 동일한 캐시 라인을 점유하지 않으면 방해를합니까? 나는 모든 것이 정렬되어야한다고 가정하지만, 그렇지 않다면 두 개의 인접한 정렬되지 않은 __int32가 간섭을 일으킬 것입니다. – johnnycrash
@johnnycrash : 오늘 하루가 더 심해지고 있습니다. 최소한 무언가를 downvoting하는 경우 사람들은 코멘트를 남기도록 강요 할 필요가 있습니다. – arunmoezhi
아무도 답변이 없습니다. 무한 루프에서 각각 하나의 int에서 CAS를 사용하는 두 개의 쓰레드로 이것을 테스트 할 수 있습니다. CAS가 실패했는지 확인하십시오. – johnnycrash