Похоже, у вас есть «основное» ядро с частью, которая «переключается» во время выполнения.
Вы можете определенно сделать это, используя nvrtc. Вам нужно будет делать что-то вроде этого:
- Вместо того, чтобы компилировать основное ядро раньше времени, сохраните его как строку, которую нужно скомпилировать и связать во время выполнения.
- Предположим, что основное ядро вызывает «myFunc», который является ядром устройства, выбранным во время выполнения.
- Вы можете создать соответствующее «myFunc» ядро на основе уравнений во время выполнения.
- Теперь вы можете создать программу nvrtc, используя несколько источников, используя nvrtcCreateProgram.
Это примерно. Ключ заключается в том, чтобы отложить компиляцию основного ядра до тех пор, пока оно не понадобится во время выполнения. Вы также можете каким-то образом кэшировать свои ядра, чтобы вы в конечном итоге компилировались только один раз.
Есть одна проблема, которую я предвижу. nvrtc не может найти вызовы устройства curand, которые могут вызвать некоторые проблемы. Одна работа должна состоять в том, чтобы посмотреть на заголовок, в котором находится вызов функции устройства, и использовать nvcc для компиляции соответствующего ядра устройства в ptx. Вы можете сохранить полученный ptx как текст и использовать cuLinkAddData для связи с вашим модулем. Дополнительную информацию вы можете получить в this section.
Согласен с ответом @talonmies. Замена функции, которая уже скомпилирована и связана с объектом, невозможна, я не думаю. Однако я думаю, что должно быть возможно загружать скомпилированное ядром устройство во время выполнения, которое имеет вызов функции '__device__', а затем выбирает и компилирует и связывает во время выполнения определенную функцию устройства, которую вы будете использовать для этого вызова. –
К сожалению, я не могу выбрать определенную функцию, потому что код функции будет сгенерирован в соответствии с моделируемой модели. То есть, загрузка разных моделей подразумевает различные уравнения, которые должны быть оценены в функции '__device__'. Вот почему я мог использовать компиляцию JIT, предоставляемую NVRTC. –
Вы можете выбрать функцию после загрузки модели, и вы знаете, какую функцию вы хотите использовать (или какую функцию вы только что создали). –