在 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
个线程的网格。
我是 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
个线程的网格。