在 CUDA 中遍历数组时跳过每个 M 元素

Skipping every M elements when iterating through an array in CUDA

我是 Cuda 编程的新手,我一直在想如何将以下代码转换为 Cuda 代码。

for (int i = 0; i <= N; i += M) 
{
    output[i].x = signal[i].x;
    output[i].y = signal[i].y;
}

按照 vector_add 的例子,我得到了这个:

__global__ void dec(const complex * signal, int N, int M, complex * output)
{

    int i = blockIdx.x * blockDim.x + threadIdx.x;

    if (i <= N) 
    {
        output[i].x = signal[i].x;
        output[i].y = signal[i].y;
    }

这就是我被困的地方。在我的理解中,所有 thread/units 都会并行计算,所以我不确定在哪里通知迭代器跳过 Cuda 中的每个 M 元素。我想到的另一种方法是检查 i % M == 0。但是我想看看有没有什么我应该首先知道的来解决这个问题,比如线程同步等等

感谢任何帮助。

像这样的东西应该可以工作:

__global__ void dec(const complex * signal, int N, int M, complex * output)
{

    int i = blockIdx.x * blockDim.x + threadIdx.x; 
    i *= M;   // add this line
    if (i <= N) 
    {
        output[i].x = signal[i].x;
        output[i].y = signal[i].y;
    }

您还应确保不会溢出 int 变量。这应该可以通过不启动不必要的线程来管理,即不要启动明显超过 N/M 个线程的网格。