Tôi đang cố gắng chuyển một thuật toán mà tôi đã viết từ bộ xử lý Tesla T10 (khả năng tính toán 1.3) sang Tesla M2075 (khả năng tính toán 2.0). Trong khi chuyển đổi, tôi đã rất ngạc nhiên khi thấy thuật toán của tôi bị chậm lại. Tôi phân tích nó và thấy rằng có vẻ như là vì trên cỗ máy mới, dòng suối cuda đang chặn. Thuật toán của tôi có 3 nhiệm vụ chính có thể được chia nhỏ và chạy song song: sắp xếp lại bộ nhớ (có thể được thực hiện trên CPU), sao chép bộ nhớ từ máy chủ đến thiết bị và thực thi hạt nhân trên thiết bị. Trên tách máy cũ các dòng cho phép 3 nhiệm vụ chồng chéo lên nhau như thế này (tất cả các ảnh chụp màn hình từ Visual Profiler NVidia): Cách xác định lý do tại sao luồng CUDA chặn
Tuy nhiên trên máy mới khối suối trước khi bắt đầu tính toán CPU cho đến khi hạt nhân trước đó được thực hiện bạn có thể thấy ở đây:
Bạn có thể thấy hàng trên cùng, tất cả các khối màu cam là cudaStreamSynchronize calls chặn cho đến khi hạt nhân trước thực hiện xong, mặc dù hạt nhân đang ở trên một luồng hoàn toàn khác. Dường như nó hoạt động cho lần chạy đầu tiên thông qua các luồng và song song một cách chính xác, nhưng sau đó vấn đề bắt đầu, vì vậy tôi nghĩ rằng có thể nó đang chặn thứ gì đó và tôi đã cố gắng tăng số lượng luồng đã cho tôi kết quả này:
Tại đây bạn có thể thấy rằng vì một số lý do chỉ 4 luồng đầu tiên đang chặn, sau đó luồng bắt đầu song song đúng cách. Như một nỗ lực cuối cùng tôi đã cố gắng để hack xung quanh nó bằng cách chỉ sử dụng 4 luồng đầu tiên trong một lần duy nhất và sau đó chuyển sang sử dụng các luồng sau đó nhưng vẫn không hoạt động và nó vẫn bị ngừng mỗi 4 luồng trong khi cho phép các luồng khác thực thi đồng thời :
Vì vậy, tôi đang tìm bất kỳ ý tưởng nào về những gì có thể gây ra sự cố này và cách chẩn đoán. Tôi đã pored trên mã của tôi và tôi không nghĩ rằng đó là một lỗi ở đó, mặc dù tôi có thể bị nhầm lẫn. Mỗi luồng được đóng gói trong lớp riêng của nó và chỉ có một tham chiếu đến một cudaStream_t duy nhất mà là một thành viên của lớp đó vì vậy tôi không thấy nó có thể tham chiếu đến một luồng khác và chặn nó như thế nào.
Có một số thay đổi đối với cách luồng hoạt động giữa phiên bản 1.3 và 2.0 mà tôi không biết? Nó có thể là một cái gì đó với bộ nhớ chia sẻ không được giải phóng và nó phải chờ đợi về điều đó? Bất kỳ ý tưởng nào về cách chẩn đoán vấn đề này đều được chào đón, cảm ơn.
Tôi tự hỏi liệu sự cố của bạn có thể giống như đã được thảo luận gần đây trong chuỗi sau trong diễn đàn NVIDIA: https: //devtalk.nvidia hay không.com/default/topic/545476/cuda-programming-và-performance/cuda-stream-performance/Giải pháp có thêm tùy chọn 'conckerneltrace' vào thiết lập profiler. – njuffa
windows hoặc linux? bạn đang sử dụng phiên bản trình điều khiển nào trong mỗi trường hợp? các tham số khởi chạy cho hạt nhân của bạn là gì? bạn có thể gửi một người sao chép của một số loại? –
Trong NVIDIA Visual Profiler (CUDA 5.0 và 5.5), cũng có một tùy chọn 'Enable current kernel profiling'. Tôi cho rằng điều này đạt được kết quả tương tự như tùy chọn CLI 'conckerneltrace'. Lưu ý rằng bạn cần một thiết bị CC> = 2.0 cho điều đó. – BenC