2012-09-19 98 views
0

我有一個程序,調用子程序foo沒有得到矢量即使使用IVDEP附註的電話。 vec-report3不給我爲什麼呼叫沒有矢量任何理由。是因爲記憶參考嗎?矢量化到子程序

注:ARR1,ARR2,ARR3都在一個共同的塊

program test 
    integer i, j, k, n 
    double precision arr1(5, 5, n, n), aar2(5, 5, n, n), aar3(5, n, n, n) 
    !DIR$ IVDEP 
    do i=1, n 
     call foo(arr1(1, 1, i, k), aar2(1, 1, i, k), aar3(1, i, j, k)) 
    enddo 
end 

subroutine foo(fooarr1, fooarr2, fooarr3) 
    implicit none 
    double precision fooarr1(5, 5), fooarr2(5, 5), fooarr3(5) 
    some computations on fooarr1, fooarr2, fooarr3 
    fooarr1,fooarr2,fooarr3 gets updated. But there are no vector dependance 

return 
end 
+1

爲什麼不動了內環路'foo'並嘗試vectorise它。 –

+0

@HristoIliev:這是一個很好的建議。我會試試 – arunmoezhi

+0

@HristoIliev:在我把'foo'裏的循環移開之後,它做了矢量化處理。 我正在尋找其他選項。使這個子程序'foo'元素矢量化函數調用? – arunmoezhi

回答

0

它不能簡單地進行定義,如果子程序是不平凡的,而不是內聯。矢量化是有限的一組SIMD指令的使用(你是一個矢量克雷或NEC,或在x86上?),在那裏你可以例如提出四個乘法simultanously。但是爲了同時執行程序,您應該可能正在使用線程進行並行化,或者應該在子例程內搜索可能的向量化。

- 編輯 - 像

!DIR$ IVDEP 
     DO I = 1,N 
     A(I) = A(I+1) + 3.0 
     END DO 

當我檢查了Web引用,編譯器廠商確實一直有這樣的例子裏面有沒有來電,只是一個簡單的計算。爲了確定發生了什麼,你還應該發佈你的子程序的代碼。

+0

我在x86上。該子程序有超過50個LOC,我不想將它內聯。這段代碼是MPI程序的一部分,它已經被並行化了。 – arunmoezhi

+0

fooarr1,fooarr2,fooarr3得到反映原始陣列ARR1子程序,ARR2,ARR3內更新。但沒有矢量依賴 – arunmoezhi

+0

然後它不能被矢量化。你可以在裏面找到矢量化的地方或者使用線程。無關緊要,向量化僅適用於使用特殊CPU指令的簡單循環。 –