在 CUDA 中使用 clock() 函数

Posted

技术标签:

【中文标题】在 CUDA 中使用 clock() 函数【英文标题】:Using clock() function in CUDA 【发布时间】:2013-02-13 03:06:05 【问题描述】:

我有一个简单的内核,我正在使用clock() 计时。 我在How to measure the inner kernel time in NVIDIA CUDA?了解了这个功能

所以我用过 clock_t start = clock();(同样停止)计时。在编译时,我收到以下错误:

tex1.cu(14): 错误:明显调用的括号前的表达式必须具有(指向-)函数类型`

我是否缺少头文件或编译器选项?

另外,我尝试使用 CUDA 计时器 (cudaEvent_t start, stop;),但我得到的经过时间是 0 毫秒。我创建开始和停止,记录开始,做一些 CUDA 的东西,同步,记录停止,事件同步和测量经过的时间。这部分编译得很好,但让我经过的时间为零。

这是一个简单的内核,我用来测试我对纹理内存的理解。 内核:

__global__ void magic(float *mean, int *clock)
    int i, tid = threadIdx.x + blockIdx.x * blockDim.x;
    float t, sum=0.0;
    clock_t start = clock();
    if ( tid < dimy )
    
        for(i=0;i<dimx; i++)
            t = tex2D( input, i, tid );
            sum = sum + t*t;
        
        clock_t stop = clock();
        clock[tid] = (int)(stop-start);
    

【问题讨论】:

您是否包含&lt;time.h&gt;&lt;ctime&gt; + using...?您还有其他名为clockstart 的变量/函数吗? 我没有任何名为clock 或start 的变量。我只包含了&lt;time.h&gt; 你能发布一个简短的内核代码版本吗? 当然。请参阅编辑 你确实有一个名为clock的变量——第二个内核参数! 【参考方案1】:

在您的内核中,不要将您的内核参数命名为clock,因为这会使编译器感到困惑,因为您有一个名为clock 的变量和一个名为clock 的函数。而是这样做:

__global__ void magic(float *mean, int *myclock)

...
myclock[tid] = (int)(stop-start);

如果您进行更改,括号前表达式的错误将消失。 奇怪的是,您回答了关于您是否有任何其他变量称为时钟或以 no 开头的问题,因为您有 both

如果您在使用 cuda 事件方面需要帮助,请发布您用于计时的实际代码。您是否对所有 cuda 调用和内核调用进行错误检查?

【讨论】:

如何以毫秒为单位? 仔细阅读previous linked question and answers。 GPU 时钟频率可以使用NVML 或直接使用 CUDA 运行时或驱动程序 API 检索。看看deviceQuery sample。

以上是关于在 CUDA 中使用 clock() 函数的主要内容,如果未能解决你的问题,请参考以下文章

0_Simple__clock

cuda里面的核函数怎么调用第三方库的函数

CUDA 中clock() 和clock64() 的时钟测量值是多少?

CUDA clock() 导致零时钟周期

定时 CUDA 操作

CUDA测量2个_syncthread()点之间的时间[重复]