2012-01-13 18 views
0

指標變量我剛開始嘗試C++ AMP和我決定給它與當前項目我工作的一個鏡頭。在某些時候,我要建立我的向量距離矩陣,我已經寫了下面的代碼爲這個控制在C++ AMP

unsigned int samplesize=samplelist.size(); 
unsigned int vs = samplelist.front().size(); 

vector<double> samplevec(samplesize*vs); 
vector<double> distancevec(samplesize*samplesize,0); 

it1=samplelist.begin(); 

for(int i=0 ; i<samplesize; ++i){ 
    for(int j = 0 ; j<vs ; ++j){ 
     samplevec[j + i*vs] = (*it1)[j]; 
    } 
    ++it1; 
} 

array_view<const double,2> samplearray(samplesize,vs,samplevec); 
array_view<writeonly<double>,2> distances(samplesize,samplesize,distancevec); 

parallel_for_each(distances.grid, [=](index<2> idx) restrict(direct3d){ 
    double sqrsum=0; 
    double tempd=0; 

    for (unsigned int i=0 ; i<vs ; ++i) 
    { 
     tempd = samplearray(idx.x,i) - samplearray(idx.y,i); 
     sqrsum += tempd*tempd; 
    } 
    distances[idx]=sqrsum; 
} 

然而,正如你所看到的,這並沒有考慮到距離的對稱性矩陣。當我計算矩陣Ĵ的sqrsum,我不想再做同樣的計算時,Ĵ的順序顛倒過來。有什麼辦法可以做到這一點?我想出了下面的技巧,但我不知道這是否會撞了性能顯著

for (unsigned int i=0 ; i<vs ; ++i) 
    { 
     if(idx.x<=idx.y){ 
      break; 
     } 

     tempd = samplearray(idx.x,i) - samplearray(idx.y,i); 
     sqrsum += tempd*tempd; 
    } 

的,如果條件能勝任這項工作?或者你認爲if語句會不必要地損害性能?我不能和任何替代走到它


BTW,我只注意到上面寫的代碼並不在我的機器,它的GPU僅支持單精度上工作。有什麼可以解決這個問題嗎?錯誤消息如下: 「runtime_exception:併發;; parallel_for_each使用不支持的功能通過所選擇的加速器 ID3D11Device :: CreateComputeShader:。着色器使用那些不支持的當前設備上雙精度浮點數OPS」

回答

2

我想就可以消除,如果條件,如果你需要,你會安排,而不是調度覆蓋您的輸出矩陣整個矩形只多線程。你需要的是沒有對角線的上或下三角形,你可以使用算術序列來計算。

的替代方案將是組織的輸入數據使得其在兩個一維矢量,每一個線程將從矢量1讀取值,則向量2和計算距離,並將其存儲在所述輸入矢量中的一個。

最後,在雙精度誤差顯示出來,因爲你正在使用的顯卡不支持雙精度運算。請檢查您的卡片規格以確認。您可以通過切換到單精度類型(即array_view模板中的「float」)來解決此問題。

+0

我改變了所有double與浮動,現在我得到以下錯誤:「runtime_exception:無法派發內核ID3D11DeviceContext ::調度:計算機着色器單元的插槽0中的着色器資源視圖是結構化緩衝區着色器需要一個類型化的緩衝區,如果着色器實際使用該視圖,則該不匹配是無效的<例如,由於着色器代碼分支>,它不會被跳過。 – aristos 2012-01-14 10:04:11

+0

順便說一句,找不到使用idx.x,idx.y表示法指定上三角形的方法。你能詳細說明嗎? – aristos 2012-01-14 10:05:52

+0

我認爲標記有問題。再次拍攝@SimonWybranski – aristos 2012-01-14 20:42:13

相關問題