2013-10-09 35 views
0

爲了大致瞭解openCl對我有多大的幫助,我進行了矩陣乘法測試,因爲這種基本的線性代數是我的主要用途。我使用的代碼可以在這裏找到:http://vasanthexperiments.wordpress.com/2011/11/20/aparapi-java-matrix-multiplication-example/。 (1024×1024×1024×1024矩陣矩陣產品)Java/Open CL/Aparapi:從哪種設備上可以期待什麼樣的性能?

基本上,我對結果非常失望,因爲與CPU上的串行計算(小於x2)相比,加速比只有邊際,並且如果我使用Aparapi CPU(它並行化)CPU速度更快。
在執行過程中,圖形卡處於滿載狀態,所以我認爲應該沒有通信問題。

我的硬件配置:
酷睿i7 2670QM
AMD 7610M
16GB RAM

由於我完全新的GPGPUs我不知道會發生什麼。
1.我的設置有可能被搞亂了嗎?如果是這樣,我應該在哪裏看?
2.還是我只是期望從入門級圖形卡太多?如果是這樣,不同型號的顯卡如何擴展這種問題呢?如果我想讓硬件更快,我必須尋找什麼樣的規格?

編輯:

好了,我只是重新運行一個10×10矩陣程序。
不出所料,CPU需要不到1ms。
但是,GPU需要超過1600個,所以Aparapi或openCL或我的硬件肯定有問題(驅動程序應該是最新的)。任何人都有一個想法,我應該看看?

回答

0

您的比較問題的一部分是您將低端移動GPU與良好的移動CPU進行比較。 GPU的單精度速度大約是CPU的2倍,並且它們的內存帶寬相似。這些是你想要密切關注的兩個規範。

上次我檢查了線性代數例程,他們能夠獲得大約60%的GPU峯值浮點速度。所有當前的AMD和Nvidia GPU的速度在維基百科herehere上列出。你也會想要更新的GPU而不是更老的GPU。

+0

謝謝。我想很少有人嘗試使用這種低端的GPGPU卡。我認爲擁有400個處理器的GPU仍然會比8線程CPU快得多。我想我將不得不尋找一些方法來訪問一些嚴重的硬件。 –

+0

我剛剛注意到,即使是10x10,GPU也需要1,6secs而不是0msecs。似乎這個問題在很大程度上與GPU的實際性能無關。 –

+0

與CPU進行比較時,請記住新的Intel CPU支持在一個步驟中操作8個32位浮點數的向量操作。所以4個內核* 8個浮點數= 32個浮點操作。您使用的400個內核中的每一個都只執行一次浮點運算(如果使用融合乘法運算,則爲2)。 1.6秒聽起來像是生成OpenCL代碼所需的時間,構建它的時間和GPU的啓動時間的組合 - 首先OpenCL內核調用總是比較慢,因爲GPU需要增加其時鐘速度 - GPU運行在較低OpenCL和3D應用程序未運行時的速度。 – chippies

0

我測試了使用AMD HD 7850和Intel Core i7-2600K的example code的C語言版本。對於1024X1024的情況,HD 7850 GPU需要42毫秒,而單線程CPU功能則需要將近7秒。

對於128X128,HD 7850 gpu需要4.9 ms,而單線程cpu功能只需要2.0 ms。

因此,對於openCL算法能夠產生足夠的並行性以完全加載GPU的情況,HD 7950 GPU比單個CPU線程快得多。即使所有CPU線程都使用了id,對於大型矩陣,GPU仍然會更快。

+0

這真的令人印象深刻。我用移動i7處理器獲得了9secs。我猜這是因爲我的卡是低端的。感謝您的反饋。 –

+0

我剛剛發現這個基準:http://gpuboss.com/gpus/Radeon-HD-7850-vs-Radeon-HD-7610M。 AFAIK使用的基準測試程序應該返回一個線性分數,因此7610M應該更接近7850.看起來我的設置有一些主要問題,因爲它需要1,6secs來計算GPU上的10x10(CPU上0msecs)。 –

+0

我對gpu矩陣乘法時間的結果只包括'clEnqueueNDRangeKernel'和'clEnqueueReadBuffer'語句。 'clBuildProgram'步驟需要相當長的時間,但我將其放棄了,因爲它不是計算的一部分。這可能是一個因素嗎? – ScottD

相關問題