我有一臺運行64位處理器的64位機器,但我的應用程序是32位。閱讀或寫作雙保證是原子?我只是在談論作業和閱讀。 32位程序如何影響這個過程?當其他線程在給定規範中寫入時,讀者是否可以從雙精度值讀取部分值?是讀取和寫入雙重保證在64位英特爾處理器上原子的變量?
回答
編號A double可以很容易地跨越L1緩存線的邊界,需要多個總線週期將兩塊膠粘在一起。在C#中一個非常現實的問題是,32位CLR僅提供了對齊保證4.這些未對齊的訪問不僅不是原子的,而且由於處理器需要進行混洗,所以它們也很昂貴。使用雙精度的代碼可以有3個不同的定時,如果雙精度偶然對齊到8,則速度快;當它與4偏移但仍然在L1高速緩存線內時速度減慢兩倍;當跨越一個偏移量時偏移速度慢三倍緩存行。當垃圾收集器壓縮堆並移動double時,這樣的程序可以隨機碰到這些模式之一。對非常感興趣,綜合測試程序可以很容易地錯過這種故障模式。
perf問題是double []在大對象堆中分配得早得多的正常核心原因。 LOH提供了一個8保證的路線。正常的規則是對象> = 85,000字節,對於32位模式中的double [],它是8,000字節(數組中有1000個元素)。
您必須如果您需要原子性保證,請使用Interlocked.Exchange()。我應該發佈免責聲明,即原子性是一個非常弱的保證,並且在需要時不能替代正確的鎖定。
雙打不對齊是真的嗎?這必須對性能產生驚人的影響。 –
我發現了這個硬路™:)而且更喜歡x64的抖動。 –
我使用'GCAlloc'作爲'gch = GCHandle.Alloc(data,GCHandleType.Pinned)'分配一個大約100到500'雙精度數組'。這是否與預期一致? – Alok
- 1. 分割的64位英特爾(和非英特爾)處理器
- 2. 原子64位寫入GCC
- 3. 英特爾8086處理器
- 4. 英特爾原子或ARM重型信號處理的工作量
- 5. 32位英特爾處理器上的內存對齊
- 6. 推的64位英特爾OSX
- 7. 如何確保原子讀取和原子寫入?
- 8. 用於.NET的64位系統上的原子讀取/寫入大小?
- 9. 在Ubuntu上的Rails安裝英特爾64位
- 10. 如何獲取64位機器上的處理器數量?
- 11. 英特爾復位向量
- 12. 英特爾IAPX88處理器,陷阱ISR
- 13. 英特爾多處理器文檔
- 14. Django:原子DateTimeField讀取和寫入
- 15. 原子讀取和寫入訪問
- 16. 在32位和64位平臺上總是處理32位?
- 17. 在cortex-m3上讀取一個64位的volatile變量
- 18. 英特爾性能基元只能在基於英特爾處理器的設備上工作嗎?
- 19. 32和位固有之間64選擇CRC英特爾CPU
- 20. 是在單核CPU原子上寫入變量嗎?
- 21. 在批處理和python腳本中讀取/寫入相同的變量
- 22. 的64位處理器
- 23. 在R中讀取FORTRAN寫入的雙精度變量
- 24. 如何在雙核處理器機器上安裝英特爾的HAXM仿真器?
- 25. 英特爾凌動處理器和Visual Studio
- 26. 英特爾酷睿i7處理器和高速緩存行爲
- 27. 如何監控英特爾(酷睿2雙核)處理器的C狀態?
- 28. Spring批處理 - 循環讀取器,處理器和寫入器N次
- 29. 具有32位操作系統程序兼容性的64位處理器?在64位處理器上的
- 30. 應該將一個雙變量或長變量聲明爲volatile以在64位操作系統和64位cpu上實現讀/寫atomicy?
不,_「[讀取和寫入\ [... \] long,ulong,double和decimal以及用戶定義的類型不保證是原子](http:// msdn。 microsoft.com/en-us/library/aa691278%28VS.71%29.aspx)"_。另請參閱[是否爲Volatile.Read/Volatile.Write for「double」atomic?](http://stackoverflow.com/questions/12435325/does-volatile-read-volatile-write-for-double-atomic)。 – CodeCaster
@CodeCaster這是來自VS03(不VS13)和C#語言規範。如果需要,64位CLR可以提供額外的保證。 – usr
如果double對齊(即在8字節的邊界上),那麼讀取和寫入是原子的。在32位和64位架構上都是如此。 –