Có, cả việc căn chỉnh và sắp xếp dữ liệu của bạn có thể tạo ra sự khác biệt lớn về hiệu suất, không chỉ một vài phần trăm mà là vài đến hàng trăm phần trăm.
Thực hiện vòng lặp này, hai hướng dẫn quan trọng nếu bạn chạy đủ các vòng lặp.
.globl ASMDELAY
ASMDELAY:
subs r0,r0,#1
bne ASMDELAY
bx lr
Có và không có bộ đệm, và với việc căn chỉnh có và không có bộ đệm trong dự đoán nhánh và bạn có thể thay đổi hiệu suất của hai hướng dẫn đó theo một lượng đáng kể (dấu thời gian):
min max difference
00016DDE 003E025D 003C947F
Một bài kiểm tra hiệu suất bạn có thể rất dễ dàng tự làm. thêm hoặc loại bỏ các xung quanh mã được kiểm tra và thực hiện chính xác thời gian, di chuyển các hướng dẫn được kiểm tra dọc theo một dải địa chỉ đủ rộng để chạm vào các cạnh của các dòng bộ đệm, v.v.
Cùng một loại điều với truy cập dữ liệu. Một số kiến trúc phàn nàn về các truy cập không được phân bổ (thực hiện đọc 32 bit tại địa chỉ 0x1001 chẳng hạn), bằng cách cung cấp cho bạn một lỗi dữ liệu. Một số trong những bạn có thể vô hiệu hóa lỗi và thực hiện cú đánh hiệu suất. Những người khác cho phép truy cập không được phân bổ, bạn chỉ cần đạt được hiệu suất.
Nó đôi khi là "hướng dẫn" nhưng hầu hết thời gian là chu kỳ đồng hồ / xe buýt.
Nhìn vào các triển khai memcpy trong gcc cho các mục tiêu khác nhau. Giả sử bạn đang sao chép cấu trúc có kích thước 0x43 byte, bạn có thể tìm thấy một triển khai sao chép một byte để lại 0x42 sau đó sao chép 0x40 byte trong các khối hiệu quả lớn sau đó 0x2 cuối cùng có thể thực hiện dưới dạng hai byte riêng lẻ hoặc dưới dạng chuyển 16 bit. Sắp xếp và mục tiêu phát huy tác dụng nếu các địa chỉ nguồn và đích nằm trên cùng một liên kết là 0x1003 và 0x2003, sau đó bạn có thể thực hiện một byte, sau đó 0x40 trong các khối lớn sau đó là 0x2, nhưng nếu một là 0x1002 và 0x1003 khác, thì nó sẽ là 0x1002. thực sự xấu xí và thực sự chậm.
Hầu hết thời gian là chu kỳ xe buýt. Hoặc tệ hơn là số lần chuyển. Sử dụng bộ xử lý với bus dữ liệu rộng 64 bit, như ARM và thực hiện chuyển bốn từ (đọc hoặc ghi, LDM hoặc STM) tại địa chỉ 0x1004, đó là địa chỉ được căn chỉnh từ và hoàn toàn hợp pháp, nhưng nếu bus là 64 bit rộng, có khả năng lệnh đơn sẽ chuyển thành ba lần chuyển trong trường hợp này là 32 bit ở 0x1004, 64 bit ở 0x1008 và 32 bit ở 0x100A. Nhưng nếu bạn có cùng một hướng dẫn nhưng tại địa chỉ 0x1008, nó có thể thực hiện chuyển bốn từ duy nhất tại địa chỉ 0x1008. Mỗi lần chuyển có thời gian thiết lập liên quan. Vì vậy, sự khác biệt địa chỉ 0x1004 đến 0x1008 có thể nhanh hơn nhiều lần, thậm chí / đặc biệt khi sử dụng bộ đệm và tất cả đều là bộ nhớ cache.
Nói về, ngay cả khi bạn đọc hai từ tại địa chỉ 0x1000 so với 0x0FFC, 0x0FFC bị lỗi bộ nhớ cache sẽ gây ra hai dòng đọc bộ đệm trong đó 0x1000 là một dòng bộ đệm, dù sao bạn cũng bị phạt một dòng bộ đệm. truy cập (đọc nhiều dữ liệu hơn sử dụng) nhưng sau đó tăng gấp đôi. Làm thế nào các cấu trúc của bạn được căn chỉnh hoặc dữ liệu của bạn nói chung và tần suất truy cập dữ liệu đó, v.v., có thể gây ra lỗi bộ đệm.
Cuối cùng, bạn có thể tước dữ liệu của mình để xử lý dữ liệu bạn có thể tạo ra các vụ trục xuất, bạn có thể gặp xui xẻo thực sự và cuối cùng chỉ sử dụng một phần bộ nhớ cache của bạn và khi bạn lướt qua nó, các blob dữ liệu tiếp theo va chạm với một blob trước đó . Bằng cách trộn dữ liệu của bạn hoặc sắp xếp lại các chức năng trong mã nguồn, v.v. bạn có thể tạo hoặc xóa các xung đột, vì không phải tất cả các bộ nhớ cache được tạo bằng nhau, trình biên dịch sẽ không giúp bạn ở đây. Ngay cả việc phát hiện ra hiệu suất hoặc cải thiện là ở bạn.
Tất cả những điều chúng tôi đã thêm vào để cải thiện hiệu suất, các đường dữ liệu rộng hơn, đường ống dẫn, bộ nhớ cache, dự đoán nhánh, nhiều đơn vị / đường dẫn thực thi, v.v. Thường sẽ giúp ích, nhưng tất cả chúng đều có những điểm yếu, có thể bị khai thác một cách cố ý hoặc vô tình. Có rất ít trình biên dịch hoặc thư viện có thể làm được về nó, nếu bạn quan tâm đến hiệu suất, bạn cần điều chỉnh và một trong những yếu tố điều chỉnh lớn nhất là căn chỉnh mã và dữ liệu, không chỉ căn chỉnh trên 32, 64, 128, 256 ranh giới bit, nhưng cũng là nơi mọi thứ có liên quan với nhau, bạn muốn các vòng lặp được sử dụng nhiều hoặc dữ liệu được sử dụng lại để không hạ cánh theo cùng một cách bộ đệm, mỗi cái đều muốn riêng. Trình biên dịch có thể giúp ví dụ sắp xếp các hướng dẫn cho kiến trúc siêu vô hướng, sắp xếp lại các hướng dẫn liên quan đến nhau không quan trọng,
Sự giám sát lớn nhất là giả định rằng bộ xử lý là nút cổ chai. Đã không đúng trong một thập kỷ trở lên, việc cung cấp bộ xử lý là vấn đề và đó là vấn đề như các lần nhấn hiệu năng căn chỉnh, đập bộ đệm, v.v. Với một công việc nhỏ ngay cả ở cấp mã nguồn, sắp xếp lại dữ liệu trong cấu trúc, sắp xếp thứ tự khai báo biến / cấu trúc, sắp xếp các hàm trong mã nguồn và thêm một chút mã để căn chỉnh dữ liệu, có thể cải thiện hiệu suất nhiều lần hoặc hơn.