C++ 展开3 c++;cuda中的循环

C++ 展开3 c++;cuda中的循环,c++,arrays,cuda,C++,Arrays,Cuda,我目前正在编写一个程序,从一个大的2D数组中挑选2D块,并将它们放入一个较小的2D数组中。这些阵列实际上保存为一维阵列,但我假设它们是经过拉直的二维阵列。现在对于循环,请确保在转到大数组的新部分之前,先取出大循环的Nx、Ny元素 我真的想不出在CUDA内核中更有效地进行数据传输的方法。如果我只需要使用相同大小的数组,我就能够找到一个解决方案。但是在每个Nx*Ny元素后面都有一个新的位置,我感到困惑 下面是实现这一切的3个for循环。posx和posy包含需要减去起始位置的坐标 for (int

我目前正在编写一个程序,从一个大的2D数组中挑选2D块,并将它们放入一个较小的2D数组中。这些阵列实际上保存为一维阵列,但我假设它们是经过拉直的二维阵列。现在对于循环,请确保在转到大数组的新部分之前,先取出大循环的Nx、Ny元素

我真的想不出在CUDA内核中更有效地进行数据传输的方法。如果我只需要使用相同大小的数组,我就能够找到一个解决方案。但是在每个Nx*Ny元素后面都有一个新的位置,我感到困惑

下面是实现这一切的3个for循环。posx和posy包含需要减去起始位置的坐标

for (int i = 0; i < loadsize; i++)
    {
        for (int k = 0; k < Searchsizey; k++)
        {
            for (int l = 0; l < Searchsizex; l++)
            {
                img[count] = ImgInt[posx[i] - ImgStartx + (posy[i] - ImgStarty) * sizex + sizex*k + l];
                count++;
            }
        }
     }
for(int i=0;i
问题是这两个内部循环的最大值是Searchsizex和Searchsizey。如果我要在内核中使用l和k作为线程索引来实现这一点,那么它们将比Searchsizex和Searchsizey更大

我曾想过制作一个CUDA内核,通过I进行迭代,但这样做似乎非常有效。下面是我对内核的想法,但我不太喜欢它。这是唯一一种“半平行”

希望您能对如何进行此并行提供一些建议,谢谢

int l = blockIdx.x*blockDim.x + threadIdx.x;
int k = blockIdx.y*blockDim.y + threadIdx.y;
        for (int i = 0; i < loadsize; i++){
            img[l + k*sizex + (i*sizex*sizey)] = ImgInt[posx[i] - ImgStartx + (posy[i] - ImgStarty) * sizex + sizex*k + l];         
        }
int l=blockIdx.x*blockDim.x+threadIdx.x;
int k=blockIdx.y*blockDim.y+threadIdx.y;
对于(int i=0;i
所以我想,由于没有更多的人回应这个帖子,我将使用Florents评论作为答案

写入需要为float4类型,并且根据目标硬件,ImgInt应使用纹理或表面数据类型


除此之外,并行方法似乎非常合理。

根据输入的大小以及posx和posy的大小,可能适合不同的方法。你能提供这些方面的大致指标吗?此外,img?posx和posy的数据类型可以从0到1000不等,其中loadszie的大小可以是数百。Img是一个float4,为了获得最佳性能,您需要使用float4作为写入,并根据目标硬件,使用纹理或曲面作为ImgInt。对于其他人来说,你的并行方法似乎非常明智。嘿,弗洛伦特,再次感谢你的回答。你有什么建议来源吗?我想知道为什么这些数据类型比当前的数据类型提高了速度:)