2012-02-13 12 views
5

Tôi đang xem một số mã hơi bối rối đã cố gắng trừu tượng hóa nền tảng của các lệnh tìm nạp trước. Dường như nó dựa trên ngữ nghĩa powerpc ban đầu, với Read và Write các biến thể tìm nạp trước bằng cách sử dụng dcbt và dcbtst tương ứng (cả hai đều truyền TH = 0 trong opcode dòng tùy chọn mới).Tìm kiếm các hướng tương đương tốt nhất của các hướng dẫn tìm nạp trước cho ia32, ia64, amd64 và powerpc

Trên nền tảng ia64 chúng tôi đã có để đọc:

__lfetch(__lfhint_nt1, pTouch) 

wherease để ghi:

__lfetch_excl(__lfhint_nt1, pTouch) 

này (đọc vs viết tìm nạp trước) xuất hiện để phù hợp với ngữ nghĩa powerpc khá tốt (với ngoại lệ là ia64 cho phép gợi ý tạm thời).

Hơi tò mò mã ia32/amd64 trong câu hỏi được sử dụng

prefetchnta 

Không

prefetchnt1 

như nó sẽ nếu mã mà là để phù hợp với việc triển khai ia64 (#ifdef biến thể của một trong mã của chúng tôi cho (vẫn còn sống) hpipf cổng của chúng tôi và bây giờ của chúng tôi đã chết cửa sổ và linux ia64 cổng).

Vì chúng ta đang xây dựng với trình biên dịch intel tôi sẽ có thể nhiều ia32/nền tảng amd64 của chúng tôi phù hợp bằng cách chuyển sang builtins xmmintrin.h:

_mm_prefetch((char *)pTouch, _MM_HINT_NTA) 
_mm_prefetch((char *)pTouch, _MM_HINT_T1) 

... cung cấp tôi có thể tìm ra những gì gợi ý tạm thời nên được sử dụng.

Câu hỏi:

  • Có đọc vs hướng dẫn ghi ia32/amd64 prefetch? Tôi không thấy bất kỳ tham chiếu nào trong bộ tham chiếu.

  • Một trong các biến thể thời gian nt1, nt2, nta có được ưa thích hơn để đọc trước khi viết trước không?

  • Bất kỳ ý tưởng nào nếu có lý do chính đáng để sử dụng gợi ý thời gian NTA trên ia32/amd64, nhưng T1 trên ia64?

+1

ARM, PowerPC và một số hệ thống khác cần trợ giúp của lập trình viên trong việc tìm nạp trước dữ liệu. Thật khó để đánh bại logic tìm nạp trước của Intel trên các CPU x86. Bạn sẽ thường làm mọi thứ tồi tệ hơn bằng cách cố gắng thực hiện nó theo cách thủ công. – BitBank

Trả lời

0

Tài nguyên tốt nhất tôi có thể tìm thấy trên các loại gợi ý tìm nạp trước x86 là bài viết tốt 'ol What Every Programmer Should Know About Memory.

Đối với hầu hết các phần trên x86, không có hướng dẫn khác để đọc và ghi tìm nạp trước. Các ngoại lệ có vẻ là những trường hợp không liên kết thời gian, trong đó ghi có thể bỏ qua bộ nhớ cache nhưng theo như tôi có thể nói, đọc sẽ luôn được lưu vào bộ nhớ cache.

Sẽ rất khó để quay lại thông qua lý do tại sao chủ sở hữu mã trước đó đã sử dụng một gợi ý và không phải người khác trên một kiến ​​trúc nhất định. Họ có thể đưa ra giả định về số lượng bộ nhớ cache có sẵn trên bộ vi xử lý trong gia đình đó, kích thước thiết lập làm việc điển hình cho các tệp nhị phân ở đó, mẫu điều khiển luồng dài hạn, v.v ... và không cho biết có bao nhiêu giả định được sao lưu lý luận hoặc dữ liệu.Từ nền giới hạn ở đây, tôi nghĩ rằng bạn sẽ được biện minh trong việc tiếp cận mà làm cho ý nghĩa nhất cho nền tảng bạn đang phát triển trên bây giờ, bất kể những gì đã được thực hiện trên các nền tảng khác. Điều này đặc biệt đúng khi bạn xem xét các bài viết như this one, không phải là ngữ cảnh duy nhất mà tôi đã nghe nói rằng thực sự rất khó để có được bất kỳ hiệu suất nào đạt được với phần mềm tìm nạp trước.

Có thêm chi tiết nào được biết trước, như tỷ lệ bỏ qua bộ nhớ cache điển hình khi sử dụng mã này hay số tiền tìm nạp trước được mong đợi sẽ giúp ích?

1
  • Có đọc vs hướng dẫn ghi ia32/amd64 prefetch? Tôi không thấy bất kỳ tham chiếu nào trong bộ tham chiếu.

Một số hệ thống hỗ trợ prefetchw hướng dẫn viết

  • Would một trong những NT1, NT2, nta biến thời gian được ưa thích để đọc vs ghi nạp trước?

Nếu dòng được độc quyền sử dụng bởi các thread kêu gọi, nó không phải vấn đề làm thế nào bạn mang dòng, cả đọc và viết sẽ có thể sử dụng nó. Lợi ích cho prefetchw được đề cập ở trên là nó sẽ mang lại cho dòng và cung cấp cho bạn quyền sở hữu trên nó, có thể mất một lúc nếu dòng cũng được sử dụng bởi lõi khác. Mặt khác, cấp độ gợi ý là trực giao với các trạng thái MESI, và chỉ ảnh hưởng đến thời gian tồn tại của dòng được tìm nạp trước. Điều này quan trọng nếu bạn tìm nạp trước nhiều thời gian truy cập thực tế và không muốn tìm nạp trước để bị mất trong khoảng thời gian đó, hoặc cách khác - tìm nạp trước ngay trước quyền truy cập và không muốn tìm nạp trước để lưu trữ bộ nhớ cache quá nhiều.

  • Bất cứ ý tưởng nếu có sẽ là một lý do chính đáng để sử dụng các gợi ý thời NTA trên ia32/amd64, nhưng T1 trên ia64?

Chỉ cần suy đoán - có lẽ là cache lớn hơn và bộ nhớ tích cực BW dễ bị tổn thương hơn để tìm nạp trước xấu và bạn muốn giảm tác động thông qua các gợi ý phi thời gian. Hãy xem xét rằng trình tìm nạp trước của bạn đột nhiên được đặt lỏng lẻo để lấy bất cứ thứ gì có thể, bạn sẽ kết thúc bằng cách tìm kiếm các phần mềm tìm nạp rác thông qua rất nhiều bộ nhớ đệm hữu ích. NTA gợi ý làm cho họ tràn ngập nhau, để phần còn lại không bị hư hại.

Tất nhiên đây cũng có thể chỉ là một lỗi, tôi không thể biết chắc chắn, chỉ có ai phát triển trình biên dịch, nhưng nó có thể có ý nghĩa với lý do trên.