Cuda 为什么对推力::inclusive_扫描的调用比后续调用慢得多?
当我多次调用Cuda 为什么对推力::inclusive_扫描的调用比后续调用慢得多?,cuda,thrust,Cuda,Thrust,当我多次调用asch::inclusive\u scan时,为什么第一次调用要比后续调用慢得多 这是密码 float ttime; for(int i=0;i<5;i++){ cudaEvent_t start,stop; cudaEventCreate(&start); cudaEventCreate(&stop); cudaEventRecord(start,0); thrust::device_ptr<in
asch::inclusive\u scan
时,为什么第一次调用要比后续调用慢得多
这是密码
float ttime;
for(int i=0;i<5;i++){
cudaEvent_t start,stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start,0);
thrust::device_ptr<int > din(device_input);
thrust::device_ptr<int > dout(device_output);
thrust::inclusive_scan(din,din+N,dout);
cudaEventRecord(stop,0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&ttime,start,stop);
printf("cost %fms\n",ttime);
}
有人能解释一下吗?推力是使用CUDA运行时API构建的,而该API使用lazy 具体的初始化顺序没有记录在案,有经验证据表明,随着时间的推移,它发生了变化。但是,上下文设置似乎是在一个服务器上完成的
缓慢的第一次调用可能与加载和初始化程序中包含推力代码的模块有关。您可以通过分析代码并查看第一次调用的配置文件执行时间与挂钟时间来验证这一点。推力是使用CUDA运行时API构建的,该API使用惰性 具体的初始化顺序没有记录在案,有经验证据表明,随着时间的推移,它发生了变化。但是,上下文设置似乎是在一个服务器上完成的
缓慢的第一次调用可能与加载和初始化程序中包含推力代码的模块有关。您可以通过分析代码并查看第一次调用的配置文件执行时间与挂钟时间来验证这一点。在Talonmes的有效答案中添加几句话:
- 在我的例子中,有一些鸡尾酒餐巾计算CUDA初始化需要多少时间
- 我还建议,要将lib推力的加载+初始化时间与运行时API初始化开销分开,请执行以下三个阶段:
- 执行一些不写任何输出的伪内核-两次(t_1,T2_)
- 使用(几乎)没有数据(但确实启动了内核)的lib推力调用两次(T_3,T_4)
- 现在是你真正的电话时间
- 查看分析时间线很有帮助;CUDA将把它的大部分初始化“推”到一个API调用中,但不一定是第一个
- 在我的例子中,有一些鸡尾酒餐巾计算CUDA初始化需要多少时间
- 我还建议,要将lib推力的加载+初始化时间与运行时API初始化开销分开,请执行以下三个阶段:
- 执行一些不写任何输出的伪内核-两次(t_1,T2_)
- 使用(几乎)没有数据(但确实启动了内核)的lib推力调用两次(T_3,T_4)
- 现在是你真正的电话时间
- 查看分析时间线很有帮助;CUDA将把它的大部分初始化“推”到一个API调用中,但不一定是第一个
cost 39.180702ms
cost 0.200704ms
cost 0.201728ms
cost 0.202752ms
cost 0.197632ms