2013-04-15 54 views
1

基本上,我有一個「稀疏式」數據集,與擴展稀疏樣式矩陣的方法是什麼?

thrust::device_vector<int> indexes(smallsize); 
thrust::device_vector<float> values(smallsize); 

我想擴大成一個單一的

thrust::device_vector<float> expanded(fullsize); 

我知道如何與內核做到這一點的:

template <typename T> 
__global__ void AssignByIndex 
    (
    T* inval, 
    T* outval, 
    size_t* keys, 
    int Ilength 
    ) 
{ 
    int index = blockIdx.x * blockDim.x + threadIdx.x; 

    if (index < Ilength) 
    { 
     const size_t key = keys[index];//cross access,slow 
     outval[key]=inval[index]; 
    } 
}; 

但是1)這感覺就像推力可以輕鬆做到的事情,2)這不允許我使用花哨的迭代器。我想我只是在我的搜索中使用了一個不正確的術語,或者僅僅是沒有足夠的創造力。

+2

這聽起來像一個典型的分散操作。 – talonmies

+1

@talonmies老兄,那完全是缺少的關鍵字。如果你把它放在答案中,我會將它標記爲這樣。 – IdeaHat

+2

另外,[cusp](http://code.google.com/p/cusp-library/)建立在推力之上,並且具有用於處理稀疏矩陣(包括轉換)的許多有用的內置函數。 –

回答

2

這聽起來像一個典型的分散操作。推力有scatter function,讓你做這樣的事情:

thrust::scatter(values.begin(), values.end(), indexes.begin(), expanded.begin()); 

這將分散valuesexpanded指數。