Tôi đã xem qua hướng dẫn lập trình và hướng dẫn thực hành tốt nhất và nó đề cập rằng truy cập bộ nhớ toàn cầu mất 400-600 chu kỳ. Tôi không thấy nhiều về các loại bộ nhớ khác như bộ nhớ cache kết cấu, bộ nhớ cache không đổi, bộ nhớ dùng chung. Các thanh ghi có độ trễ bộ nhớ là 0.Có bao nhiêu chu kỳ trễ bộ nhớ trên mỗi loại truy cập bộ nhớ trong OpenCL/CUDA?
Tôi nghĩ bộ nhớ cache liên tục giống như sổ đăng ký nếu tất cả các chủ đề sử dụng cùng một địa chỉ trong bộ đệm không đổi. Trường hợp xấu nhất tôi không chắc lắm.
Bộ nhớ dùng chung giống với sổ đăng ký miễn là không có xung đột ngân hàng? Nếu có thì độ trễ được mở ra như thế nào?
Còn cache kết cấu thì sao?
Nó vẫn có giá trị sử dụng bộ đệm không đổi nếu ví dụ, tất cả các chuỗi truy cập 1000 nổi? Điều đó có giống như 1000 lần đọc từ một thanh ghi không? Các hướng dẫn cho biết việc sử dụng bộ nhớ cache liên tục theo cách này quy mô tuyến tính phải không? – smuggledPancakes
Nếu tất cả các chủ đề truy cập vào giá trị * cùng * trong bất kỳ lần lặp nào đã cho của một vòng lặp thì bạn có thể sử dụng bộ đệm không đổi. Bộ đệm không đổi sẽ cung cấp một số lợi ích do không gian địa phương (trên bộ nhớ cache Fermi L1 có thể đạt được điều tương tự nhưng điều này để lại L1 miễn phí cho các dữ liệu khác). Có nói rằng, tôi nhắm mục tiêu Fermi chủ yếu và không bao giờ sử dụng '__constant__', tôi chỉ sử dụng const rất nhiều và để cho trình biên dịch con số nó ra! Ví dụ trong trường hợp của bạn, tôi sẽ chuyển kernel arg như 'const float * const myfloatarray'. Tôi sẽ khuyên bạn nên luôn luôn chạy Visual Profiler để kiểm tra serialization chỉ trong trường hợp bạn bị mất một cái gì đó. – Tom
Người ta có thể thêm, các dòng bộ nhớ cache là 128byte (32byte) cho L1 (L2), vì vậy chúng ta đang nói về các địa chỉ rơi vào cùng một dòng (không nhất thiết cùng địa chỉ). Có thể tìm thấy một số số trên các độ trễ khác [ở đây] (http://stackoverflow.com/questions/6744101/fermi-l2-cache-hit-latency). –