使用 OpenMP 处理单链表
Process singly linked list with OpenMP
我要并行化的代码具有以下简单形式:
for(const ListItem* item = myList; item; item = item->getNext())
doSthWith(item);
我在支持 omp 2.0 的 MSVC 2013 上编译。是否仍然有可能以一种干净高效的方式将其并行化?我偶然发现的第一个问题是我需要一个积分循环计数器。我显然可以只使用一个 int 并在循环内分配指针,但这已经让人感觉像是一种肮脏的解决方法。
像这样的迭代类型甚至支持我的 omp 标准,还是最终会出现在 UB 中?
也许不是真正的答案,但我无法在评论中格式化代码...
假设列表没有被修改,你可以写一些像这样有点不愉快的东西(在这里输入,没有编译,没有测试)。
#pragma omp parallel
{
int nThreads = omp_get_num_threads();
int me = omp_get_thread_num();
int itemNo = 0;
for(const ListItem* item = myList;
item;
(item = item->getNext()), itemNo++)
{
if (itemNo%nThreads == me)
{
doSthWith(item);
}
}
}
我要并行化的代码具有以下简单形式:
for(const ListItem* item = myList; item; item = item->getNext())
doSthWith(item);
我在支持 omp 2.0 的 MSVC 2013 上编译。是否仍然有可能以一种干净高效的方式将其并行化?我偶然发现的第一个问题是我需要一个积分循环计数器。我显然可以只使用一个 int 并在循环内分配指针,但这已经让人感觉像是一种肮脏的解决方法。 像这样的迭代类型甚至支持我的 omp 标准,还是最终会出现在 UB 中?
也许不是真正的答案,但我无法在评论中格式化代码...
假设列表没有被修改,你可以写一些像这样有点不愉快的东西(在这里输入,没有编译,没有测试)。
#pragma omp parallel
{
int nThreads = omp_get_num_threads();
int me = omp_get_thread_num();
int itemNo = 0;
for(const ListItem* item = myList;
item;
(item = item->getNext()), itemNo++)
{
if (itemNo%nThreads == me)
{
doSthWith(item);
}
}
}