我想在cuda/thrust中編碼以下問題。我給出了一個關鍵字列表和三個與每個鍵關聯的值。我已經設法按字典順序對它們進行排序。如果具有相同鍵的輸入具有每個數值關係,那麼現在需要減少輸入。在下面的例子中,V1(a)和V1(c)和V2(a)是V2(c)和V3(a),這意味着Input a <輸入c,因此輸入c從輸出中刪除。刪除排序列表中的條目:在gpu中有效
示例輸入:
Key V1 V2 V3
a. 1 2 5 3
b. 1 2 6 2
c. 1 2 7 4
d. 1 3 6 5
e. 2 8 8 8
f. 3 1 2 4
示例輸出:
Key V1 V2 V3
a. 1 2 5 3
b. 1 2 6 2
e. 2 8 8 8
f. 3 1 2 4
- 輸入一個<輸入的C ==>℃下除去
- 輸入一個<輸入d ==> d除去
我已經能夠使用for-loops和if語句解決上述問題。我目前正在嘗試使用基於GPU的cuda/thrust來解決這個問題。這是否可以在GPU上完成(最好是推力)或者一個單獨的內核必須用cuda編寫?
我沒有制定使用獨特的這個問題,因爲在Thrust: Removing duplicates in key-value arrays
編輯討論包括程序「STL/C++」的程序來生成上述方案:部分「減少MYMAP」使用for循環我的實現和if語句。
#include <iostream>
#include <tr1/array>
#include <vector>
#include <algorithm>
struct mapItem {
mapItem(int k, int v1, int v2, int v3){
key=k;
std::tr1::array<int,3> v = {v1, v2, v3};
values=v;
};
int key;
std::tr1::array<int,3> values;
};
struct sortLexiObj{
bool operator()(const mapItem& lhs, const mapItem& rhs){
return lhs.values < rhs.values;
}
};
struct sortKey{
bool operator()(const mapItem& lhs, const mapItem& rhs){
return lhs.key < rhs.key;
}
};
int main(int argc, char** argv){
std::vector<mapItem> myMap;
// Set up initial matrix:
myMap.push_back(mapItem(3, 1, 2, 4));
myMap.push_back(mapItem(1, 2, 6, 2));
myMap.push_back(mapItem(1, 2, 5, 3));
myMap.push_back(mapItem(1, 3, 6, 5));
myMap.push_back(mapItem(2, 8, 8, 8));
myMap.push_back(mapItem(1, 2, 7, 4));
std::sort(myMap.begin(), myMap.end(), sortLexiObj());
std::stable_sort(myMap.begin(), myMap.end(), sortKey());
std::cout << "\r\nOriginal sorted Map" << std::endl;
for(std::vector<mapItem>::iterator mt=myMap.begin(); mt!=myMap.end(); ++mt){
std::cout << mt->key << "\t";
for(std::tr1::array<int,3>::iterator it=(mt->values).begin(); it!=(mt->values).end(); ++it){
std::cout << *it << " ";
}
std::cout << std::endl;
}
/////////////////////////
// Reducing myMap
for(std::vector<mapItem>::iterator it=myMap.begin(); it!=myMap.end(); ++it){
std::vector<mapItem>::iterator jt=it; ++jt;
for (; jt != myMap.end();) {
if ( (it->key == jt->key)){
if (it->values.at(0) <= jt->values.at(0) &&
it->values.at(1) <= jt->values.at(1) &&
it->values.at(2) <= jt->values.at(2)) {
jt = myMap.erase(jt);
}
else ++jt;
}
else break;
}
}
std::cout << "\r\nReduced Map" << std::endl;
for(std::vector<mapItem>::iterator mt=myMap.begin(); mt!=myMap.end(); ++mt){
std::cout << mt->key << "\t";
for(std::tr1::array<int,3>::iterator it=(mt->values).begin(); it!=(mt->values).end(); ++it){
std::cout << *it << " ";
}
std::cout << std::endl;
}
return 0;
}
難以確切地確定您需要什麼,但它似乎像推力:: unique_by_key可能是解決方案。你可以發佈一個鏈接到你的串行解決方案嗎? –
在原始文章中添加代碼。 – waqy
我不'想'推力:: unique_by_key'將以一種簡單的方式工作,因爲它通過查看相鄰元素來執行獨特的步驟。解決方案需要查看所有可能的配對。 –