Драйвер API и серверные части
English | 简体中文 | 日本語 | Deutsch | Русский
Документация · Среда выполнения API · Совместимость · 中文
Драйверные крейты Ruda связывают общий контракт среды выполнения с бэкендами исполнения. Руководство описывает точки входа бэкендов Rust, а не прямые замены функций CUDA Driver API.
1. Крейты бэкендов
| Ящик | Серверная часть выполнения |
|---|---|
ruda-driver-cuda |
NVIDIA CUDA пути к драйверам и компиляции |
ruda-driver-cpu |
CPU |
ruda-driver-wgpu |
WGPU |
ruda-driver-hip |
HIP |
2. Выберите устройство NVIDIA.
ruda_driver_cuda::CudaDevice выбирает устройство через общедоступное поле index: usize, значение которого по умолчанию равно 0. CudaRuntime реализует признак Runtime.
Получите клиент устройства по умолчанию с помощью:
use ruda_driver_cuda::{CudaDevice, CudaRuntime};
use ruda_kernel::dsl::Runtime;
let client = CudaRuntime::client(&CudaDevice::default());
Полный пример работоспособности см. в ptx-runtime. Индекс устройства идентифицирует текущую позицию перечисления компьютера, а не стабильную идентичность между компьютерами или изменения в порядке перечисления.
3. Конфигурация
RuntimeOptions содержит memory_config для управления памятью. CudaCompiler и CudaComputeKernel — это псевдонимы типов для цепочки компиляции CUDA C++; включение прямых PTX не меняет их смысла.
Выберите путь компиляции с помощью RUDA_CUDA_COMPILER, как описано в руководстве по компиляции. install::cuda_path(), install::include_path() и install::cccl_include_path() определяют пути к набору инструментов.
4. Внешние зависимости
Прямая генерация PTX обходит этап компиляции ядра CUDA C++/NVRTC. Для выполнения по-прежнему требуется драйвер NVIDIA, а в крейте сохраняются зависимости NVRTC.
Интерфейсы не гарантируют принятие произвольных внешних контекстов CUDA, потоков или необработанных указателей устройств. Межъязыковая интеграция должна учитывать владение, зависимости выполнения и распространение ошибок; Серверная часть CUDA сама по себе не обеспечивает полную совместимость с ABI.
5. Интегрируйте другой серверный интерфейс
Серверная часть использует Runtime для связи устройства, компилятора и вычислительного сервера. Более высокие уровни получают доступ к контракту через ComputeClient. Перед интеграцией вычислительных библиотек определите хранилище, ошибки компиляции, синхронизацию и семантику запросов возможностей.
Точки входа в исходный код: экспорт CUDA, тип устройства, реализация во время выполнения и характеристика времени выполнения.
6. Взаимодействие с потоками и событиями CUDA
ruda_driver_cuda::interop::{command, StreamCommand, record_allocation} использует ту же службу устройства и контекст CUDA, что и ядра RUDA. ID потоков и событий — управляемые RUDA идентификаторы, а не сырые дескрипторы CUDA; stream 0 — поток по умолчанию.
command(device, StreamCommand::Create)создаёт ID потока.Validate,QueryиSynchronizeпроверяют его, запрашивают состояние или ожидают завершения.Record { stream, event: 0, timing }создаёт и записывает событие; для повторной записи передайте возвращённый ID.Wait { stream, event }вставляет зависимость на GPU, не ожидая завершения GPU на хосте.EventQueryпроверяет готовность,EventSynchronizeожидает,EventDestroyосвобождает событие.Elapsed { start, end }требует двух событий с включённым измерением времени и возвращает миллисекунды FP32, закодированные вu64; декодируйте черезf32::from_bits(value as u32).DeviceSynchronizeожидает завершения контекста и сообщает об отложенных ошибках запуска RUDA. Команды возвращаютResult<u64, ServerError>; готовность кодируется как 0 или 1.
record_allocation(device, stream, handle) сохраняет выделенную память до завершения уже отправленной в этот поток работы; это не заменяет зависимость исполнения. Создание потоков ограничено streaming.max_streams и завершается ошибкой при исчерпании пула. Эти API не импортируют произвольные внешние потоки или контексты CUDA.