thrust :: device_vector未正确更新

时间:2018-06-18 07:16:47

标签: c++ parallel-processing cuda gpu thrust

我试图在设备向量中保存CUDA内核方法的结果 下面是我的内核代码,当我打印它时,数据将进入int * out和int * outTwo数组。

template <typename T>
struct KernelArray
{
    T*  _array;
    int _size;
};
template <typename T>
KernelArray<T> convertToKernel(thrust::device_vector<T>& dVec)
{
KernelArray<T> kArray;
kArray._array = thrust::raw_pointer_cast(&dVec[0]);
kArray._size = (int)dVec.size();

return kArray;
}
   __global__ void CompareVector(KernelArray<CollisionSet> inArrayA,    KernelArray<CollisionSet> inArrayB, 
 int* out,int* outTwo, unsigned int numColVec)

{
unsigned int index = __umul24(blockIdx.x, blockDim.x) + threadIdx.x;

if (index >= numColVec) return;
for (int i = 0; i < numColVec; i++) {

    if (inArrayA._array[index].one == inArrayB._array[i].one)
    {
        if (inArrayA._array[index].two == inArrayB._array[i].two) {
            out[index]= inArrayA._array[i].one;
            outTwo[index] = inArrayA._array[i].two; 
       printf("out %d, outTwo %d, index %d\n", out[1], outTwo[1], index);
        }
    }
}

}

但是它没有更新到device_vector

    void SweepandPrune() {

        device_vector<CollisionSet> ColVectorX, ColVectorY, ColVectorZ;
        device_vector<int> one, two;
        one.push_back(-1);
        two.push_back(-1);
        int* d_one = thrust::raw_pointer_cast(&one[0]);
        int* d_two = thrust::raw_pointer_cast(&two[0]);
        ColVectorX = ProjectVector(0);
        ColVectorY = ProjectVector(1);
        ColVectorZ = ProjectVector(2);

            CompareVector << <1, 256>> > (convertToKernel(ColVectorX),  convertToKernel(ColVectorY), d_one, d_two, ColVectorY.size());

}

这是我启动内核代码的地方。当我打印device_vector一个大小时它仍然是1(因为-1我初步投入)

我搜索过这个 https://gist.github.com/docwhite/843f17e33e4c1f2b531a14a4bdfe90ec 我认为raw_pointer_cast应该有效。我错过了什么?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我想我得到了答案。 进入内核的向量需要特定于大小。 所以当我声明它时,我增加了device_vector的大小。 它有效。

答案 1 :(得分:1)

这里没有魔力:Thrust vector&#39;尺寸不会发生变化,因为代码中没有您尝试更改尺寸的地方。除了将-1推入它们之外,你什么都不做,甚至可能改变它们的大小。显然它保持不变。