CUDA -arch для старых графических процессоров, компилируя только хост-код, вызывающий API CUDA или сторонние библиотеки.
Предположим, что установленная версия CUDA поддерживает мой старый графический процессор только при передаче -arch=sm_35. В противном случае ядра не выполняются.
Предположим, что теперь я вызываю только API-интерфейсы среды выполнения CUDA (cudaMalloc, cudaFree и т. д.) в своем коде на C++, а затем компилирую его с помощью nvcc без передачи -arch. Почему эти операции по-прежнему выполняются правильно?
Также оказывается, что вызовы библиотек с поддержкой CUDA (например, MPI с поддержкой CUDA) работают правильно, если они построены с правильной архитектурой. Мой код, связывающийся с этими библиотеками, не требует -arch.
Это правильное наблюдение? Если да, то относится ли это к cuda, cuBLAS, cuSPARSE и т. д.? Другими словами, могу ли я передать -lcublas или -lcusparse с кодом, который использует только библиотеки, не передавая -arch?
1 ответ
Когда вы указываете спецификацию архитектуры для , вы указываете, что делать при компиляции кода устройства. Код устройства — это код, написанный вами или включенный в исходную форму и помеченный значком
API среды выполнения CUDA (и API драйверов) не соответствуют этому описанию. Их поведение не зависит от спецификации вашей арки, которая используется при компиляции кода устройства. API среды выполнения и драйвера представляют собой вызовы предварительно скомпилированных библиотек, поэтому там не выполняется компиляция кода устройства.
Если вы написали «код CUDA», который зависел только от этих библиотек API среды выполнения или драйверов (например,
Что касается других библиотек, я бы провел различие между полностью предварительно скомпилированными библиотеками и библиотеками «шаблонов». (Это различие не является уникальным или специфичным для CUDA.) Библиотека шаблонов имеет исходный код, который включается в процесс компиляции. Примеры библиотек шаблонов в CUDA включают в себя Thust и CUTLASS. При использовании любой из этих библиотек вам, как правило, необходимо будет скомпилировать свой код, и спецификация архитектуры будет важна.
Примерами полностью предварительно скомпилированных библиотек в CUDA являются CUFFT, CUBLAS, CUSOLVER. Код устройства в этих библиотеках уже скомпилирован, и вы не можете перекомпилировать этот код, поэтому спецификация Arch не имеет смысла. Обратите внимание, что у некоторых из этих библиотек есть производные (например, cufftDx), которые являются библиотеками шаблонов. Я не смогу предоставить исчерпывающий список всех CUDA-библиотек. В любом случае оно устарело бы. Вы можете обратиться к примерам кода для различных библиотек, чтобы увидеть, как они устроены. Обычно, имея небольшой опыт работы с шаблонными и предварительно скомпилированными библиотеками, вы научитесь различать их. Например, при компиляции кода Thrust вы включаете заголовки Thrust, но нет библиотек Thrust, на которые можно было бы ссылаться во время компоновки. Это явный признак того, что вы имеете дело с библиотекой шаблонов.
Независимо от того, сомневаетесь ли вы в чем-либо из этого или нет, при использовании