我在使用 CUDA 对一组数字进行并行化时遇到了麻烦。
因此,例如,如果我们有一个包含数字(1、2、3、4、5)的数组 M
如果我要删除数组中的数字 2 并将所有内容向左移动,则结果数组将是 ( 1 , 3 , 4 , 5 , 5 )
其中 M[1] = M[2], M[2] = M[3] , M[3] = M[4]
我的问题是我们如何在 cuda 中并行执行此操作?因为当我们并行这个时,可能会出现竞争条件,其中数字 2 (M[1]) 可能不是第一个首先行动的人,如果 M[2] 是第一个移动的人,则结果数组将变为 (1 , 4 , 4 , 5 , 5)。有什么方法可以处理这个吗?我对 cuda 很陌生,所以我不知道该怎么办......
我目前的代码如下:
__global__ void gpu_shiftSeam(int *MCEnergyMat, int *seam, int width, int height, int currRow)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
int index = i+width*j;
if(i < width && j <height)
{
//shift values of -1 to the side of the image
if(MCEnergyMat[i+width*j] == -1)
{
if(i+1 != width)
MCEnergyMat[index] = MCEnergyMat[index+1];
}
if(seam[j] < i)
{
if(i+1 != width)
MCEnergyMat[index] = MCEnergyMat[index+1];
}
}
}
whereseam[i]
包含我想在数组中删除的索引。并且MCEnergyMat
只是从二维数组转换而来的一维数组......但是,我的代码不起作用......我相信竞争条件是问题所在。
谢谢!