2010-02-22 48 views
1

我有一個for循環執行以下的功能:下面的循環可以被矢量化嗎?

由8矩陣以一個M和:由矩陣的8

  1. 分割成大小爲512元件的塊(意味着X == 512,並且元素的數量可以是128,256,512,1024,2048)
  2. 將塊重新整形爲1×512(元素數)矩陣。
  3. 取矩陣的最後1/4並放在前面,
    例如, Data = [Data(1,385:512),Data(1,1:384)];

以下是我的代碼:

for i = 1 : NumOfBlock 
    if i == 1 
     Header = tempHeader(1:RowNeeded,:); 
     Header = reshape(Header,1,BlockSize); %BS 
     Header = [Header(1,385:512),Header(1,1:384)]; %CP 
     Data = tempData(1:RowNeeded,:); 
     Data = reshape(Data,1,BlockSize); %BS 
     Data = [Data(1,385:512),Data(1,1:384)]; %CP 
     start = RowNeeded + 1; 
     end1 = RowNeeded * 2; 
    else 
     temp = tempData(start:end1,:); 
     temp = reshape(temp,1,BlockSize); %BS 
     temp = [temp(1,385:512),temp(1,1:384)]; %CP 
     Data = [Data, temp]; 
    end 

    if i <= 127 & i > 1 
     temp = tempHeader(start:end1,:); 
     temp = reshape(temp,1,BlockSize); %BS 
     temp = [temp(1,385:512),temp(1,1:384)]; %CP 
     Header = [Header, temp]; 
    end 

    start = end1 + 1; 
    end1=end1 + RowNeeded; 
end 

運行這個循環有500萬件將於1個多小時。我需要它儘可能快(以秒爲單位)。這個循環能夠被矢量化嗎?

回答

0

我再一次感謝Amro給我一個關於如何解決我的問題的想法。對不起,在這個問題上沒有說清楚。

這是我解決我的問題:

%#BS CDMA, Block size 128,512,1024,2048 
    BlockSize = 512; 
    RowNeeded = BlockSize/8; 
    TotalRows = size(tempData); 
    TotalRows = TotalRows(1,1); 
    NumOfBlock = TotalRows/RowNeeded; 
    CPSize = BlockSize/4; 

%#spilt into blocks 
    Header = reshape(tempHeader',[RowNeeded,8, 128]); 
    Data = reshape(tempData',[RowNeeded,8, NumOfBlock]); 
    clear tempData tempHeader; 

%#block spread & cyclic prefix 
    K = zeros([1,BlockSize,128],'single'); 
    L = zeros([1,BlockSize,NumOfBlock],'single'); 
     for i = 1:NumOfBlock 
      if i <= 128 
       K(:,:,i) = reshape(Header(:,:,i),[1,BlockSize]); 
       K(:,:,i) = [K((CPSize*3)+1:BlockSize),K(1:CPSize*3)]; 
      end 
      L(:,:,i) = reshape(Data(:,:,i),[1,BlockSize]); 
      L(:,:,i) = [L((CPSize*3)+1:BlockSize),L(1:CPSize*3)]; 
     end 
0

如果你能告訴你正在做什麼(我的猜測是動態系統中的一些模擬,但很難說),這將是很好的。

是的,當然它可以是矢量化的:你的每個塊實際上是四個子塊;使用您的(極不標準)指標:

1 ... 128,129 ... 256,257 ... 384,385 ... 512

每個內核/線程/什麼,永遠你-call-它矢量化的應執行下列操作:

I = threadIdx是 溫度=數據127之間0和[1 + 1] 數據[1 + 1] =數據[385 + i]於 數據[ 385 + 1] =數據[257 + i]於 數據[257 + I] =數據[129 + i]於 數據[129 + I] =溫度

您當然應該也在塊上並行化,不僅矢量化。

+0

我做塊在CDMA擴頻。 temp = reshape(temp,1,BlockSize);取第1列並將它變成1乘N矩陣。對其餘列重複並將其附加到第1個1乘N矩陣的末尾。 temp = [temp(1,385:512),temp(1,1:384)];是做一個循環前綴插入。 – 2010-02-22 14:18:37

4

根據您的功能描述,這裏就是我想出了:

M = 320;   %# M must be divisble by (numberOfElements/8) 
A = rand(M,8);  %# input matrix 

num = 512;   %# numberOfElements 
rows = num/8;  %# rows needed 

%# equivalent to taking the last 1/4 and putting it in front 
A = [A(:,7:8) A(:,1:6)]; 

%# break the matrix in blocks of size (x-by-8==512) into the third dimension 
B = permute(reshape(A',[8 rows M/rows]),[2 1 3]); 

%'# linearize everything 
B = B(:); 

這個圖可以幫助理解上面:

diagram

+0

謝謝!雖然它不是我想要的,但是你的解決方案給了我一個關於如何去解決我的問題的想法。對不起,在這個問題上沒有說清楚。 – 2010-02-23 12:03:09