Everything goes to a raw string

It is possible to use Strf on CUDA devices, but are naturally some limitations: you can’t write to FILE* nor std::string, nor anything that is not usable in device code. Basically, you can only write raw strings.

So, the kernel — the function marked with __global__ qualifier — needs to receive a char* ( or a pointer to another character type ) pointing to where the content is to be written.

#include <strf.hpp>

__global__ void sample(char* dest, std::size_t dest_size)
{
    strf::cstr_destination writer{dest, dest_size};
    auto print = strf::to(writer);

    print("Hello World!\n");
    print("blah blah blah", 1234, '\n');

    writer.finish();
}

There is a more complete example here. You can also take a look at the unit tests that run on CUDA device here.

To build Strf as static library for CUDA, you only need to compile the file strf/strf.cu. And your code shall define the macro STRF_CUDA_SEPARATE_COMPILATION.

Alternatively, you can use Strf CMake project. In this case, you need to turn on the STRF_CUDA_SUPPORT option:

cmake -G <generator-name> -DSTRF_CUDA_SEPARATE_COMPILATION=ON …​ <path-to-source>

As explained in another document, it is possible to integrate Strf using add_subdirectory, or exporting and importing. Both solution gives you the Strf::StrfCuda CMake target, which represents the Srtf static library for CUDA.

Unsupported features on CUDA devices

The folowing features are not supported on device code: