我想用推力的流压缩功能(copy_if),用于蒸馏从向量元素的索引,如果要素坚持一些限制。 一个的这些限制取决于相邻元件(8在二维和三维中的26)的值。 我的问题是:我怎么能获得推力元素的邻居?
函子的“copy_if”的函数调用操作基本上是这样的:
__host__ __device__ bool operator()(float x) {
bool mark = x < 0.0f;
if (mark) {
if (left neighbor of x > 1.0f) return false;
if (right neighbor of x > 1.0f) return false;
if (top neighbor of x > 1.0f) return false;
//etc.
}
return mark;
}
目前我使用一个变通方法,首先推出了CUDA核心(其中很容易访问邻居)以正确标记的元素。 在那之后,我通过标记元素推力的copy_if提炼标记元素的索引。
我跨越counting_iterator来作为一种替代的直接使用threadIdx和blockIdx获取处理元素的索引。 我尝试了以下解决方案,但在编译的时候,它给了我一个“/usr/include/cuda/thrust/detail/device/cuda/copy_if.inl(151):错误:未对齐的内存访问,不支持”。 据我所知,我并不想在不对齐的方式来访问内存。 任何人都知道发生了什么和/或如何解决这一问题?
struct IsEmpty2 {
float* xi;
IsEmpty2(float* pXi) { xi = pXi; }
__host__ __device__ bool operator()(thrust::tuple<float, int> t) {
bool mark = thrust::get<0>(t) < -0.01f;
if (mark) {
int countindex = thrust::get<1>(t);
if (xi[countindex] > 1.01f) return false;
//etc.
}
return mark;
}
};
thrust::copy_if(indices.begin(),
indices.end(),
thrust::make_zip_iterator(thrust::make_tuple(xi, thrust::counting_iterator<int>())),
indicesEmptied.begin(),
IsEmpty2(rawXi));