在我的cuda运行时程序中,cpu和gpu可以异步计算,但不能合作计算,为什么?

时间:2016-12-05 08:28:09

标签: c++ cuda

在我的cuda运行时程序中,cpu和gpu可以异步计算,但不能合作,为什么?

我测量程序的时间,总时间是cpu计算时间和gpu计算时间的总和时间。通过视觉配置文件,我发现gpu不会计算直到cpu完成。我的目的是将cpu计算为gpu计算的同一时间。

平台: 窗口10 cuda 7.5
vs2013

以调试模式编译的代码(无优化)

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include<time.h>
__global__ void addKernel()
{
    int a ;
    for (int i = 0; i < 10000;i++)
    for (int j = 0; j < 10000;j++)
        a = i;
}
void comput()
{
    int a = 1;
    for (int i = 0; i < 10000;i++)
        for (int j = 0; j < 10000; j++)
        {
            for (int k = 0; k < 100;k++)
                a = j;

        }

}

int main()
{
    cudaSetDevice(0);
    cudaEvent_t start, stop1;
    cudaEventCreate(&start);
    cudaEventCreate(&stop1);

    clock_t ss = clock();
    cudaEventRecord(start,0);   
    addKernel<<<1,64>>>();
    cudaEventRecord(stop1,0);   

    clock_t ct = clock();
    comput();
    clock_t ctt = clock();

    cudaEventSynchronize(stop1);
    cudaDeviceSynchronize();
    clock_t sss = clock();

    float t1;
    cudaEventElapsedTime(&t1, start, stop1);
    printf("clock GPU :%.4f s\n", t1/1000);
    printf("clock cpu:%f s\n",(float) (ctt - ct)/CLOCKS_PER_SEC);
    printf("clock total time: %f s\n", (float)(sss - ss) / CLOCKS_PER_SEC);

    cudaEventDestroy(start);
    cudaEventDestroy(stop1);
    cudaDeviceReset();

}

1 个答案:

答案 0 :(得分:1)

来自cuda programming guide

  

程序员可以通过将CUDA_LAUNCH_BLOCKING环境变量设置为1来全局禁用系统上运行的所有CUDA应用程序的内核启动的异步性。此功能仅用于调试目的,不应用作使生产软件可靠运行的方法

     

如果通过分析器(Nsight,Visual Profiler)收集硬件计数器,则内核启动是同步的,除非启用了并发内核分析。如果异步内存副本涉及非页面锁定的主机内存,则它们也将是同步的。

此外,如果没有优化,主机功能将运行很长时间,可能是内核的百万倍。如果进行优化,它将不会实际运行并立即返回。

我建议您分别使用CUDA_LAUNCH_BLOCKING=1CUDA_LAUNCH_BLOCKING=0运行二进制文件来测试运行时间。还要将内核和主机功能修改为有意义的功能。