我在完成多核编程课程的项目时遇到了一些奇怪的问题,想和你们讨论一下。
我们被要求创建任何一个程序,以展示在多核平台上进行编程能够显著提高效率。我决定尝试使用OpenCL在GPU上编写一些代码。我选择了矩阵卷积问题,因为我对它非常熟悉(我之前使用open_mpi并行化过它,在处理大图像时速度有很大提升)。
于是这里是我的成果:我选择了一个大的GIF文件(2.5 MB)[2816X2112],然后运行了顺序版本(原始代码),得到了平均15.3秒的时间。
然后我运行了我刚写的新的OpenCL版本,使用我的MBP集成GeForce 9400M,我得到了1.26秒的平均计时。到目前为止都很好,速度提高了12倍!
但现在我去我的节能面板打开“图形性能模式”。该模式会关闭GeForce 9400M,并打开我的系统上拥有的Geforce 9600M GT。苹果表示,这张卡片的速度是集成卡的两倍。
猜猜看,我使用这张强大的显卡所需的时间是平均3.2秒……我的9600M GT似乎比9400M慢两倍以上。
对于那些熟悉OpenCL的人来说,我在开始之前将所有数据复制到远程缓冲区中,因此实际计算不需要往返主内存。另外,我让OpenCL确定最佳的本地工作大小,因为我读到他们在这个参数上有一个相当好的实现。
有人有什么线索吗?
编辑:完整的源代码和makefiles在这里http://www.mathieusavard.info/convolution.zip。
我们被要求创建任何一个程序,以展示在多核平台上进行编程能够显著提高效率。我决定尝试使用OpenCL在GPU上编写一些代码。我选择了矩阵卷积问题,因为我对它非常熟悉(我之前使用open_mpi并行化过它,在处理大图像时速度有很大提升)。
于是这里是我的成果:我选择了一个大的GIF文件(2.5 MB)[2816X2112],然后运行了顺序版本(原始代码),得到了平均15.3秒的时间。
然后我运行了我刚写的新的OpenCL版本,使用我的MBP集成GeForce 9400M,我得到了1.26秒的平均计时。到目前为止都很好,速度提高了12倍!
但现在我去我的节能面板打开“图形性能模式”。该模式会关闭GeForce 9400M,并打开我的系统上拥有的Geforce 9600M GT。苹果表示,这张卡片的速度是集成卡的两倍。
猜猜看,我使用这张强大的显卡所需的时间是平均3.2秒……我的9600M GT似乎比9400M慢两倍以上。
对于那些熟悉OpenCL的人来说,我在开始之前将所有数据复制到远程缓冲区中,因此实际计算不需要往返主内存。另外,我让OpenCL确定最佳的本地工作大小,因为我读到他们在这个参数上有一个相当好的实现。
有人有什么线索吗?
编辑:完整的源代码和makefiles在这里http://www.mathieusavard.info/convolution.zip。
cd gimage
make
cd ../clconvolute
make
put a large input.gif in clconvolute and run it to see results