2012-10-21 62 views
1

我異型我的MATLAB代碼,以確定最耗時的功能,他們大多是gradientKron MATLAB功能in this file,以便將它們寫入CUDA內核然後PTX他們從MATLAB叫他們FN鍵CUDA。任何想法或文章將good.also的b的calcution似乎是可分離讓他們很好的候選人被分配到不同的塊,這裏是代碼from the fileMATLAB使用PTX或nvmex

i2w=g0*aff(i2,a0); 
[ix,iy]=grad(i2w); 

ix=ix.*region;iy=iy.*region; 
ix2=ix.^2;iy2=iy.^2;ixiy=ix.*iy; 
it=i1-i2w; 

m1=sum(sum(kron(ones(1,limy)',(1-centx:limx-centx).^2).*ix2)); 
m2=sum(sum(kron((1-centy:limy-centy)',(1-centx:limx-centx)).*ix2)); 

PS的扣:我最近讀了約NVMEX左右我們將不勝感激這種代碼的一些幫助 - 先前提到過 - 。

+1

我想你可能已經知道這一點,但如果你想在MATLAB中調用cuda函數,[你不必再使用mex接口](http://www.mathworks.com/幫助/ distcomp /執行-CUDA的或-PTX-代碼 - 上的-gpu.html)。 cuda C/C +(或PTX)函數可直接從matlab函數調用。 –

+0

tnx的評論,但我說問題可能是執行kron,cuda內核中的漸變......我認爲整個函數可以在cuda中重寫,因爲m和b的計算是可分的 – pyCuda

回答

1

這是一個在一篇文章中回答太長的問題,但我會給你兩個提示。

如果你依賴於該代碼的性能不夠花約2星期,以書面和測試CUDA代碼,讓我告訴你關於我的方法來加速Matlab代碼:

提示1:

首先以這種方式重新編寫函數(在matlab中),它只使用循環,存儲器訪問以及可以在CUDA手冊中找到的基本函數,如添加,乘法等。 -matlab-code

function result_array = MyFunctionToParallelise(constants,source_arrays) 
    for x_idx=xcoords 
    for y_idx=ycoords 
     local_result=inner_function(x_idx,y_idx,constants,source_arrays(x_idx,y_idx)); 
     store(local_result to result_array(x_idx,y_idx)); 
    end 
    end 

如果你這樣做,你的「inner_function」是可並行化的(獨立於其他local_results,並且可以按照x_idx,y_idx等的順序獲得),你就在家!

  1. C寫你的「inner_function」(你知道C和墨西哥,對吧?),並確保它是編譯,返回正確的結果,並使用常規環路內y_idx和OpenMP在MEX文件工作外部x_idx循環的循環。如果你這樣做,你通常會得到4倍的加速度! (由於4核CPU上的openMP)。無需工具箱和其他付費東西 - 默認情況下,您可以在Matlab和MEX中獲得。

  2. 爲「inner_function」寫一個CUDA啓動器。不需要商業工具箱。這是簡單的部分!只需用線程和塊代替「for循環」即可。 。 。 。並將其插入到您以前擁有常規功能的mex文件中。在此步驟中,預計C會比C高10倍--100倍。

按照這種方法,您將能夠在每一個小步驟進行調試和驗證正確性。根據我的經驗,管理緩衝區指針和緩衝區大小的代碼中的錯字是崩潰和錯誤結果的主要來源。在獲得錯誤結果方面沒有任何意義!

提示2:對於某些複雜函數(如kron),如果輸入和輸出的大小是固定的,則可以獲得寄存器級優化,線性,非迭代,非分支代碼使用像Wolfram Mathematica這樣的計算機代數系統。這樣的代碼在GPU上執行超快速。例如:Example use of Mathematica's formula optimising compiler

+0

你是如此有用這樣的想法,我希望我敦請求更多,如果我希望你看到我現在站在[解決問題](http://stackoverflow.com/questions/13249520/parallel-kronecker-tensor-product-on- GPU-使用-CUDA) – pyCuda