Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cpu代码导致cuda内核执行延迟_C++_Cuda - Fatal编程技术网

C++ cpu代码导致cuda内核执行延迟

C++ 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

我无法理解以下公认的非常简单的代码,这是一个更复杂项目的简化版本,我现在花了很多时间在这个项目上。 这段代码将在大约2000毫秒后在我的系统上运行。但是,当我启用该行使cpu进入睡眠状态500毫秒时,整个程序将运行更长的时间,大约2500毫秒

我无法理解cuda内核是如何相对于主机异步执行的

2019年在Vistual Studio上运行cuda 11.1

#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);
    直接在内核启动后就可以完成这个任务。我必须看看在我的实际项目中是如何实现的。非常感谢你的提示。伙计,这太傻了。。。