Наименее обременительный способ реализовать общий форматированный поток вывода в CUDA? - PullRequest
0 голосов
/ 16 октября 2019

Я хочу иметь возможность написать что-то похожее на:

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.

1 Ответ

0 голосов
/ 16 октября 2019

В настоящее время я думаю о том, как реализовать это:

  • Реализовать std::ostringstream -подобный класс, который может получить свое первоначальное хранилище из другого места (в разработке).
  • С таким объектом вы можете printf("%s\n", my_gpu_sstream.str()).
  • Разрешить построение потока GPU-ostring с буфером фиксированного размера.
  • Разрешить выделению потока GPU-ostringstream-размер буфера с использованием стороны устройства CUDA malloc().

и Боба, вашего дяди.

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

...