赤峰专业网站建设,新闻发布会直播在哪里看,三亚旅游网站策划书,给网站网站做设计默认流
对于需要指定 cudaStream_t参数的 cuda API#xff0c;如果将 0作为实参传入#xff0c;则视为使用默认流#xff1b;对于不需要指定 cudaStream_t参数的 cuda API#xff0c;则也视为使用默认流。
在 cuda中#xff0c;默认流有两种类型#xff0c;一种是 legacy…默认流
对于需要指定 cudaStream_t参数的 cuda API如果将 0作为实参传入则视为使用默认流对于不需要指定 cudaStream_t参数的 cuda API则也视为使用默认流。
在 cuda中默认流有两种类型一种是 legacy默认流一种是 per-thread默认流这两种默认流的同步行为不一样在使用的时候需要注意一下。具体使用哪种默认流有以下三种方式进行指定
不指定默认使用 legacy默认流在编译 cuda程序时通过 nvcc的 --default-stream进行指定可选的取值是{legacy|per-thread}在需要传入 cudaStream_t/ CUstream参数的时候指定cudaStreamLegacy/ CU_STREAM_LEGACYlegacy默认流或 cudaStreamPerThread/ CU_STREAM_PER_THREADper-thread默认流。
下面重点介绍一下 legacy默认流和 per-thread默认流在同步行为上的差异。
legacy 默认流
legacy默认流会与同一个 CUcontext如果是使用 runtime的 API则每个设备对应一个 CUcontext中的其他流都进行同步但 non-blocking的流除外。也即是在执行 legacy默认流中的任务之前会先等待其他所有 blocking的流执行完成然后开始执行 legacy默认流中的任务并且在 legacy默认流后面出现的其他 blocking流中的任务会先等待 legacy默认流中的任务执行完成再开始执行。
假设下面的代码在流 s中 launch了核函数 k_1在 legacy默认流中 launch了核函数 k_2在流 s中 launch了核函数 k_3
cudaStream_t s;
cudaStreamCreate(s);
k_11, 1, 0, s();
k_21, 1();
k_31, 1, 0, s();则上述代码的同步行为是 k_2会被 k_1阻塞k_3会被 k_2阻塞。
但如果是 non-blocking流则不会出现上述同步行为也即是下面三个核函数会存在并行执行的情况例如
cudaStream_t s;
cudaStreamCreateWithFlags(s, cudaStreamNonBlocking);
k_11, 1, 0, s();
k_21, 1();
k_31, 1, 0, s();per-thread 默认流
在一个 CUcontext内每个线程都有一个 per-thread默认流这个流不与其他流进行同步就像是一个显式创建的流那样但如果在一个程序中同时使用了 legacy默认流和 per-thread默认流则 per-thread默认流会与 legacy默认流保持同步。