2012-09-04 130 views
0

我即將使用CUDA技術創建支持GPU的程序。它應該是C#Emgu或C++ Cuda工具包(尚未確定)。運行並行CUDA任務

我需要使用所有的GPU功能(我擁有16個GPU內核的顯卡)。我如何並行運行16個任務?

回答

2

首先。在6xx系列之前,16個GPU核心等於16 * 8 = 128個核心。在6xx系列上,它是16 * 32 = 512個內核。這並不意味着你應該限制自己的128/512任務。

其次:emgu似乎是一個.NET的OpenCV包裝,並與圖像處理有關。它通常與GPU編程無關。可能有些算法已經加速了GPU,但我對此一無所知。 CUDA的替代品是OpenCL,而不是OpenCV。如果你會像你說的那樣使用CUDA技術,那麼CUDA就沒有其他選擇了,因爲只有CUDA纔是CUDA。

當談到啓動任務時,您只會告訴GPU有多少線程需要運行。實際上,你告訴GPU有多少個塊,以及多少個線程。你希望跑步的方塊。這是在您調用cuda函數時完成的。你不想限制自己128/512線程,但實驗。

不知道您在GPGPU編程方面的知識,但請記住,您不能像在CPU上那樣運行任務。你不能運行128個不同的任務,所有的線程都必須運行完全相同的指令(除了分支時,通常應該避免)。

+0

稍作澄清:我的意思是OpenCV,而不是OpenCL,因爲我的主要區域是確實是圖像處理(與考慮Emgu相同的原因)。對於您的其他答覆 - 非常感謝! – Alex

+0

好的。然後說你想要CUDA加速是有點混亂。 CUDA非常適合這種處理,但我的猜測是,如果OpenCV的GPU加速,那麼使用OpenCL,因爲這是跨平臺供應商。 – martiert

1

一般而言,您需要足夠的線程來填充所有流式多處理器。至少是.25 * MULTIPROCESSORS * MAX_THREADS_PER_MULTIPROCESSOR

特別是在CUDA現在,假設你有一些CUDA內核__global__ void square_array(float *a, int N) ...

現在,當您啓動內核您指定的塊數和每塊

square_array <<< n_blocks, n_threads_per_block >>> (a, N); 

注意的線程數:您需要更熟悉CUDA並行編程模型,因爲您沒有接近使用所有GPU功能的莊園。考慮閱讀Programming Massively Parallel Processors, A Hands-on Approach

+0

請將第一段改爲足夠的線程以填充所有流式多處理器。至少25%x MULTIPROCESSORS x MAX_THREADS_PER_MULTIPROCESSOR。 CUDA核心不應該在答案中。 –

+0

@GregSmith你有我可以參考的來源嗎? – rudolph9

+1

「CUDA C編程指南」第5.2節討論了應用程序,設備和多處理器級並行。三個非常有用的網絡研討會是(1)「CUDA Warps and Occupancy」,位於http://developer.download.nvidia.com/CUDA/training/cuda_webinars_WarpsAndOccupancy.pdf(2)「GPU性能分析和優化」,http:///developer.download.nvidia.com/GTC/PDF/GTC2012/PresentationPDF/S0514-GTC2012-GPU-Performance-Analysis.pdf。 (3)「CUDA C/C++ Streams and Concurrency」位於http://developer.download.nvidia.com/CUDA/training/StreamsAndConcurrencyWebinar.pdf –