如果元素遵守许多约束,我想使用 Thrust 的流压缩功能 (copy_if) 从向量中提取元素的索引。这些约束之一取决于相邻元素的值(2D 中的 8 和 3D 中的 26)。我的问题是:如何在 Thrust 中获取元素的邻居?
'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 内核(在其中很容易访问邻居)来适当地标记元素来使用一种解决方法。之后,我将标记的元素传递给 Thrust 的 copy_if 以提取标记元素的索引。
我遇到了counting_iterator 作为一种直接使用threadIdx 和blockIdx 来获取已处理元素的索引的替代品。我尝试了下面的解决方案,但是在编译它时,它给了我一个“/usr/include/cuda/thrust/detail/device/cuda/copy_if.inl(151): Error: Unaligned memory accesses not supported”。据我所知,我并没有试图以不对齐的方式访问内存。任何人都知道发生了什么和/或如何解决这个问题?
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));