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,这完全是缺少的关键字。如果你把它放在答案中,我会把它标记为这样。另外,它是建立在推力之上的,有许多有用的内置函数,用于处理稀疏矩阵,包括转换。