Các trình biên dịch có thể phát hiện các truy cập xen kẽ vào các mảng và xen kẽ chúng trong bộ nhớ không?


7

Có thể thiết kế một trình biên dịch tối ưu hóa một vòng lặp trong đó các mảng được truy cập theo cách khác không? Ví dụ như thế này:

// int[] a,b
int sum = 0;
for(int i = 0; i < n; i++)
{
  sum += a[i] + b[i];
}

Với lưu trữ mảng tuần tự thông thường, a[i]b[i]có thể cách xa nhau trong bộ nhớ. Do đó, tôi nghĩ rằng tối ưu hóa trình biên dịch tốt sẽ phát hiện ra điều đó a[i]b[i]luôn truy cập cùng lúc và lưu trữ các mảng xen kẽ, a[0] b[0] a[1] b[1] ...để một truy cập bộ nhớ có thể truy xuất cả hai a[i]b[i].


Chào mừng bạn Tôi đã cố gắng làm rõ câu hỏi của bạn; vui lòng kiểm tra xem tôi đã không cắt xén nó Về nội dung của nó, tôi chắc chắn trình biên dịch có thể phát hiện các trường hợp đơn giản, nhưng tôi nghi ngờ rằng nhìn chung sẽ có nhiều mảng được sử dụng chỉ theo cách đó. Ngoài ra, không nên hiệu quả hơn trên RAM, theo thời gian, để lưu trữ mảng theo cách này. Có thể có các hiệu ứng khác khi chơi, như tài liệu tham khảo của Dave dường như đề xuất.
Raphael

Tôi không chắc chắn rằng giả định cơ bản ở đây là đúng trên kiến ​​trúc bộ nhớ đệm hiện đại; miễn là bộ đệm đủ rộng để chứa một phần đáng kể của cả hai mảng (và không bị tranh chấp bởi các quy trình khác, tất nhiên), thì việc truy cập vào bố cục ngây thơ sẽ hiệu quả.
dmckee --- ex-moderator mèo con

@Raphael: Tôi nghĩ rằng chỉnh sửa của bạn đã thêm các yêu cầu bất ngờ vào câu hỏi. Tôi không nghĩ rằng nó đòi hỏi điều đó a[i]b[i]được truy xuất bằng một thao tác bộ nhớ, nhưng chúng được đặt gần đó trong bộ nhớ để có hiệu năng bộ đệm tốt hơn.
Dave Clarke

@DaveClarke thực sự với một khía cạnh của câu hỏi tôi muốn lấy các giá trị tương ứng của a và b với một thao tác bộ nhớ.
krammer

1
Tôi không thể tìm thấy một tài liệu tham khảo để xác nhận. Sun "đã phá vỡ" các tiêu chuẩn chuẩn 179.art và 171.swim khoảng 10 đến 15 năm trước (tức là tối ưu hóa giúp họ có số liệu tốt hơn so với bảo đảm bởi phần cứng của họ). ISTR rằng đó là với tối ưu hóa liên quan.
AProgrammer

Câu trả lời:


11

Một số công việc đã được thực hiện phù hợp với mô tả của bạn. Ví dụ:

  • Mảng định hướng trình biên dịch xen kẽ để giảm năng lượng trong bộ nhớ đa ngân hàng. bởi Delaluz, V. Hội nghị tự động hóa thiết kế, 2002. Kỷ yếu của ASP-DAC 2002. Châu Á và Nam Thái Bình Dương lần thứ 7 và Hội nghị quốc tế lần thứ 15 về Thiết kế VLSI. Kỷ yếu.

mô tả một tối ưu hóa như vậy.


Cảm ơn. Có phương pháp nào giống nhau cho kiến ​​trúc sử dụng các vòng lặp vector không?
krammer

Trong ví dụ của OP, trình biên dịch thực hiện tối ưu hóa như vậy cũng có thể sử dụng tính năng chặn để hỗ trợ SIMD. Việc chuyển đổi như vậy có thể không phải là tối ưu hóa do một số trình tải trước phần cứng không vượt qua ranh giới trang. Điều này cũng tương tác với tổ chức bộ nhớ, có khả năng tránh xung đột ngân hàng DRAM (xung đột ngân hàng có thể làm giảm băng thông cũng như tăng sử dụng năng lượng) hoặc không khai thác nhiều kênh bộ nhớ.
Paul A. Clayton

1

Câu trả lời ngắn trong trường hợp này là Song song mức bộ nhớ thường đủ để bao gồm nhiều khối bộ nhớ riêng biệt trong một vòng lặp như thế này; xen kẽ vào một luồng duy nhất sẽ thực sự làm chậm quá trình. Nhiều thuật toán bộ nhớ đệm và bộ nhớ ngoài giả định một số mức độ song song như thế này.

Câu trả lời dài hơn, mang tính lý thuyết hơn là bộ nhớ đệm giống như một số khía cạnh của việc thực hiện chương trình có vẻ dễ dàng nhưng chứng tỏ là khó dự đoán nói chung. Chẳng hạn, một khối bộ đệm có thể chỉ cần được tìm nạp nếu một tiến trình đã cho dừng lại; một trình biên dịch có thể dự đoán rằng sẽ rất thú vị để nói rằng ít nhất.

Trường hợp đơn giản hơn để tối ưu hóa một chuỗi truy cập đã biết (không cần dự đoán chúng) là NP-hard:

Cụ thể, giả sử một người được cấp một chuỗi truy cập bộ nhớ và người ta phải đặt dữ liệu vào bộ nhớ để giảm thiểu số lần bỏ lỡ bộ nhớ cache cho chuỗi này. Chúng tôi chỉ ra rằng nếu P ≠ NP, thì người ta không thể ước chừng một cách hiệu quả giải pháp tối ưu thậm chí lên đến tỷ lệ xấp xỉ rất tự do.

Petrank và Rawitz, Độ cứng của vị trí dữ liệu có ý thức bộ đệm


-1

Ví dụ của bạn không đầy đủ, các mảng không được khai báo ở bất cứ đâu và chúng cũng không được khởi tạo ở bất cứ đâu.

Tôi nghi ngờ trong bối cảnh lập trình chung, loại tối ưu hóa này sẽ "rắc rối hơn giá trị của nó". Hầu hết các mảng được truy cập từ nhiều nơi, do đó, một trình biên dịch thường phải đoán nơi nào là quan trọng nhất. Ngoài ra, nhiều mảng sẽ không thể được sửa đổi theo cách này bởi vì chúng vượt qua các giới hạn đơn vị biên dịch hoặc là tham số cho các hàm hoặc như các biến toàn cục. Cuối cùng nó sẽ làm cho thông tin gỡ lỗi phức tạp hơn.


Đoạn quảng cáo một: Trang web này liên quan đến khoa học máy tính, không phải lập trình. Đoạn quảng cáo hai: bạn có thể đưa ra một ví dụ cụ thể hoặc trích dẫn tài liệu tham khảo không?
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.