Cách kinh điển để chọn thiết bị trong API thời gian chạy đang sử dụng cudaSetDevice
. Điều đó sẽ định cấu hình thời gian chạy để thực hiện thiết lập bối cảnh lười biếng trên thiết bị được chỉ định. Trước CUDA 4.0, cuộc gọi này đã không thực sự thiết lập một bối cảnh, nó chỉ nói với thời gian chạy mà GPU để thử và sử dụng. Kể từ CUDA 4.0, cuộc gọi này sẽ thiết lập ngữ cảnh trên GPU được chỉ định tại thời điểm gọi. Ngoài ra còn có cudaChooseDevice
, sẽ chọn giữa các thiết bị có sẵn để tìm thiết bị phù hợp với tiêu chí do người gọi cung cấp.
Bạn có thể liệt kê các GPU sẵn có trên hệ thống với cudaGetDeviceCount
và truy xuất thông tin cụ thể của chúng bằng cách sử dụng cudaGetDeviceProperties
. Ví dụ về thiết bị SDK cho thấy chi tiết đầy đủ về cách thực hiện điều này.
Bạn có thể cần phải cẩn thận, tuy nhiên, về cách bạn chọn GPU trong hệ thống nhiều GPU, tùy thuộc vào cấu hình máy chủ và trình điều khiển. Trong cả trình điều khiển Linux và Windows TCC, có tồn tại tùy chọn cho GPU được đánh dấu "tính toán exculsive", có nghĩa là trình điều khiển sẽ giới hạn từng GPU tới một ngữ cảnh hoạt động cùng một lúc hoặc tính toán bị cấm, nghĩa là không có chương trình CUDA nào có thể thiết lập ngữ cảnh trên thiết bị đó. Nếu mã của bạn cố thiết lập ngữ cảnh trên thiết bị bị tính toán bị cấm hoặc trên thiết bị độc quyền tính toán đang được sử dụng, kết quả sẽ là lỗi thiết bị không hợp lệ. Trong một hệ thống nhiều GPU, trong đó chính sách là sử dụng tính độc quyền tính toán, cách tiếp cận chính xác không phải là thử và chọn một GPU cụ thể, mà chỉ đơn giản là cho phép thiết lập bối cảnh lười biếng xảy ra một cách ngầm định. Trình điều khiển sẽ tự động chọn một GPU miễn phí để chạy mã của bạn. Bạn có thể kiểm tra trạng thái chế độ tính toán của bất kỳ thiết bị nào bằng cách đọc trường cudaDeviceProp.computeMode
bằng cách sử dụng cuộc gọi cudaGetDeviceProperties
. Lưu ý rằng bạn được tự do kiểm tra các GPU không khả dụng hoặc bị cấm và truy vấn các thuộc tính của chúng, nhưng bất kỳ hoạt động nào yêu cầu thiết lập ngữ cảnh sẽ không thành công.
Xem tài liệu runtime API trên tất cả các calls
Một giải pháp khác là sử dụng biến môi trường 'CUDA_VISIBLE_DEVICES'. (https://devblogs.nvidia.com/parallelforall/cuda-pro-tip-control-gpu-visibility-cuda_visible_devices/) – Soravux