2010-10-01 29 views
79

Tôi đã đọc hướng dẫn lập trình cho CUDA và OpenCL, và tôi không thể tìm ra xung đột ngân hàng là gì. Họ chỉ cần đi sâu vào cách giải quyết vấn đề mà không cần giải thích thêm về chủ đề đó. Ai có thể giúp tôi hiểu nó không? Tôi không có ưu tiên nếu sự giúp đỡ là trong bối cảnh của CUDA/OpenCL hoặc chỉ xung đột ngân hàng nói chung trong khoa học máy tính.Xung đột ngân hàng là gì? (Lập trình Cuda/OpenCL)

+0

Hãy thử googling [cuda "xung đột ngân hàng"] thay thế. – belwood

Trả lời

86

Đối với nvidia (và amd cho vấn đề đó) gpus bộ nhớ cục bộ được chia thành bộ nhớ. Mỗi ngân hàng chỉ có thể địa chỉ một tập dữ liệu tại một thời điểm, vì vậy nếu một nửa chương trình tìm cách tải/lưu trữ dữ liệu từ/đến cùng một ngân hàng thì quyền truy cập phải được tuần tự hóa (đây là xung đột ngân hàng). Đối với gt200 gpus có 16 ngân hàng (32banks cho fermi), 16 hoặc 32 ngân hàng cho AMD gpus (57xx hoặc cao hơn: 32, mọi thứ bên dưới: 16)), được xen kẽ với một hạt 32 bit (vì vậy byte 0-3 nằm trong ngân hàng 1, 4-7 ở ngân hàng 2, ..., 64-69 ở ngân hàng 1 và cứ tiếp tục). Để có hình ảnh tốt hơn về cơ bản, nó trông giống như sau:

Bank |  1  |  2  |  3  |... 
Address | 0 1 2 3 | 4 5 6 7 | 8 9 10 11 |... 
Address | 64 65 66 67 | 68 69 70 71 | 72 73 74 75 |... 
... 

Vì vậy, nếu mỗi chuỗi trong truy cập halfwarp tiếp tục giá trị 32 bit không có xung đột ngân hàng. Một ngoại lệ từ quy tắc này (mỗi luồng phải truy cập vào ngân hàng của riêng mình) là các chương trình phát sóng: Nếu tất cả các chuỗi truy cập cùng một địa chỉ, giá trị chỉ được đọc một lần và được phát đến tất cả các chủ đề (đối với GT200 nó phải là tất cả các chủ đề trong truy cập halfwarp cùng một địa chỉ, iirc fermi và AMD gpus có thể làm điều này cho bất kỳ số lượng các chủ đề truy cập vào cùng một giá trị).

+3

Cảm ơn ngọt ngào về hình ảnh và lời giải thích. Tôi không biết về chương trình phát sóng và có vẻ như một chút thông tin quan trọng :) Làm cách nào để xác minh rằng tải và cửa hàng của tôi không gây xung đột ngân hàng trong bộ nhớ dùng chung? Tôi có phải lấy mã lắp ráp bằng cách nào đó hoặc có cách nào khác không? – smuggledPancakes

+3

kể từ khi xảy ra xung đột ngân hàng là somethink sẽ được xác định khi chạy (nghĩa là trình biên dịch không biết về nó, sau khi tất cả các địa chỉ được tạo ra trong thời gian chạy), việc biên dịch phiên bản sẽ không giúp được gì nhiều. Tôi thường làm điều này theo cách cũ fashined, menaing tôi lấy một cây bút và giấy và bắt đầu suy nghĩ về những gì mã của tôi lưu trữ ở đâu. Sau khi các quy tắc điều chỉnh sự xuất hiện của xung đột ngân hàng không phức tạp. Nếu không, bạn có thể sử dụng nvidia OpenCL profiler (nên được đóng gói với sdk, iirc). Tôi nghĩ rằng nó có một truy cập cho serializes dọc. – Grizzly

+1

Cảm ơn bạn đã chỉ ra serialized dọc. Một trong những tệp văn bản readme đi kèm với trình lược tả tính toán cho biết điều này, – smuggledPancakes

11

Bộ nhớ chia sẻ có thể được truy cập song song được chia thành các mô-đun (còn gọi là các ngân hàng). Nếu hai vị trí bộ nhớ (địa chỉ) xuất hiện trong cùng một ngân hàng, thì bạn sẽ nhận được một cuộc xung đột ngân hàng trong thời gian truy cập được thực hiện một cách liên tục, mất đi các lợi thế khi truy cập song song.

+0

Vì vậy, điều này có liên quan đến khi một nửa warp muốn lưu trữ hoặc tải bộ nhớ? 16 chủ đề sẽ cố gắng thực hiện một giao dịch bộ nhớ và do đó truy cập vào cùng một ngân hàng với nhiều hơn một luồng gây ra xử lý tuần tự? Ngoài ra, làm thế nào để đảm bảo rằng bạn không lưu trữ/tải dữ liệu trong cùng một ngân hàng? – smuggledPancakes

5

Nói cách đơn giản, xung đột ngân hàng là trường hợp khi bất kỳ mẫu truy cập bộ nhớ nào không phân phối IO trên các ngân hàng có sẵn trong hệ thống bộ nhớ. Các ví dụ sau đây mô tả khái niệm: -

Giả sử chúng tôi có các mảng số nguyên 512x512 và hệ thống DRAM hoặc bộ nhớ của chúng tôi có 512 ngân hàng trong đó. Theo mặc định, dữ liệu mảng sẽ được bố trí theo cách mà arr [0] [0] chuyển đến ngân hàng 0, arr [0] [1] chuyển đến ngân hàng 1, arr [0] [2] đến ngân hàng 2 .... arr [0] [511] chuyển đến ngân hàng 511. Để khái quát hóa arr [x] [y] chiếm số ngân hàng y. Bây giờ một số mã (như hình dưới đây) bắt đầu truy cập dữ liệu trong cột thời trang chính nghĩa là. thay đổi x trong khi vẫn giữ liên tục y, thì kết quả cuối cùng sẽ là tất cả truy cập bộ nhớ liên tiếp sẽ chạm vào cùng một ngân hàng - do đó xung đột ngân hàng.

int arr[512][512]; 
    for (j = 0; j < 512; j++) // outer loop 
    for (i = 0; i < 512; i++) // inner loop 
     arr[i][j] = 2 * arr[i][j]; // column major processing 

Các vấn đề như vậy, thường tránh được bởi trình biên dịch bằng cách đệm mảng hoặc sử dụng số nguyên tố chính trong mảng.

2

(CUDA Ngân hàng Xung đột) Tôi hy vọng điều này sẽ giúp .. đây là phần giải thích rất tốt ...

http://www.youtube.com/watch?v=CZgM3DEBplE

+0

Lưu ý rằng [câu trả lời chỉ có liên kết] (http://meta.stackoverflow.com/tags/link-only-answers/info) không được khuyến khích, các câu trả lời SO phải là điểm cuối của việc tìm kiếm giải pháp (so với nhưng một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – kleopatra

+0

Hãy xây dựng qua liên kết trong nỗ lực hỗ trợ OP tốt hơn. –

+0

Video này thực sự hữu ích! Và tôi không biết tại sao bỏ phiếu xuống! Nó là một đầu vào rất tốt! +1 – Gabriel

Các vấn đề liên quan