2008-08-31 23 views
81

Đây là câu hỏi hơi cấp thấp. Trong x86, lắp ráp có hai lệnh SSE:Ý nghĩa của truy cập bộ nhớ "phi thời gian" trong x86

MOVDQA xmmi, m128

Manual MOVNTDQA xmmi, m128

Các IA-32 phát triển phần mềm cho biết rằng NT trong MOVNTDQA là viết tắt của Không -Temporal và nếu không thì nó giống với MOVDQA.

Câu hỏi của tôi là, Không tạm thời là gì?

+1

Lưu ý rằng SSE4.1 'MOVNTDQA xmmi, m128' là tải NT, trong khi tất cả các lệnh NT khác là các cửa hàng, ngoại trừ' prefetchnta'. Câu trả lời được chấp nhận ở đây dường như chỉ nói về các cửa hàng. [Đây là những gì tôi đã có thể bật lên về tải NT] (http://stackoverflow.com/questions/32103968/non-temporal-loads-and-the-hardware-prefetcher-do-they-work-together). TL: DR: hy vọng CPU sẽ làm một điều gì đó hữu ích với gợi ý NT để giảm thiểu ô nhiễm bộ nhớ đệm, nhưng chúng không ghi đè ngữ nghĩa của bộ nhớ WB "bình thường", vì vậy chúng phải sử dụng bộ nhớ đệm. –

+1

Cập nhật: NT * tải * có thể không làm bất kỳ điều gì hữu ích ngoại trừ vùng bộ nhớ UCSW trên hầu hết các CPU (ví dụ: họ Intel SnB). NT/streaming * store * chắc chắn làm việc trên bộ nhớ bình thường, mặc dù. –

+0

@Peter: Bạn có nghĩa là bộ nhớ USWC phải không?Tôi chưa bao giờ nghe nói về bộ nhớ UCSW hoặc USWC trước đây. Googling các từ viết tắt sai là không hữu ích :-) –

Trả lời

106

Hướng dẫn SSE không tạm thời (MOVNTI, MOVNTQ, v.v.), không tuân thủ các quy tắc kết hợp bộ nhớ cache thông thường. Do đó, các cửa hàng không theo thời gian phải được theo sau bởi một hướng dẫn của SFENCE để các bộ xử lý khác nhìn thấy kết quả của họ một cách kịp thời.

Khi dữ liệu được sản xuất và không (ngay lập tức) tiêu thụ trở lại, thực tế hoạt động lưu trữ bộ nhớ đọc dòng bộ nhớ cache đầy đủ trước và sau đó sửa đổi dữ liệu được lưu vào bộ nhớ cache là bất lợi cho hiệu suất. Thao tác này sẽ đẩy dữ liệu ra khỏi bộ đệm mà có thể cần lại một lần nữa để ưu tiên dữ liệu sẽ không được sử dụng sớm. Điều này đặc biệt đúng đối với các cấu trúc dữ liệu lớn, như ma trận, được lấp đầy và sau đó được sử dụng sau này. Trước phần tử cuối cùng của ma trận được lấp đầy, kích thước tuyệt đối gợi lên các yếu tố đầu tiên, làm cho bộ nhớ đệm của các ghi không hiệu quả.

Đối với trường hợp này và các tình huống tương tự, bộ vi xử lý hỗ trợ các hoạt động ghi không theo thời gian. Không theo thời gian trong ngữ cảnh này có nghĩa là dữ liệu sẽ không được sử dụng lại sớm, vì vậy không có lý do gì để lưu trữ nó. Các hoạt động ghi không theo thời gian này không đọc một dòng bộ nhớ cache và sau đó sửa đổi nó; thay vào đó, nội dung mới được ghi trực tiếp vào bộ nhớ.

Nguồn: http://lwn.net/Articles/255364/

+10

Câu trả lời hay, tôi chỉ muốn chỉ ra rằng trên các loại bộ vi xử lý với hướng dẫn NT, ngay cả với một hướng dẫn phi thời gian (tức là một hướng dẫn bình thường), dòng bộ nhớ cache không phải là "đọc và sau đó sửa đổi". Đối với một lệnh bình thường bằng văn bản cho một dòng mà không có trong bộ nhớ cache, một dòng được dành riêng trong bộ nhớ cache và mặt nạ cho biết những phần nào của dòng được cập nhật. Trang web này gọi nó là "không gian hàng trên cửa hàng": http://www.ptlsim.org/Documentation/html/node30.html. Tôi không thể tìm thấy tài liệu tham khảo chính xác hơn, tôi chỉ nghe về điều này từ những người có công việc là để thực hiện mô phỏng bộ vi xử lý. –

+2

Trên thực tế http://www.ptlsim.org/ là trang web về trình mô phỏng bộ xử lý chính xác chu kỳ, chính xác cùng một loại điều mà những người đã nói với tôi về "không gian hàng trên cửa hàng" đang thực hiện. Tôi cũng nên đề cập đến họ trong trường hợp họ từng thấy nhận xét này: http://unisim.org/ –

+0

Từ các câu trả lời và nhận xét tại đây https://stackoverflow.com/questions/44864033/make-previous-memory-stores- bộ nhớ có thể nhìn thấy được, có vẻ như 'SFENCE' có thể không cần thiết. Ít nhất trong cùng một chuỗi. Bạn cũng có thể nhìn? –

29

Espo có khá nhiều mục tiêu. Chỉ muốn thêm hai xu của tôi:

Cụm từ "không tạm thời" có nghĩa là thiếu địa phương thời gian. Bộ nhớ cache khai thác hai loại địa phương - không gian và thời gian, và bằng cách sử dụng một hướng dẫn phi thời gian, bạn báo hiệu cho bộ xử lý mà bạn không mong đợi mục dữ liệu được sử dụng trong tương lai gần.

Tôi hơi hoài nghi về hội đồng được mã hóa bằng tay sử dụng hướng dẫn kiểm soát bộ nhớ cache. Theo kinh nghiệm của tôi, những điều này dẫn đến nhiều lỗi độc hại hơn bất kỳ hiệu suất hiệu quả nào tăng lên.

+0

câu hỏi về "hội đồng được mã hóa bằng tay sử dụng hướng dẫn kiểm soát bộ nhớ cache". Tôi biết bạn đã nói một cách rõ ràng "được mã hóa bằng tay" về cái gì đó giống như một JavaVM. Đây có phải là trường hợp sử dụng tốt hơn không? JavaVM/Compiler đã phân tích hành vi tĩnh và động của chương trình và sử dụng các hướng dẫn phi thời gian này. – Pat

+1

Việc khai thác các thuộc tính địa phương đã biết (hoặc thiếu thuộc tính) của miền, thuật toán hoặc ứng dụng của bạn không được tránh xa. Tránh ô nhiễm bộ nhớ cache thực sự là một nhiệm vụ tối ưu hóa rất hấp dẫn và hiệu quả. Ngoài ra, tại sao sự ác cảm đối với việc lắp ráp? Có rất nhiều cơ hội cho các lợi ích có sẵn mà trình biên dịch không thể tận dụng được trên –

+3

Đó là sự thật rằng một lập trình viên có trình độ thấp có thể vượt trội hơn một trình biên dịch cho các hạt nhân nhỏ. Điều này là rất tốt cho việc xuất bản các bài báo và các bài đăng trên blog và tôi đã thực hiện cả hai. Chúng cũng là công cụ giáo khoa tốt, và giúp hiểu những gì "thực sự" đang diễn ra. Theo kinh nghiệm của tôi, trong thực tế, khi bạn có một hệ thống thực sự với nhiều lập trình viên làm việc trên nó và tính chính xác và bảo trì là rất quan trọng, lợi ích của việc viết mã cấp thấp hầu như luôn luôn vượt qua những rủi ro. – Pramod