Cuda 以正确的方式读取数据

Cuda 以正确的方式读取数据,cuda,Cuda,我有一个cpp文件,我在其中创建图像并将数据存储到myOutput指针: int Rows = 80; int Cols = 64; for (int i = 0; i < Rows; i++ ){ for (int j = 0; j < Cols; j++ ) { X = 1.0f * ((float) i - (float) Rows / 2) / (float) Rows; Y = 2.0f * ((float) j - (float) Cols / 2)

我有一个cpp文件,我在其中创建图像并将数据存储到myOutput指针:

int Rows = 80;
int Cols = 64;

for (int i = 0; i < Rows; i++ ){

   for (int j = 0; j < Cols; j++ )
    {

X = 1.0f * ((float) i - (float) Rows / 2) / (float) Rows;
Y = 2.0f * ((float) j - (float) Cols / 2) / (float) Cols;
.....
myOutput->Re = cosf( ......);
myOutput->Im = sinf(.......);

++myOutput;

    }
}
(因此,从cpp生成的myOutput加载到DeviceInputArray中)

现在,我想同时处理许多图像

因此,在cpp中,必须添加以下内容(例如,对于2幅图像):

但我不知道该怎么做

我希望它是清楚的

已更新

我正在尝试这样的事情:

 int bx = blockIdx.x , by = blockIdx.y ,  bz = blockIdx.z;
 int tx = threadIdx.x , ty = threadIdx.y , tz = threadIdx.z;

 int RowIdx = ty + by * TILE_WIDTH;
 int ColIdx = tx + bx * TILE_WIDTH;
 int ImagesIdx = tz + bz * blockDim.z;

 Index = RowIdx * Cols + ColIdx + Rows * Cols * ImagesIdx
以及:


但是如果我尝试两个图像,我没有得到正确的结果。

好的,对于使用多个图像,您必须向共享变量添加一个额外的维度,以保持图像的数量。

我认为方法是每个块处理多个图像。理想的情况是同时处理所有图像,但显然由于共享内存的大小有限,每个块可以加载和处理的图像数量存在上限。根据每个线程块可用的共享内存大小,您可能会发现最大可能的映像数。您可能还需要填充输入数据来调整大小。详细信息取决于您对共享内存数据执行的操作。@ramino:您好,如果您想检查,我已更新,谢谢。我不明白您为什么认为网格和块维度都是3。如果你发现使用更高维度的块更容易,你可以考虑一个2D网格的3D块。然后检查是否可以在一个块中容纳2个(或更多)图像。可能导致问题的原因是您使用共享内存的方式。顾名思义,它是共享的,因此您必须确保每个映像都从共享内存访问正确的数据部分,并且不会覆盖另一个映像的数据。
int ImagesNb = 2;

for ( ImagesIdx = 0; ImagesIdx < ImagesNb; ImagesIdx++ ){
   for (int i = 0; i < Rows; i++ ){

       for (int j = 0; j < Cols; j++ )
        {

 X = (ImagesIdx + 1) * 1.0f * ((float) i - (float) Rows / 2) / (float) Rows;
 Y = (ImagesIdx + 1) * 2.0f * ((float) j - (float) Cols / 2) / (float) Cols;
...
Index = RowIdx * Cols + ColIdx;

//copy input data to shared memory
myshared[ty+1][tx+1] = *( devInputArray + Index );
 int bx = blockIdx.x , by = blockIdx.y ,  bz = blockIdx.z;
 int tx = threadIdx.x , ty = threadIdx.y , tz = threadIdx.z;

 int RowIdx = ty + by * TILE_WIDTH;
 int ColIdx = tx + bx * TILE_WIDTH;
 int ImagesIdx = tz + bz * blockDim.z;

 Index = RowIdx * Cols + ColIdx + Rows * Cols * ImagesIdx
dim3 dimGrid( ImagesNb * (Cols / TILE_WIDTH)  , ImagesNb * (Rows / TILE_WIDTH) , ImagesNb);
dim3 dimBlock( TILE_WIDTH , TILE_WIDTH , 2);