循环的全局函数是不是并行运行?

Posted

技术标签:

【中文标题】循环的全局函数是不是并行运行?【英文标题】:Does global function for loop run parallel or not?循环的全局函数是否并行运行? 【发布时间】:2022-01-17 18:57:33 【问题描述】:

此代码块运行正常。但我想知道 for 循环内部是并行运行(在 cuda 中)还是串行运行?

const int xIndex = blockIdx.x * blockDim.x + threadIdx.x;
const int yIndex = blockIdx.y * blockDim.y + threadIdx.y;
int tid = yIndex * blockDim.x + xIndex;
float resultOneDimensional = 0;

if((xIndex < width) && (yIndex < height))
    const int input_tid = yIndex * inputWidthStep + xIndex;
    const int buffer_tid = yIndex * bufferWidthStep + (xIndex * CHANNEL);
    const float readFrame = input[input_tid];
    output[buffer_tid + bufferSize] = readFrame;

    for (tid = 0; tid < CHANNEL; tid++)
         resultOneDimensional += (output[buffer_tid + bufferSize + tid] / (CHANNEL));
    
    outputOneDimensional[input_tid] = static_cast<unsigned char>(resultOneDimensional);

【问题讨论】:

请您使用 C 或 C++ 编程,但很少同时使用两者。您显示的代码不是有效的 C,因此请edit您的问题以删除 C 语言标签。 【参考方案1】:

内核的每个线程都将运行该 for 循环。

for 循环本身在单个线程的上下文中串行运行。

这意味着线程 0 将执行 for 循环的副本,线程 0 将在其 tid 值(可能为 0)处开始循环,线程 0 将执行 for 循环的主体 CHANNEL-tid次。

同样,线程 1 将执行 for 循环的副本,线程 1 将在其 tid 值(可能为 1)处开始循环,线程 1 将执行 for 循环的主体 CHANNEL-tid次。

等等,对于内核(网格)中的其他线程。

【讨论】:

这段代码行在 global Cuda 函数内,所以 for 循环仍然是串行的吗?谢谢! 那么如何设计这些代码来并行运行呢? 是的,从您的代码中可以明显看出(例如,blockIdx.x 的用法表明这是在内核中运行的内核代码(__global__ CUDA 函数称为内核)。您的 for 循环出现进行减少。要“并行”运行其中一个,我将使用parallel reduction 方法。

以上是关于循环的全局函数是不是并行运行?的主要内容,如果未能解决你的问题,请参考以下文章

并行执行DynamoDB查询(全局二级索引的BatchGetItems)

是否可以从全局或设备函数调用 CUDA CUBLAS 函数

Python多处理:我可以使用更新的全局变量重用进程(已经并行化的函数)吗?

全局变量如何在 Python 并行编程中工作?

局部变量和全局变量的区别

windows驱动开发-设备扩展