我试图计算在GPU计算的东西所花的总时间。我使用cudaEventRecord和cudaEventElapsedTime来确定这一点,但我有一个意想不到的行为,或者至少对我来说意外:)我写这个例子来理解发生了什么,我仍然感到困惑。cudaEventElapsedTime不是预期的行为
在下面的例子中我期待汇报三个迭代同一时间,但结果是:
2.80342
2005.6
这意味着总时间在考虑CPU睡眠时间。
我做错了什么?如果没有,是否有可能做我想要的?
#include <iostream>
#include <thread>
#include <chrono>
#include <cuda.h>
#include <cuda_runtime.h>
#include "device_launch_parameters.h"
__global__ void kernel_test(int *a, int N) {
for(int i=threadIdx.x;i<N;i+=N) {
if(i<N)
a[i] = 1;
}
}
int main(int argc, char ** argv) {
cudaEvent_t start[3], stop[3];
for(int i=0;i<3;i++) {
cudaEventCreate(&start[i]);
cudaEventCreate(&stop[i]);
}
cudaStream_t stream;
cudaStreamCreate(&stream);
const int N = 1024 * 1024;
int *h_a = (int*)malloc(N * sizeof(int));
int *a = 0;
cudaMalloc((void**)&a, N * sizeof(int));
for(int i=0;i<3;i++) {
cudaEventRecord(start[i], stream);
cudaMemcpyAsync(a, h_a, N * sizeof(int), cudaMemcpyHostToDevice, stream);
kernel_test<<<1, 1024, 0, stream>>>(a, N);
cudaMemcpyAsync(h_a, a, N*sizeof(int), cudaMemcpyDeviceToHost, stream);
cudaEventRecord(stop[i], stream);
std::this_thread::sleep_for (std::chrono::seconds(i));
cudaEventSynchronize(stop[i]);
float milliseconds = 0;
cudaEventElapsedTime(&milliseconds, start[i], stop[i]);
std::cout<<milliseconds<<std::endl;
}
return 0;
}
我附加了nsight结果来验证我的示例的行为。
的Windows 8.1
GeForce GTX的780钛
的Nvidia驱动程序:358.50
编辑:
添加的代码是完整的
附NS飞行result
新增SO和驱动程序信息
这不是一个[MCVE]请编辑你的问题! –
我同意你需要提供一个完整的测试用例。这包括一个MCVE加上你的测试设置(OS,编译命令,GPU)。当我尝试根据你所显示的内容在linux上创建一个测试时,它似乎对我来说是正确的。例子是[here](http://pastebin.com/3Baj6dtE)。 –
你说得对,我错过了一些代码。对不起。我编辑了这个问题。 – nachovall