我正在将一些 OpenMP 并行循环移植到 GCD 以在 iOS 上使用。我遇到了一个我不确定如何最好地建模的构造。
OpenMP 循环对共享状态块执行一些重要的操作,它为每个可能的 OpenMP 线程分配一个,然后在循环之后组合(实际上是减少)结果。像这样(简化):
const int max_threads = omp_get_max_threads();
state_block state[max_threads];
#pragma omp parallel for shared(state)
for(unsigned int i = 0; i < some_count; i++) {
// do some stuff
update_state(state[omp_get_thread_num()]);
}
merge_state_data(state, max_threads);
GCD 没有提供一种方法来了解可能的最大线程数是多少(是吗?)或您当前在哪个线程上,因此这种模式不起作用。状态块的大小很重要,并且迭代次数很大,因此为循环的每次迭代分配一个作为纯粹的最坏情况也是不合理的。
可以想象,我可以使用自定义调度源DISPATCH_SOURCE_TYPE_DATA_ADD
来进行状态更新,但如果我这样原子化它,将需要数千个源,这似乎是错误的。
有什么我缺少的东西,无论是 GCD 还是这里的设计?
谢谢。