计算OpenCL C

时间:2015-07-04 09:13:36

标签: c linux parallel-processing opencl gpgpu

我想测量我的内核代码在各种设备上的性能(读取运行时),即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

1 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

我刚才提到了剖析。你有没有了解过profilers?他们完全按照您的目标去做,除非他们这样做而不必编写任何代码Here's a tutorial on using perf to profile the Linux kernel ...