__device__ int3 Get3AdjacentTri(int center,int level)
{
int octaTriCount = 1 << (level << 1);
int octa=center>>(2*level);//八分体编号
int octaID=center-(octa<<(2*level));//该ID在八分体内的编号
int row=sqrtf((float)(octaID+0.5f)); //在八分体内的行号
int col=octaID-row*row; //在八分体内的列号
int rowCount=1<<level; //八分体的总行数
int colCount=2*row+1; //所在行的总列数
int leftTri = -1, rightTri = -1, topTri = -1;
int rightOcta = -1;
if (octa == 0 || octa == 1 || octa == 2)
rightOcta = octa + 1;
if (octa == 5 || octa == 6 || octa == 7)
rightOcta = octa - 1;
else if (octa == 3)
rightOcta = 0;
else if (octa == 4)
rightOcta = 7;
int leftOcta = -1;
if (octa == 1 || octa == 2 || octa == 3)
leftOcta = octa - 1;
if (octa == 4 || octa == 5 || octa == 6)
leftOcta = octa + 1;
else if (octa == 0)
leftOcta = 3;
else if (octa == 7)
leftOcta = 4;
int topOcta = -1;
if (octa < 4)
{
topOcta = octa + 4;
}
else
{
topOcta = octa - 4;
}
if (row == 0)//三角形B
{
rightTri = rightOcta * octaTriCount;
leftTri = leftOcta * octaTriCount;
topTri = 2;
}
else if (row > 0 && row < rowCount - 1 && col == 0)//三角形E
{
rightTri = center + 1;
topTri = center + colCount + 1;
leftTri = leftOcta * octaTriCount + octaID + colCount - 1;
}
else if (row == rowCount - 1 && col == 0)//三角形C
{
rightTri = center + 1;
leftTri = leftOcta * octaTriCount + octaID + colCount - 1;
topTri = topOcta * octaTriCount + octaTriCount - 1;
}
else if (row == rowCount - 1 && col > 0&&col<colCount-1 && col % 2 == 0)//三角形G
{
leftTri = center - 1;
rightTri = center + 1;
topTri = topOcta * octaTriCount + octaTriCount - col - 1;
}
else if (row == rowCount - 1 && col == colCount - 1)//三角形D
{
leftTri = center - 1;
rightTri = rightOcta * octaTriCount + octaTriCount - colCount;
topTri = topOcta * octaTriCount + octaTriCount - colCount;
}
else if (row > 0 && row < rowCount - 1 && col == colCount - 1)//三角形F
{
leftTri = center - 1;
topTri = center + colCount + 1;
rightTri = rightOcta * octaTriCount + octaID - colCount + 1;
}
else
{
leftTri = center - 1;
rightTri = center + 1;
if (col % 2 == 0)
{
topTri = center + colCount + 1;
}
else
{
topTri = center - colCount + 1;
}
}
int3 neibhbour;
neibhbour.x=leftTri;
neibhbour.y=rightTri;
neibhbour.z=topOcta;
return neibhbour;
}
这是一段求QTM格网邻近三角形的代码,我想用CUDA实现,但计算结果总是不对,这个过程需不需要用原子操作啊,请高手帮忙
注:同时有很多个线程执行这些代码