Как мне заставить printf CUDA печатать в произвольный поток?

CUDA-х printf() в ядрах выводит на стандартный поток вывода моего процесса. Теперь я хочу, по крайней мере, перенаправить эту распечатку в произвольный поток вывода, начиная с этого момента. Я имею в виду произвольный поток, это не просто файловый дескриптор (как здесь запрашивается) - я хочу иметь возможность использовать поток строк, инфраструктуру журналирования и т. Д.

Если это возможно, я бы хотел, чтобы одно ядро ​​отправляло printf() вывод в некоторый выходной поток. Это возможно?

Примечание: двум добрым душам, которые отметили это своим любимым вопросом: почему вам понравился мой вопрос достаточно, чтобы сделать его любимым, но не достаточно, чтобы поднять его? <озадачен >

2 ответа

Решение

Насколько я знаю, это невозможно. API CUDA не обеспечивает какого-либо контроля над потоком ввода-вывода, в который будет выводиться вывод.

Если вы хотите что-то более сложное, чем средства, предоставляемые средой выполнения, тогда ваше лучшее решение - развернуть свое собственное. До того как в CUDA была добавлена ​​поддержка runf для printf в ядре, NVIDIA поставила (по крайней мере для разработчиков) утилиту cuprintf, которая позволяла ядрам выводить вывод на консоль хоста. Мое предложение было бы взять код для cuprintf и взломать то, что вы ищете.

В Windows CUDA использует стандартный дескриптор, который активен при первой инициализации контекста.

Вы можете

  1. открыть/создать файл или именованный канал,
  2. используйте SetStdHandle(STD_OUTPUT_HANDLE, handle) и вызовите cudaFree(0) или аналогичную функцию в начале вашей программы для инициализации контекста. Для API драйвера решающее значение имеет положение cuInit(0). После этого вы можете
  3. сбросьте SetStdHandle к предыдущему значению, если это необходимо вашей оставшейся программе. CUDA продолжает печатать в заданный дескриптор потока.

Просто будьте осторожны, чтобы команда CUDA действительно была первой для процесса.

Я считаю, что это работает аналогично под Linux (вероятно, с использованием dup2 с двумя аргументами для перенаправления stdout).

Другие вопросы по тегам