Câu hỏi của tôi là về vấn đề của cụm từ sau đây từ cuốn sách:mảng của cấu trúc (AoS) vs Cơ cấu Mảng (SOA) trên ngẫu nhiên đọc cho vector hóa
Thật không may, hình thức SoA không phải là lý tưởng trong tất cả hoàn cảnh. Đối với trường hợp ngẫu nhiên hoặc không mạch lạc, tập hợp được sử dụng để truy cập dữ liệu và biểu mẫu SoA có thể dẫn đến dữ liệu không cần thiết được đọc vào bộ nhớ cache, do đó giảm hiệu suất. Trong trường hợp này, việc sử dụng biểu mẫu AoS thay vào đó sẽ dẫn đến một bộ làm việc nhỏ hơn và cải thiện hiệu suất . Nói chung, mặc dù, nếu tính toán là được vector hóa, biểu mẫu SoA được ưu tiên.
My đoán về việc tại sao AoS có thể dẫn đến hiệu suất tốt hơn là khi khác nhau, hoặc tốt hơn hết, lĩnh vực trong cơ cấu tương tự đang tham gia trong thời gian vector hóa đơn.
Ví dụ (chỉ là một khái niệm, không có bê tông, hoặc mã làm việc tại tất cả):
/*Note that the types of data I maintain the same intentionally,
to simplify discussion*/
struct Data {
float mean;
float distribution[10]
}
và xác định mảng của những có ngẫu nhiên từ một số nguồn dữ liệu
Data aos[5];
nay , nếu trong vòng lặp vectơ tôi làm điều gì đó như:
float* dataPtr = &(aos[0].mean);
#pragma simd
for(int i=0; i< 60; i++)
{
const float mean = (*dataPtr);
/*do something with mean */
dataPtr++;
/*do something with distribution */
}
điều này sẽ dẫn đến hiệu suất tốt hơn, gây ra trong trường hợp của SoA, tôi sẽ đẩy thêm dòng bộ nhớ cache thông tin mà tôi thực sự có thể yêu cầu trong quá trình tính toán này. Một số CPU trước khi bộ nhớ đệm? Điều đó trong trường hợp AoS dẫn đến hiệu suất tốt hơn thay thế.
Giả sử của tôi có chính xác không, hoặc có điều gì khác không?
Từ viết tắt có ba chữ cái: SoA = Cấu trúc mảng, AoS = Mảng cấu trúc. –
@ HansPassant: đó là cách họ gọi, và viết tên đầy đủ xuống làm cho tiêu đề quá dài và không kém xấu xí. – Tigran
@Tigran: Xác định các điều khoản một lần, vì lợi ích của những người không biết thuật ngữ của cuốn sách của bạn, không mất nhiều thời gian. –