2014-09-30 14 views
8

Tôi đang chạy lệnh này vào một vỏ và nhận được:Sự mâu thuẫn của các ID giữa 'nvidia-smi -L' và cuDeviceGetName()

C:\Users\me>nvidia-smi -L  
GPU 0: Quadro K2000 (UUID: GPU-b1ac50d1-019c-58e1-3598-4877fddd3f17)  
GPU 1: Quadro 2000 (UUID: GPU-1f22a253-c329-dfb7-0db4-e005efb6a4c7) 

Nhưng trong mã của tôi, khi tôi chạy cuDeviceGetName (.. , ID) trong đó ID là ID được cung cấp bởi đầu ra nvidia-smi, các thiết bị đã được đảo ngược: GPU 0 trở thành Quadro 2000 và GPU 1 trở thành Quadro K2000.

Đây có phải là hành vi dự kiến ​​hoặc lỗi không? Có ai biết một workaround để làm cho nvidia-smi có được 'thực' ID của GPU? Tôi có thể sử dụng UUID để có được thiết bị phù hợp với nvmlDeviceGetUUID() nhưng việc sử dụng API nvml có vẻ hơi phức tạp đối với những gì tôi đang cố gắng đạt được.

This câu hỏi thảo luận cách CUDA gán ID cho thiết bị mà không có kết luận rõ ràng.

Tôi đang sử dụng CUDA 6.5.

CHỈNH SỬA: Tôi đã xem qua trang web nvidia-smi (nên đã thực hiện điều đó sớm hơn ...). Nó nói:

"Đó là khuyến cáo mà người dùng mong muốn consistencyuse hoặc UUDI hoặc ID bus PCI, kể từ khi thiết bị liệt kê trật tự không đảm bảo phù hợp"

Vẫn đang tìm kiếm một kludge ...

Trả lời

9

Hành vi mong đợi.

nvidia-smi liệt kê theo thứ tự PCI.

Theo mặc định, trình điều khiển CUDA và API thời gian chạy không.

Câu hỏi bạn đã liên kết rõ ràng cho thấy cách liên kết hai lược đồ đánh số/đặt hàng.

Không có cách nào để khiến nvidia-smi sửa đổi sơ đồ đặt hàng của nó để khớp với bất kỳ thứ gì sẽ được tạo bởi thời gian chạy CUDA hoặc API trình điều khiển. Tuy nhiên, bạn có thể sửa đổi thứ tự liệt kê thời gian chạy CUDA thông qua việc sử dụng environment variable trong CUDA 8.

+0

Thậm chí tho tài liệu cũng nói rằng nó sắp xếp bởi pciBusId, tôi nghi ngờ rằng đó là tiêu chí duy nhất kể từ khi trên máy tính của tôi 2x Tesla K80 đang trên pciBusId cùng. Tôi tự hỏi đâu là thứ tự đúng cho hai đứa trẻ đó. –

+0

"2x Tesla K80 trên cùng một pciBusid" không thể. Hãy xem kỹ đầu ra của thiết bị của bạn –

+0

Vâng, có thể có một số thẻ trên cùng một pciBusId (được báo cáo bởi http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1g1bf9d625a931d657e08db2b4391170f0), chỉ có thể thay đổi được bởi pciDeviceID. Lưu lượng bản in ví dụ: Thẻ đầu tiên: pciBusID: 0000: 00: 04.0 thẻ thứ hai: pciBusID: 0000: 00: 05.0 Tuy nhiên, cả hai đều có cùng id bus. "0000: 00: 05.0" được tạo bởi "[tên miền]: [xe buýt]: [thiết bị]. [Chức năng]" (xem http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE. html # group__CUDART__DEVICE_1gea264dad3d8c4898e0b82213c0253def) –

2

Đó là hành vi mong đợi.

nvidia-smi manpage nói rằng

index 0 dựa trên GPU/Đơn vị trong kiểu liệt kê tự nhiên được trả về bởi người lái xe,

CUDA API liệt kê theo thứ tự khả năng tính toán giảm dần theo "Hướng dẫn lập trình" 3.2.6.1 Điều tra thiết bị.

Tôi gặp sự cố này và tôi đã viết chương trình tương tự với nvidia-smi, nhưng với các thiết bị được liệt kê theo thứ tự nhất quán với API CUDA. Xa hơn trong ref văn bản về chương trình

https://github.com/smilart/nvidia-cdl

Tôi đã viết chương trình vì nvidia-smi không thể liệt kê thiết bị trong một trật tự phù hợp với CUDA API.

2

Bạn có thể đặt thứ tự thiết bị cho môi trường CUDA trong vỏ của bạn để theo dõi ID xe buýt thay vì thẻ mặc định nhanh nhất. Yêu cầu CUDA 7 trở lên.

xuất khẩu CUDA_DEVICE_ORDER = PCI_BUS_ID

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