2013-04-15 50 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指数。