2009-03-05 30 views
10

Lý thuyết tối đa băng thông bộ nhớ cho bộ xử lý Core 2 với bộ nhớ kênh đôi DDR3 là ấn tượng: Theo số Wikipedia article trên kiến ​​trúc, 10+ hoặc 20+ gigabyte trên giây. Tuy nhiên, các cuộc gọi memcpy() không đạt được điều này. Có thể, điều này là do yêu cầu của nhà cung cấp hệ điều hành mà memcpy() được điều chỉnh cho mỗi dòng xử lý dựa trên các đặc tính của bộ vi xử lý, do đó, việc thực hiện memcpy() nên hợp lý trên một số lượng lớn các thương hiệu và dòng.Tối ưu hóa toàn bộ memcpy/memmove cho kiến ​​trúc Core 2 hoặc Core i7?

Câu hỏi của tôi: Có phiên bản có sẵn, được điều chỉnh cao cho bộ vi xử lý Core 2 hoặc Core i7 có thể được sử dụng trong chương trình C không? Tôi chắc chắn rằng tôi không phải là người duy nhất cần một, và nó sẽ là một sự lãng phí lớn của nỗ lực cho tất cả mọi người để vi-tối ưu hóa memcpy riêng của họ().

Trả lời

6

Nếu bạn chỉ định/ARCH: SSE2 đến MSVC, nó sẽ cung cấp cho bạn một memcpy được điều chỉnh (ít nhất là của tôi).

Nếu không, hãy sử dụng nội dung tải/lưu trữ liên kết SSE để sao chép bộ nhớ theo khối lớn, sử dụng Thiết bị đọc của Duff khi cần thiết để xử lý đầu và đuôi dữ liệu để đưa nó đến ranh giới được căn chỉnh. Bạn cũng sẽ cần sử dụng nội dung quản lý bộ nhớ cache để có hiệu suất tốt.

Yếu tố giới hạn của bạn có thể là lỗi nhớ cache và băng thông cầu nam, thay vì chu kỳ CPU. Cho rằng luôn luôn có rất nhiều lưu lượng truy cập khác trên bus bộ nhớ, tôi thường vui khi nhận được khoảng 90% thông lượng băng thông bộ nhớ lý thuyết trong các hoạt động đó.

+1

Bản ghi nhớ MSVC được vector hóa khi các điều kiện này được đáp ứng (khoảng, tôi không phải là chuyên gia về điều này): Cả địa chỉ nguồn và địa chỉ đích đều ít nhất 8 byte (64 bit) và kích thước di chuyển ở trên một ngưỡng nhất định. Sự liên kết 64 bit đến từ sự đảm bảo của MSVC rằng 'malloc' của riêng nó trả về sự liên kết 64 bit. Sau đó, trên các bản dựng 32 bit, SSE2 128 bit sẽ được sử dụng (với trộn 64 bit nếu được yêu cầu) và trên các bản dựng 64 bit, nó sẽ sử dụng các thanh ghi đa năng 64 bit (với thiết bị Duff) để thực hiện chuyển động bởi vì khi nó được thực hiện đúng cách nó "đủ nhanh" so với SSE2. – rwong

+1

/arch: yêu cầu kiến ​​trúc CPU tối thiểu, một trong số: SSE2 - (mặc định) cho phép sử dụng các hướng dẫn có sẵn với SSE2 kích hoạt CPU là vc visual studio vs2013.update3 của ++ đầu ra này . Trong đó SSE2 là mặc định, dựa trên điểm chuẩn của tôi, sử dụng/ARCH: SSE2 sẽ không cải thiện hiệu suất memcpy, và tôi đã đánh giá, thậm chí/ARCH: AVX không cải thiện hiệu năng memcpy. – zhaorufei

2

Bạn có thể tự viết. Hãy thử sử dụng intel optimising compiler để trực tiếp nhắm mục tiêu kiến ​​trúc?

Intel cũng sản xuất một cái gì đó gọi là VTune (trình biên dịch và ngôn ngữ độc lập) để tối ưu hóa các ứng dụng.

Đây là số article khi tối ưu hóa công cụ trò chơi.

+0

Trình biên dịch của Intel cung cấp bao nhiêu cải tiến trên gcc với cùng một công tắc tối ưu hóa ... nói -O3? –

+0

Thời gian qua tôi đã thử nó, khoảng 35%, nhưng đó là một vài năm trước đây. – Crashworks

+0

sẽ downvoter xin vui lòng để lại một bình luận. Cảm ơn. –

7

Khi đo băng thông bạn đã tính đến memcpy là cả đọc và ghi, vì vậy 3 GB/s bộ nhớ sao chép thực sự là 6 GB/s băng thông?

Hãy nhớ rằng, băng thông là tối đa lý thuyết - việc sử dụng thế giới thực sẽ thấp hơn nhiều. Ví dụ, một lỗi trang và băng thông của bạn sẽ giảm xuống MB/s.

memcpy/memmove là trình biên dịch nội tại và thường được inline để đại diện cho movsd (hoặc hướng dẫn SSE thích hợp nếu trình biên dịch của bạn có thể nhắm mục tiêu). Nó có thể là không thể cải thiện codegen trên này, kể từ khi CPU hiện đại sẽ xử lý các hướng dẫn rep như thế này rất, rất tốt.

Các vấn đề liên quan