2009-01-30 13 views
28

Tôi nhận thấy rằng các ứng dụng CUDA có xu hướng có thời gian chạy tối đa là 5-15 giây trước khi chúng bị lỗi và thoát ra ngoài. Tôi nhận ra nó là lý tưởng để không có ứng dụng CUDA chạy dài nhưng giả định rằng nó là sự lựa chọn đúng để sử dụng CUDA và do số lượng công việc tuần tự trên mỗi thread nó phải chạy dài, có cách nào để mở rộng số lượng thời gian này hay không để vượt qua nó?Ứng dụng CUDA hết thời gian chờ và không thành công sau vài giây - cách khắc phục sự cố này?

Trả lời

5

Giải pháp cơ bản nhất là chọn một điểm trong tính toán một phần tỷ lệ thông qua đó tôi chắc chắn GPU mà tôi đang làm việc có thể hoàn thành kịp thời, lưu tất cả thông tin trạng thái và dừng, sau đó bắt đầu lần nữa.

Cập nhật: Đối với Linux: Thoát X sẽ cho phép bạn chạy các ứng dụng CUDA miễn là bạn muốn. Không có Tesla yêu cầu (A 9600 được sử dụng để kiểm tra điều này)

Một điều cần lưu ý là nếu X không bao giờ được nhập, trình điều khiển có thể sẽ không được tải và nó sẽ không hoạt động. Nó cũng có vẻ như đối với Linux, chỉ đơn giản là không có bất kỳ X hiển thị vào thời điểm đó cũng sẽ làm việc, do đó, X không cần phải được thoát miễn là bạn màn hình đến một thiết bị đầu cuối không-X màn hình đầy đủ.

+0

Nếu bạn không tải X thì bạn có thể sử dụng tập lệnh để tải trình điều khiển CUDA. Xem hướng dẫn Bắt đầu (http://developer.download.nvidia.com/compute/cuda/3_2_prod/docs/Getting_Started_Linux.pdf) để biết thêm thông tin. – Tom

5

Điều này là không thể. Thời gian chờ để ngăn các lỗi trong tính toán lấy GPU trong thời gian dài.

Nếu bạn sử dụng thẻ chuyên dụng cho công việc CUDA, giới hạn thời gian sẽ được dỡ bỏ. Tôi không chắc chắn nếu điều này đòi hỏi một thẻ Tesla, hoặc nếu một GeForce không có màn hình kết nối có thể được sử dụng.

+0

Sẽ hữu ích nếu xác định trường hợp nào trong số này. Tôi sẽ phải thử một thẻ không tesla mà không kèm theo màn hình và tìm ra. – rck

+2

Tôi vừa thử điều này. Không cần thẻ Tesla. Sử dụng Linux, tôi thực sự không bận tâm đến X và Limit đã được dỡ bỏ. – rck

+0

Vì vậy, như các câu trả lời khác cho thấy, nó thực sự là có thể ... bạn có thể rephrase câu trả lời của bạn? – einpoklum

10

Trên Windows, trình điều khiển đồ họa có bộ đếm thời gian giám sát sẽ giết bất kỳ chương trình đổ bóng nào chạy trong hơn 5 giây. Lưu ý rằng các trình điều khiển Xorg/XFree86 không làm điều này, vì vậy một cách giải quyết có thể là chạy các ứng dụng CUDA trên Linux.

AFAIK không thể vô hiệu hóa bộ đếm giờ giám sát trên Windows. Cách duy nhất để giải quyết vấn đề này trên Windows là sử dụng thẻ thứ hai không có màn hình hiển thị trên đó. Nó không phải là một Tesla nhưng nó không có màn hình hoạt động.

+2

Trên thực tế, trên Windows bất kỳ thiết bị nào có trình điều khiển WDDM sẽ có vấn đề về bộ đếm thời gian giám sát, cho dù nó có màn hình kèm theo hay không. Các card NVIDA Tesla làm việc xung quanh điều này bằng cách có một loại trình điều khiển hoàn toàn khác (trình điều khiển TCC hoặc Tesla Compute Cluster), không xác định GPU với hệ điều hành như bộ điều hợp hiển thị. Nếu bạn chỉ cần cắm một card màn hình thứ hai (Radeon hoặc GeForce) mà không có màn hình nào được gắn vào, nó sẽ vẫn được hệ điều hành nhận diện như một thiết bị bộ điều hợp hiển thị WDDM và bộ đếm giờ giám sát vẫn sẽ được áp dụng. –

25

Tôi không phải là chuyên gia CUDA, --- Tôi đã phát triển với AMD Stream SDK, mà AFAIK gần như tương đương.

Bạn có thể tắt bộ hẹn giờ đồng hồ Windows, nhưng đó là không được đề xuất, vì những lý do phải rõ ràng. Để tắt tính năng này, bạn cần phải chỉnh sửa HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Watchdog\Display\DisableBugCheck, tạo REG_DWORD và đặt thành 1. Bạn cũng có thể cần thực hiện điều gì đó trong bảng điều khiển NVidia. Tìm một số tham chiếu đến "Phục hồi VPU" trong tài liệu CUDA.

Lý tưởng nhất là bạn có thể chia các hoạt động hạt nhân của mình thành nhiều lần chuyển dữ liệu để chia nhỏ thành các hoạt động chạy trong thời gian giới hạn.

Ngoài ra, bạn có thể chia miền vấn đề để máy tính có ít pixel đầu ra hơn cho mỗi lệnh. Tức là, thay vì tính toán 1.000.000 điểm ảnh đầu ra trong một lần giảm, hãy đưa ra 10 lệnh tới CPU để tính 100.000 mỗi điểm.

Đơn vị cơ bản phải vừa trong lát thời gian không phải là toàn bộ ứng dụng của bạn, mà là thực hiện một bộ đệm lệnh đơn. Trong AMD Stream SDK, một chuỗi hoạt động dài có thể được chia thành nhiều lát thời gian bằng cách xóa sạch hàng đợi lệnh bằng lệnh CtxFlush(). Có lẽ CUDA có cái gì đó tương tự?

Bạn nên không phải đọc tất cả dữ liệu của bạn qua lại trên xe buýt PCIX trên mọi lát thời gian; bạn có thể để lại kết cấu, v.v. trong bộ nhớ cục bộ của gpu; bạn chỉ thỉnh thoảng mới có một số bộ đệm lệnh, để chứng minh cho hệ điều hành rằng bạn không bị mắc kẹt trong một vòng lặp vô hạn.

Cuối cùng, GPU là nhanh, vì vậy nếu ứng dụng của bạn không thể thực hiện công việc hữu ích trong 5 hoặc 10 giây đó, tôi sẽ coi đó là dấu hiệu cho thấy có sự cố.

[EDIT tháng 3 năm 2010 để cập nhật:] Khóa đăng ký ở trên đã lỗi thời. Tôi nghĩ đó là chìa khóa cho Windows XP 64-bit. Có các khóa registry mới cho Vista và Windows 7. Bạn có thể tìm thấy chúng ở đây: http://www.microsoft.com/whdc/device/display/wddm_timeout.mspx hoặc ở đây: http://msdn.microsoft.com/en-us/library/ee817001.aspx

[EDIT tháng tư năm 2015 để cập nhật:] Đây là nhận được thực sự hết hiệu lực. Cách dễ nhất để vô hiệu hóa TDR cho lập trình Cuda, giả sử bạn đã cài đặt công cụ NVIDIA Nsight, mở Nsight Monitor, bấm vào "Nsight Monitor options", và dưới "General" đặt "WDDM TDR enabled" thành false. Điều này sẽ thay đổi cài đặt đăng ký cho bạn. Đóng và khởi động lại. Mọi thay đổi đối với cài đặt đăng ký TDR sẽ không có hiệu lực cho đến khi bạn khởi động lại.

+12

Tôi không phải là lập trình viên SIMD, tôi cũng không chơi trên TV, nhưng IMHO hơi quá chung chung để nói rằng "Cuối cùng, GPU nhanh, vì vậy nếu ứng dụng của bạn không thể thực hiện công việc hữu ích trong 5 hoặc 10 giây, tôi coi đó là dấu hiệu cho thấy có điều gì đó sai. " Trong các ứng dụng khoa học (như những CUDA thường được sử dụng), đôi khi bạn chỉ có rất nhiều tính toán. –

+0

San Jacinto: Xem câu trả lời của Tom bên dưới. Thời gian chờ là hợp lý trong trường hợp GPU bạn đang tính toán cũng là GPU hiển thị của bạn. Trong trường hợp nó không được sử dụng để hiển thị thì bạn có nhiều lựa chọn hơn. –

+0

Chắc chắn là sai khi nói rằng cơ quan giám sát không nên bị vô hiệu hóa. Cơ quan giám sát bị hỏng hoàn toàn: nó kích hoạt khi một bước trong trình gỡ lỗi và nó có xu hướng đóng băng hoàn toàn hệ thống trong cấu hình đa màn hình/hiển thị, không phải bất kỳ trợ giúp nào cho bất kỳ ai. –

3

Giải pháp tôi sử dụng là:

1. Chuyển tất cả thông tin đến thiết bị.
2. Chạy các phiên bản lặp của thuật toán, trong đó mỗi lần lặp sẽ gọi hạt nhân trên bộ nhớ đã được lưu trữ trong thiết bị.
3. Cuối cùng chuyển bộ nhớ để lưu trữ chỉ sau khi tất cả các lần lặp lại đã kết thúc.

Điều này cho phép kiểm soát lặp lại từ CPU (bao gồm tùy chọn hủy), mà không cần thiết bị tốn kém < - > chuyển bộ nhớ máy chủ giữa các lần lặp.

3

Bộ hẹn giờ giám sát chỉ áp dụng trên các GPU có màn hình được đính kèm.

Trên Windows bộ hẹn giờ là một phần của WDDM, có thể sửa đổi cài đặt (thời gian chờ, hành vi đạt thời gian chờ vv) với một số khóa đăng ký, xem Microsoft article để biết thêm thông tin.

+0

Xin chào Tom, tôi đã sửa đổi bộ đếm thời gian cơ quan giám sát đã (đến ~ 6 ngày) và đã quản lý để có được một hạt nhân duy nhất chạy trong 40 giây. Ive chỉ cố gắng chạy một lớn hơn đáng kể nhưng tôi tiếp tục nhận được một lỗi "ErrorLaunch TimeOut". Tôi chỉ có một GPU duy nhất vì vậy tôi đã tự hỏi nếu có cái gì khác mà có thể được buộc các GPU để đáp ứng trước khi hạt nhân của nó hoàn thành, đặc biệt vì nó chỉ mất khoảng 4-5 phút để chạy và thời gian chờ được thiết lập để như vậy số lượng lớn? Cảm ơn thời gian của bạn, tôi thực sự đánh giá cao nó. –

2

Có thể tắt hành vi này trong Linux. Mặc dù "cơ quan giám sát" có mục đích rõ ràng, nó có thể gây ra một số kết quả rất bất ngờ khi thực hiện tính toán rộng rãi bằng cách sử dụng trình tạo bóng/CUDA.

Các tùy chọn có thể được toggled trong X-cấu hình của bạn (có khả năng /etc/X11/xorg.conf)

Thêm: Lựa chọn "tương tác" "0" đến phần thiết bị của GPU của bạn không được công việc.

thấy CUDA Visual Profiler 'Interactive' X config option?

Để biết chi tiết về cấu hình

thấy ftp://download.nvidia.com/XFree86/Linux-x86/270.41.06/README/xconfigoptions.html#Interactive

Đối với một mô tả về các tham số.

8

Resolve Timeout Detection and Recovery - WINDOWS 7 (32/64 bit)

Tạo một khóa registry trong Windows để thay đổi các thiết lập TDR để một số tiền cao hơn , do đó, Windows sẽ cho phép một sự chậm trễ lâu hơn trước khi bắt đầu quá trình TDR.

Mở Regedit từ Chạy hoặc DOS.

Trong Windows 7 điều hướng vào vùng khóa registry đúng, để tạo ra chìa khóa mới:

HKEY_LOCAL_MACHINE> SYSTEM> CurrentControlSet> Control> GraphicsDrivers.

Có thể có một khóa trong đó có tên là DxgKrnlVersion ở đó là DWord.

Nhấp chuột phải và chọn để tạo ra một mới quan trọng REG_DWORD, và đặt tên là TdrDelay. Giá trị được gán cho nó là số giây trước khi TDR khởi động trong - nó> hiện là 2 tự động trong Windows (thậm chí mặc dù giá trị khóa reg. Không tồn tại> cho đến khi bạn tạo nó). Chỉ định với giá trị mới (tôi đã thử 4 giây), tăng gấp đôi thời gian trước TDR. Sau đó khởi động lại PC. Bạn cần khởi động lại PC trước khi giá trị hoạt động.

Nguồn từ Win7 TDR (Driver Timeout Detection & Recovery) Tôi cũng đã xác minh điều này và hoạt động tốt.

+0

Điều này giải quyết được một vấn đề tương tự đối với tôi ... – einpoklum