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ọ().
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
/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