在我的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();
}
答案 0 :(得分:1)
程序员可以通过将CUDA_LAUNCH_BLOCKING环境变量设置为1来全局禁用系统上运行的所有CUDA应用程序的内核启动的异步性。此功能仅用于调试目的,不应用作使生产软件可靠运行的方法
如果通过分析器(Nsight,Visual Profiler)收集硬件计数器,则内核启动是同步的,除非启用了并发内核分析。如果异步内存副本涉及非页面锁定的主机内存,则它们也将是同步的。
此外,如果没有优化,主机功能将运行很长时间,可能是内核的百万倍。如果进行优化,它将不会实际运行并立即返回。
我建议您分别使用CUDA_LAUNCH_BLOCKING=1
和CUDA_LAUNCH_BLOCKING=0
运行二进制文件来测试运行时间。还要将内核和主机功能修改为有意义的功能。