Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 扩展稀疏样式矩阵的主要方法是什么?_C++_Cuda_Thrust - Fatal编程技术网

C++ 扩展稀疏样式矩阵的主要方法是什么?

C++ 扩展稀疏样式矩阵的主要方法是什么?,c++,cuda,thrust,C++,Cuda,Thrust,基本上,我有一个“稀疏样式”的数据集 thrust::device_vector<int> indexes(smallsize); thrust::device_vector<float> values(smallsize); 推力::设备向量索引(小尺寸); 推力:设备_矢量值(小尺寸); 我想把这个扩展成一个 thrust::device_vector<float> expanded(fullsize); 推力::设备_矢量扩展(全尺寸); 我知道

基本上,我有一个“稀疏样式”的数据集

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];
    }
};
模板
__全局无效AssignByIndex
(
T*inval,
T*outval,
尺寸*键,
内部长度
)
{
int index=blockIdx.x*blockDim.x+threadIdx.x;
如果(索引<长度)
{
const size_t key=keys[index];//交叉访问,速度慢
outval[key]=inval[index];
}
};

但是1)这感觉像是一件可以轻松完成的事情,2)这不允许我使用花哨的迭代器。我想我只是在搜索中使用了一个不正确的术语,或者只是不够有创意。

这听起来像是一个典型的分散操作。推力有一个可以让你做这样的事情:

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

这将把
分散到
扩展的索引中

这听起来像是一个典型的分散操作。@Talonmes dude,这完全是缺少的关键字。如果你把它放在答案中,我会把它标记为这样。另外,它是建立在推力之上的,有许多有用的内置函数,用于处理稀疏矩阵,包括转换。