英文:
OpenMP enforce the order in which tasks are created
问题
我对OpenMP还不熟悉,我认为我的用例并不简单,因此正在寻找方法的指导。
在OpenMP中是否有一种方法可以强制按照它们生成的顺序执行任务?
我想要实现的目标如下:
我的数据是一个数据包,其中包含序列号和传感器ID。
必须为每个传感器ID保持序列号的顺序,但不同的传感器ID可以并行执行。
在伪代码中 - 请原谅语法。我正在寻求概念上的理解。
#pragma parallel for ordered
for data in data_packet_by_sequence
#pragma task nowait
omp_set_lock(data.sensor_id)
process_data(data) // 必须按照data.sequence的顺序执行
omp_unset_lock(data.sensor_id)
但问题是,处理数据的过程可能会按照不符合数据包的序列号的顺序安排。
我如何强制在处理传感器数据时,要尊重数据.sequence的顺序?
提前感谢您的帮助。
英文:
I am new to OpenMP and think my use case is not simple - hence looking for pointers on approach.
Is there a way to enforce execution of tasks in order they are spawned in OpenMP?
What I want to achieve is as follows
My data is a packet of data which contains a sequence number and sensor id.
The order of sequence number must be maintained for each sensor id but different sensor ids can execute in parallel.
In pseudo code - so please excuse the syntax. I am seeking conceptual understanding.
#pragma parallel for ordered
for data in data_packet_by_sequence
#pragma task nowait
omp_set_lock(data.sensor_id)
process_data(data) // must execute in order of data.sequence
omp_unset_lock(data.sensor_id)
But the problem is that the process data might be schedule in a sequence that does not honor the sequence number of the packet
How can I enforce that when a sensor data is processed, it respects the data.sequence ordering?
Thanks in advance.
答案1
得分: 1
我认为depend
子句是一个解决方案。我应该写一个注释,因为我不太确定这是否有效并且是否是一个合适的答案,但是在注释中编写(伪)代码很困难...
int dep[nbsensors];
#pragma omp parallel
#pragma omp single nowait
{
for data in data_packet_by_sequence {
#pragma omp task firstprivate(...) depend(inout:dep[data.sensor_id])
process_data(data);
}
}
解释:当运行具有depend(out:x)
子句的任务时,它会阻止所有具有depend(in:x)
子句的其他任务启动。因此,在具有depend(inout:x)
子句的任务中(对于它们所有的x相同),在给定时间内只能运行一个任务。
你甚至不需要在dep[]
中实际写入任何内容。
英文:
I think that the depend
clause is a solution. I should rather write a comment because I am not really sure this works and is a proper answer, but writing (pseudo-)code in comments is difficult...
int dep[nbsensors];
#pragma omp parallel
#pragma omp single nowait
{
for data in data_packet_by_sequence {
#pragma omp task firstprivate(...) depend(inout:dep[data.sensor_id])
process_data(data);
}
}
Explanation: when a task that has a depend(out:x)
clause is running, it prevents all other tasks with a depend(in:x)
clause to start. As a consequence, among the tasks having a depend(inout:x)
clause (same x for all of them), only one of them can run at a given time.
You don't even need to actually write something in dep[]
.
答案2
得分: 1
实际上有一个非常简单的解决方案,所有线程执行整个循环,但特定线程只处理一些选定的传感器:
#pragma omp parallel
{
int nbthreads = omp_get_num_threads();
int ithread = omp_get_thread_num();
for data in data_packet_by_sequence {
if ((data.sensor_id*nbthreads)/nbsensors == ithread)
process_data(data);
}
}
这保证特定传感器的所有数据由同一线程按顺序处理。
英文:
There is actually a very simple solution, where all the threads execute the whole loop, but a given thread processes only some selected sensors:
#pragma omp parallel
{
int nbthreads = omp_get_num_threads();
int ithread = omp_get_thread_num();
for data in data_packet_by_sequence {
if ((data.sensor_id*nbthreads)/nbsensors == ithread)
process_data(data);
}
}
This garantees that all the data from a given sensor are processed sequentially by the same thread
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论