0

我正在尝试从全局函数调用设备函数。这个函数只是声明一个所有线程都使用的数组。但是当我打印数组时我的问题是它的元素与声明的顺序不同。是因为所有线程都在再次创建数组吗?我对线程感到困惑。如果是,我可以知道在全局函数中哪个线程首先运行,我可以只允许它为其他线程声明数组吗?谢谢。这是我创建数组的函数:

__device__ float myArray[20][20];

__device__ void calculation(int no){
filterWidth = 3+(2*no);
filterHeight = 3+(2*no);
int arraySize = filterWidth;
int middle = (arraySize - 1) / 2;
int startIndex = middle;
int stopIndex = middle;

// at first , all values of array are 0
for(int i=0; i<arraySize; i++)
    for (int j = 0; j < arraySize; j++)
    {
        myArray[i][j] = 0;
    }

//  until middle line of the array, required indexes are 1
for (int i = 0; i < middle; i++)
{
    for (int j = startIndex; j <= stopIndex; j++)
    { myArray[i][j] = 1; sum+=1; }
    startIndex -= 1;
    stopIndex += 1;
}

// for middle line
for (int i = 0; i < arraySize; i++)
{myArray[middle][i] = 1; sum+=1;}

// after middle line of the array, required indexes are 1
startIndex += 1;
stopIndex -= 1;
for (int i = (middle + 1); i < arraySize; i++)
{
    for (int j = startIndex; j <= stopIndex; j++)
    { myArray[i][j] = 1; sum+=1; }
    startIndex +=1 ;
    stopIndex -= 1;
}


filterFactor = 1.0f / sum;
  } 

和全局功能:

__global__ void FilterKernel(Format24bppRgb* imageData)
  {
int tidX = threadIdx.x + blockIdx.x * blockDim.x;
int tidY = threadIdx.y + blockIdx.y * blockDim.y;

Colour Cpixel = Colour (imageData[tidX + tidY*imageWidth] );
float depthPixel =  Colour(depthData[tidX + tidY*imageWidth]).Red;
float absoluteDistanceFromFocus = fabs (depthPixel - focusDepth);


if(depthPixel == 0)
    return;

Colour Cresult = Cpixel;
for (int i=0;i<8;i++)
{
    calculation(i);
     ...
     ...
    }
 }
4

1 回答 1

0

如果您真的想选择并强制一个线程调用该函数而其余线程等待它这样做,请__shared__为设备函数创建的数组使用内存,以便块中的所有线程看到相同的线程,您可以调用它:

for (int i=0;i<8;i++)
{
    if (threadIdx.x == 0 && threadIdx.y == 0)
        calculation(i);
    __syncthreads();
    ...
}

当然,这在块之间不起作用 - 在全局定义的函数中,您无法控制块的计算顺序。

相反,如果可以,您应该在 CPU 上进行初始化计算(只需 1 个线程),然后在启动内核之前将其 memcpy 到 GPU。看起来您将为 myArray 使用 8 倍的内存,但它会大大加快您的计算速度。

于 2012-04-25T19:29:01.697 回答