Я хочу иметь возможность написать что-то похожее на:
std::cout << "Hello" << my_world_string << ", " << std::setprecision(5) << my_double << '\n';
в коде на стороне устройства CUDA, для отладки шаблонных функций - и для того, чтобы строка такого типа кода приводила к единой, непрерывной, строка вывода (то есть эквивалент одного вызова CUDA printf()
- который обычно не искажается при выводе из других потоков).
Конечно, это невозможно, так как нет файлов или файловых дескрипторовв коде на стороне устройства, а также код std::ostream
, используемый в коде на стороне устройства. По сути, мы должны работать с аппаратным и программным взломом CUDA, который позволяет printf()
s. Но очевидно, что можно получить что-то вроде:
stream << "Hello" << my_world_string << ", " << foo::setprecision(5) << my_double << '\n';
stream.flush();
или:
stream << "Hello" << my_world_string << ", " << foo::setprecision(5) << my_double << '\n';
printf("%s", stream.str());
Мой вопрос: что я должен реализовать, что позволило бы мне писать код, максимально приближенный к приведенному выше? насколько возможно, минимизируя усилия / количество кода для записи?
Примечания:
- Я использовал идентификатор
stream
, но он не должен быть потоком. Код также не должен выглядеть так, как я его изложил. Дело в том, что я могу печатать код в шаблонной функции устройства. - Весь код будет написан на C ++ 11.
- Код может предполагать, что компиляция выполняется либо с C++ 11 или более поздняя версия стандарта.
- Я могу использовать существующий код FOSS, но только если его лицензия является разрешающей, например, 3-BSD, CC-BY-SA, MIT - но не GPL.