Как мне заставить printf CUDA печатать в произвольный поток?
CUDA-х printf()
в ядрах выводит на стандартный поток вывода моего процесса. Теперь я хочу, по крайней мере, перенаправить эту распечатку в произвольный поток вывода, начиная с этого момента. Я имею в виду произвольный поток, это не просто файловый дескриптор (как здесь запрашивается) - я хочу иметь возможность использовать поток строк, инфраструктуру журналирования и т. Д.
Если это возможно, я бы хотел, чтобы одно ядро отправляло printf()
вывод в некоторый выходной поток. Это возможно?
Примечание: двум добрым душам, которые отметили это своим любимым вопросом: почему вам понравился мой вопрос достаточно, чтобы сделать его любимым, но не достаточно, чтобы поднять его? <озадачен >
2 ответа
Насколько я знаю, это невозможно. API CUDA не обеспечивает какого-либо контроля над потоком ввода-вывода, в который будет выводиться вывод.
Если вы хотите что-то более сложное, чем средства, предоставляемые средой выполнения, тогда ваше лучшее решение - развернуть свое собственное. До того как в CUDA была добавлена поддержка runf для printf в ядре, NVIDIA поставила (по крайней мере для разработчиков) утилиту cuprintf, которая позволяла ядрам выводить вывод на консоль хоста. Мое предложение было бы взять код для cuprintf и взломать то, что вы ищете.
В Windows CUDA использует стандартный дескриптор, который активен при первой инициализации контекста.
Вы можете
- открыть/создать файл или именованный канал,
- используйте SetStdHandle(STD_OUTPUT_HANDLE, handle) и вызовите cudaFree(0) или аналогичную функцию в начале вашей программы для инициализации контекста. Для API драйвера решающее значение имеет положение cuInit(0). После этого вы можете
- сбросьте SetStdHandle к предыдущему значению, если это необходимо вашей оставшейся программе. CUDA продолжает печатать в заданный дескриптор потока.
Просто будьте осторожны, чтобы команда CUDA действительно была первой для процесса.
Я считаю, что это работает аналогично под Linux (вероятно, с использованием dup2 с двумя аргументами для перенаправления stdout).