c++ - CUDA 时间事件

标签 c++ c cuda gpu

我正在计算我的 CUDA 程序计算特定大小的矩阵需要多长时间。例如,10x10、100x100、500x500、100x1000。

然而,结果完全不是我所期望的。图中的数字不符合预期。随着矩阵大小的增加,计算时间减少。

例如,这是平均时间(从 1000 次运行开始): 10x10:0.032768 秒 100x100:0.068960 秒 500x500:0.006336 秒 1000x1000:0.018400 秒

时间下降,然后在 1000 时再次上升。这是怎么回事?数字不应该在某个时候达到峰值吗?为什么会像这样坐过山车?

下面是实际计时代码的运行方式:

int blocksNeeded=0;
cudaError_t cudaStatus;
blocksNeeded=(size/MAXTHREADS)+1;
int threadsPerBlock = MAXTHREADS/blocksNeeded+1;
cudaEvent_t start, stop;
float elapsedtime;
.
.
.
.
.
cudaEventCreate(&start);
cudaEventCreate(&stop); 
cudaEventRecord(start, 0);
addKernel<<<blocksNeeded, size>>>(dev_c, dev_a, dev_b,size);
cudaStatus = cudaDeviceSynchronize();
cudaEventRecord(stop, 0); 
cudaEventSynchronize(stop); 
cudaEventElapsedTime(&elapsedtime, start, stop);
cudaEventDestroy(start);
cudaEventDestroy(stop);

其中 MAXTHREADS 是 1024,大小是矩阵中元素的数量。 IE。 10x10 矩阵将有 100 个元素,这是大小。

内核更新:

__global__ void addKernel(float *c, float *a, float *b,int size)
{
    int idx = blockDim.x * blockIdx.x + threadIdx.x;
    if(idx < size) 
        c[idx] = a[idx] + b[idx];

}

最佳答案

我在最近配备 NVIDIA Tesla M2090 的 GPU 集群上进行了测试。基本上我正在执行不同大小的 vector 加法。结果是:

Size     Kernel time (msec)
===========================
2        0.04
4        0.010912
8        0.012128
16       0.012256
32       0.011296
64       0.01248
128      0.012192
256      0.012576
512      0.012416
1024     0.012736
2048     0.01232
4096     0.011968
8192     0.011264
16384    0.007296
32768    0.007776
65536    0.009728
131072   0.018304
262144   0.031392
524288   0.055168
1048576  0.10352

您可以看到, vector 大小为 16384 处有一个拐点,这基本上与您的观察结果相似。这不是错误,而是正常行为,因为必须使用 GPU 来显示性能。使用点以Tesla M2090为例,达到了16384左右的并行加法。

您测量内核性能的方式完全没问题。我假设您已经从 CUDA 的“最佳实践指南”中获取了这一点。

注意:请考虑显示的数据是使用内核运行生成的,即。 e.它不具有代表性。通常,对于精确时间测量,内核应该针对同一问题运行多次,内核时间是运行的平均值。

关于c++ - CUDA 时间事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8498485/

相关文章:

CUDA 记录并等待事件不起作用?

c++ - 为什么这段模板代码在VS2010中有效,在VS2012中却无效?

在 C 中使用指针创建/打印数组

c - C中的分词器程序

c - CUDA 中的矩阵运算

c++ - cudaMemcpy 不起作用

c++ - 以char 'e'为输入进行比较

c++ - Cmake 在使用目标 target_include_directories 时无法指定包含目录

c++ - FastCGI与C++除了spawn-fcgi之外的其他启动方式

c - 如何解释 *d++=*s++ 中运算符的优先级