【问题标题】:Calculate run time of kernel code in OpenCL C在 OpenCL C 中计算内核代码的运行时间
【发布时间】:2015-07-04 09:13:36
【问题描述】:

我想测量我的内核代码在各种设备(即 CPU 和 GPU)上的性能(读取运行时)。我写的内核代码是:

__kernel void dataParallel(__global int* A)
{  
    sleep(10);
    A[0]=2;
    A[1]=3;
    A[2]=5;
    int pnp;//pnp=probable next prime
    int pprime;//previous prime
    int i,j;
    for(i=3;i<500;i++)
    {
        j=0;
        pprime=A[i-1];
        pnp=pprime+2;
        while((j<i) && A[j]<=sqrt((float)pnp))
        {
            if(pnp%A[j]==0)
                {
                    pnp+=2;
                    j=0;
                }
            j++;

        }
        A[i]=pnp;

    }
}

但是有人告诉我,不能在内核代码中使用 sleep()。如果这是真的,那么有人可以给出原因,如果不是,请告诉实现相同的方法。

另外,正如我所说,我希望比较我的 CPU 和 GPU 的性能,实现这一目标的方法之一是计算各种设备上内核代码的运行时间,而如果有另一种方法我可以让代码同时开始在所有设备上执行,然后我只需要列出相应的执行结束时间,这也可以达到目的!是否可以?

硬件细节:

GPU:AMD FirePro W7000、NVIDIA TESLA C2075 CPU: Intel(R) XEON(R) CPU X5660 @ 2.80GHZn

【问题讨论】:

  • sleep()与衡量性能有什么关系?
  • 我可以让线程休眠 30 秒,然后开始在所有三个设备上执行内核代码。如果运行时间 > 90 秒(对于 3 个设备),则意味着代码是按预期顺序执行而不是并行执行,而如果运行时间略高于 30 秒,则我的代码将在所有三个设备上并行执行.
  • @talonmies 您能否提出一个更好的方法来实现这一目标。谢谢
  • 做什么?要计算运行时间,您需要使用某种计时器。 Internet 上充斥着基本主机计时器或基于 OpenCL 事件的计时器的示例,例如 here。 Google 是您的朋友

标签: c linux parallel-processing opencl gpgpu


【解决方案1】:

但是我被告知不能在内核代码中使用sleep()

并不是说不可能;有可能。我不知道。这在 C 中并没有真正指定。话虽如此,在一段时间过去之前阻止内核执行只是不是一个好主意。即使在通用编程中,这似乎也不是一个好主意。您的函数应该尽快完成处理,或者将控制权交还给内核,以便它可以在等待空闲任务时找到其他事情要做。

另外,正如我所说,我希望比较我的 CPU 和 GPU 的性能,实现这一目标的方法之一是计算各种设备上内核代码的运行时间,而如果有另一种方法我可以让代码同时开始在所有设备上执行,然后我只需要列出相应的执行结束时间,这也可以达到目的!有可能吗?

当然,类似的事情...但是...我什至不确定您为什么认为将sleep(10) 注入每个任务会对您有所帮助;你没有在这里解释。这似乎不是分析代码的必要条件(例如检查其速度)。你听说过the XY problem吗?在这种情况下,我认为 sleep 是您的 Y 变量。

我刚才提到了剖析。你了解过剖析器吗?他们完全按照您的目标去做,只是他们做到了您无需编写任何代码Here's a tutorial on using perf to profile the Linux kernel...

【讨论】:

  • 我可以让线程休眠 30 秒,然后开始在所有三个设备上执行内核代码。如果运行时间 > 90 秒(对于 3 个设备),则意味着代码是按预期顺序执行而不是并行执行,而如果运行时间略高于 30 秒,则我的代码将在所有三个设备上并行执行.
  • 在内核中休眠任意秒数是一个可怕的想法,因为 1. Sleep 通常调用一个系统调用,告诉内核继续执行其他任务(可能是你的?然后你不这样做)没有得到你想要的睡眠......呵呵)或 2. 如果没有,它会阻塞线程(这是 内核线程,而不是 你的线程 ) 直到该时间段过去。无论哪种方式都很可怕。做你想做的事,但我已经告诉过你如何不编写代码来解决你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2013-01-30
  • 1970-01-01
相关资源
最近更新 更多