C++ cpu代码导致cuda内核执行延迟
我无法理解以下公认的非常简单的代码,这是一个更复杂项目的简化版本,我现在花了很多时间在这个项目上。 这段代码将在大约2000毫秒后在我的系统上运行。但是,当我启用该行使cpu进入睡眠状态500毫秒时,整个程序将运行更长的时间,大约2500毫秒 我无法理解cuda内核是如何相对于主机异步执行的 2019年在Vistual Studio上运行cuda 11.1C++ cpu代码导致cuda内核执行延迟,c++,cuda,C++,Cuda,我无法理解以下公认的非常简单的代码,这是一个更复杂项目的简化版本,我现在花了很多时间在这个项目上。 这段代码将在大约2000毫秒后在我的系统上运行。但是,当我启用该行使cpu进入睡眠状态500毫秒时,整个程序将运行更长的时间,大约2500毫秒 我无法理解cuda内核是如何相对于主机异步执行的 2019年在Vistual Studio上运行cuda 11.1 #include "cuda_runtime.h" #include "device_launch_param
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <chrono>
#include <iostream>
#include <numeric>
#include <thread>
__global__ void kernel(double* val, int siz) {
for (int i = 0; i < siz; i++) val[i] = sqrt(val[i]); //calculate square root for every value in array
}
int main() {
auto t1 = std::chrono::high_resolution_clock::now();
const int siz = 1'000'000; //array length
double* val = new double[siz];
std::iota(val, val + siz, 0.0); //fill array with 0, 1, 2,...
double* d_val;
cudaMalloc(&d_val, sizeof(double) * siz);
cudaMemcpy(d_val, val, sizeof(double) * siz, cudaMemcpyDefault);
kernel <<<1, 1 >>> (d_val, siz); //start kernel
//std::this_thread::sleep_for(std::chrono::milliseconds(500)); //---- putting cpu to sleep also delays kernel execution?
cudaError_t err = cudaDeviceSynchronize();
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << "status: " << cudaGetErrorString(err) << std::endl;
std::chrono::duration<double, std::milli> ms = t2 - t1;
std::cout << "duration: " << ms.count() << std::endl;
delete[] val;
}
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
#包括
#包括
#包括
__全局无效内核(双*val,整数大小){
对于(int i=0;i
您正在经历如上所述的WDDM命令批处理
简而言之,在windows上,当采用WDDM驱动程序模型时,GPU命令(例如cuda运行时API中的任何命令,加上内核启动)将被发送到命令队列。根据未发布的启发式方法,在没有提供显式用户控件的情况下,每隔一段时间,命令队列将被“刷新”,即发送到GPU,此时(如果当前不忙),GPU将开始处理这些命令
因此,在WDDM设置中,将内核分派到命令队列是非阻塞的(控制立即返回到CPU线程)。将工作从命令队列分派到GPU遵循其他一些启发式方法。(内核执行与主机线程异步,在任何情况下)
如果这是一个问题,您至少有几个选项:
在windows上,切换到TCC驱动程序型号中的GPU
在windows上,尝试使用链接答案中描述的“黑客”之一
切换到linux
好的,根据链接的文章,我看到一个cudaStreamQuery(0);
直接在内核启动后就可以完成这个任务。我必须看看在我的实际项目中是如何实现的。非常感谢你的提示。伙计,这太傻了。。。