Байт-код OpenCL, запущенный на другой карте
У меня есть программа, которая использует OpenCL для расчета, код OpenCL большой и время компиляции составляет около 2 минут при 100% загрузке процессора. Конечно я сохраняю двоичные результаты компиляции. И второй запуск загрузки программы opencl из двоичного файла. Могу ли я использовать тот же двоичный файл на другой видеокарте с тем же чипом, но с другими характеристиками (RAM,CLOCK и т. Д.)?
1 ответ
Что касается спецификации OpenCL, у вас есть только гарантии, что двоичный файл программы может быть повторно использован на том же устройстве, на котором он был создан.
В действительности двоичные файлы, которые возвращаются многими реализациями OpenCL, совместимы с более широким диапазоном устройств, доступных от того же поставщика. Например, NVIDIA возвращает PTX, когда вы запрашиваете двоичные файлы из их реализации, что является промежуточным представлением достаточно высокого уровня (то есть не нативными инструкциями). Это, безусловно, совместимо с другими устройствами, использующими ту же архитектуру, на которой оно было создано (например, все устройства GK110 или все устройства GF104), и вполне вероятно, что оно будет переносимым на целый ряд других архитектур NVIDIA GPU. Другие поставщики также возвращают различные типы промежуточного представления (обычно на основе LLVM IR), которые допускают этот вид двоичной совместимости.
Так что да, вы, вероятно, можете повторно использовать двоичные файлы на разных устройствах, имеющих одинаковую архитектуру, но на самом деле вам просто нужно попробовать и посмотреть. Вы всегда можете реализовать схему, которая пытается использовать двоичный файл, и в случае неудачи прибегнуть к исходному коду.
Мы надеемся, что в будущем мы увидим большое количество поставщиков, поддерживающих недавно ратифицированную спецификацию SPIR, которая представляет собой переносимое на платформу промежуточное представление для программ устройств OpenCL. Это позволит вам создавать двоичные файлы, которые не только совместимы с устройствами из архитектуры одного поставщика, но также и между устройствами многих других поставщиков, которые также поддерживают SPIR. Очевидно, что при снижении SPIR до собственного набора команд могут возникнуть некоторые дополнительные накладные расходы, но это все равно должно привести к значительному ускорению по сравнению с компиляцией исходного кода OpenCL C.