您好,
我想对一幅图像作特征点提取,大概流程是:逐个像素计算兴趣值,满足条件作为特征点。像素计算过程在GPU完成,在计算之前不知道有多少特征点,1)GPU没有动态数组是不是?
kernel(unsigned char * ptr,unsigned int ptx,unsigned intpty)
{
………………
nX*nY 个线程计算像素点,
如果判断满足条件,是特征点,我该怎么存到ptx、pty中呢
N<nX*nY 的,大了就报错
所有线程同时计算,谁先算完不知道,放到ptx、pty哪个位置也不好确定呀?
想是不是需要原子操作,可原子操作也要找到地址?
不知道表达清我的困惑没有,请老师帮忙,好吗?
}
main()
{
unsigned char * d_bitmap;//图像大小为nXnY
unisigned int * d_ptx,d_pty;//存储特征点的X、Y坐标,因为不知道会有多少个特征点,我就设了个比较大的值N
cudaMalloc((void*)&d_ptx,Nsizeof(int));
cudaMalloc((void**)&d_pty,N*sizeof(int));
dim3 block(nX,nY);
kernel<<<block,1>>>(d_bitmap,d_ptx,d_pty);
}
你可以考虑使用索引index,if条件满足的话index使用原子操作加1,然后线程按照index的位置写入显存。
还是不大懂啊?
你说的index是当前执行线程索引号吗?
执行线程数量远大于特征点数
是全局变量,满足特征点的就加1,不满足的不加1.
可以有两个解决方案。
1). 分配一个nXnY的数组,初始化为0, 然后满足条件的特征点对应位置写为1。对此输出数组做一个scan,则scan的结果就是输出位置。
2). 用原子函数。还是分配一个nxny的数组c,初始化一个全局内存变量count=0。
if (point is characteristics)
{
int idx = atomicAdd(count, 1);
c[idx] = point;
}