Связать ядра вместе

У меня есть ядро ​​CUDA в файле .cu и другое ядро ​​CUDA в другом файле .cu. Я знаю, что с динамическим параллелизмом я могу вызвать другое ядро ​​CUDA из родительского ядра, но я хотел бы знать, есть ли способ сделать это с дочерним ядром, находящимся в другом файле .cu.


person Marco A.    schedule 17.12.2013    source источник


Ответы (1)


Да, ты можешь.

Ключевым моментом является использование раздельной компиляции со связыванием кода устройства, что доступно с nvcc. Поскольку это уже требуется для использования динамического параллелизм, здесь действительно нет ничего нового.

Вот простой пример:

ch_kernel.cu:

#include <stdio.h>

__global__ void ch_kernel(){

  printf("hello from child kernel\n");
}

main.cu:

#include <stdio.h>

extern __global__ void ch_kernel();

__global__ void kernel(){

  ch_kernel<<<1,1>>>();
}

int main(){

  kernel<<<1,1>>>();
  cudaDeviceSynchronize();
}

скомпилировать с:

nvcc -arch=sm_35 -rdc=true -o test ch_kernel.cu main.cu -lcudadevrt
person Robert Crovella    schedule 17.12.2013
comment
Спасибо Роберт! Еще одна деталь, если позволите: могу ли я использовать файл PTX, в котором содержится функция внешнего устройства? Может ли объектный файл быть сгенерирован им? - person Marco A.; 17.12.2013
comment
Это не мелочь и не мелочь. Я предлагаю представить это как новый вопрос SO, если это вас интересует. - person Robert Crovella; 17.12.2013
comment
Сделаю! Имеет смысл: stackoverflow .com/questions/20657004/ - person Marco A.; 18.12.2013