如果我通过注册一个回调cudaStreamAddCallback(),哪个线程将运行它?
CUDA文档说 cudaStreamAddCallback
在流中所有当前排队的项目完成后,添加要在主机上调用的回调。对于每个
cudaStreamAddCallback调用,回调将仅执行一次。回调将阻止流中的后续工作,直到完成为止。
但是没有提到回调本身的调用方式。
一些项目使用
#pragma nv_exec_check_disable
Run Code Online (Sandbox Code Playgroud)
和/或
#pragma hd_warning_disable
Run Code Online (Sandbox Code Playgroud)
使 NVCC 的警告静音
Run Code Online (Sandbox Code Playgroud)warning: calling a __host__ function from a __host__ __device__ function is not allowed`
然而,它们似乎完全没有记录,例如在 CUDA 9.1 参考中。
是否有任何相关文件?
我一直在 Linux 和 OSX 上尝试各种计时器,并想尝试使用 std::chrono 使用的相同接口来包装其中一些计时器。
对于在编译时具有明确定义的“周期”的定时器来说,这很容易做到,例如POSIX Clock_gettime() 系列、OSX 上的clock_get_time() 系列或gettimeofday()。
然而,有一些有用的计时器,其“周期”(虽然是常数)仅在运行时才知道。例如: - POSIX 规定时钟周期(CLOCKS_PER_SEC)在非 XSI 系统上可能是一个变量 - 在 Linux 上,times() 周期由 sysconf(_SC_CLK_TCK) 在运行时给出 - 在 OSX 上,周期mach_absolute_time() 在运行时由 mach_timebase_info() 给出 - 在最新的 Intel 处理器上,DST 寄存器以恒定速率滴答,但当然这只能在运行时确定
要将这些计时器包装在 std::chrono 接口中,一种可能是使用 std::chrono::nanosecond 周期,并将每个计时器的值转换为纳秒。另一种方法可能是使用浮点表示。然而,这两种方法都会给 now() 函数带来(非常小的)开销,以及(可能很小)的精度损失。
我试图追求的解决方案是定义一组类来表示此类“运行时常数”周期,其构建方式与 std::ratio 类相同。但是我预计这将需要重写所有相关的模板类和函数(因为它们假设 constexpr 值)。
如何将这些类型的计时器包装为 std:chrono ?
或者对时钟的时间周期使用非 constexpr 值?