2013-06-05 43 views
7

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): Correct stream executionCá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: 3 stream execution

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: 12 stream execution

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 : 10 stream execution

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.

+1

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

+1

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? –

+0

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

Trả lời

3

Tôi không thể hoàn toàn chắc chắn nếu không nhìn thấy mã, nhưng có vẻ như bạn đang gặp sự cố với thứ tự bạn đưa ra lệnh. Có một sự khác biệt nhỏ trong cách tính toán khả năng 1.x và 2.x thiết bị xử lý dòng do thực tế là các thiết bị 2.x có thể chạy nhiều hạt nhân đồng thời và xử lý cả hai HtoD và DtoH cùng một lúc.

Nếu bạn enqueue lệnh của bạn theo thứ tự tất cả các HtoDs, tất cả các tính toán, tất cả các DtoHs bạn sẽ có kết quả tốt trên thẻ Tesla (1060 et al.).

Nếu bạn yêu cầu họ sao chép HtoD, tính toán, sao chép DtoH, sao chép HtoD ... v.v. bạn sẽ có kết quả tốt trên Fermi.

Kepler cũng hoạt động tốt trong cả hai trường hợp. Điều này không quan trọng trên các luồng trong cả hai trường hợp Tesla và Fermi, tôi khuyên bạn nên đọc this NVIDIA post để biết thêm thông tin. Chồng chéo giữa các luồng có thể là một vấn đề cực kỳ phức tạp, tôi chúc bạn tốt. Nếu bạn muốn được trợ giúp thêm, một đại diện chung của thứ tự mà bạn enqueue hoạt động sẽ cực kỳ hữu ích.

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