指標變量我剛開始嘗試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」
我改變了所有double與浮動,現在我得到以下錯誤:「runtime_exception:無法派發內核ID3D11DeviceContext ::調度:計算機着色器單元的插槽0中的着色器資源視圖是結構化緩衝區着色器需要一個類型化的緩衝區,如果着色器實際使用該視圖,則該不匹配是無效的<例如,由於着色器代碼分支>,它不會被跳過。 – aristos 2012-01-14 10:04:11
順便說一句,找不到使用idx.x,idx.y表示法指定上三角形的方法。你能詳細說明嗎? – aristos 2012-01-14 10:05:52
我認爲標記有問題。再次拍攝@SimonWybranski – aristos 2012-01-14 20:42:13