OpenMP - 在并行for循环中调用外部函数

时间:2016-10-06 19:23:28

标签: c multithreading parallel-processing openmp

我使用OpenMP的经验很少。我尝试并行运行for循环,调用另一个外部函数。我正在用MinGW编译程序,所以不幸的是我没有得到任何错误,表明我做错了什么,当我尝试添加并行时程序根本就没有运行在我的循环外面。 findCombinations()是一个相当大的函数,它调用另一个函数本身。我想知道在这种情况下是否可以使用并行for循环?如果有的话,我有什么明显的错误吗?

#pragma omp parallel for
for(int j = 0; j < n[i].count; j++) { 
    int length = 0;
    while(n[i].neighbourhoods[j][length].index != -1) length++;
    bool used[length];
    memset(used, false, sizeof(used));
    findCombinations(&b, n[i].neighbourhoods[j], length, 0, 0, used, n[i].col);
    free(n[i].neighbourhoods[j]);
}

这是findCombinations()

int findCombinations(struct blocks *b, struct element neighbourhood[], int neighbourhoodSize, int start, int currLen, bool used[], int col) {    
    if (currLen == blocksize) {
        b->blocks[b->count].elements = malloc((blocksize+1) * sizeof(struct element)); 
        b->blocks[b->count].col = col;
        int blockCount = 0;
        for (int i = 0; i < neighbourhoodSize; i++) {
            if (used[i] == true) {
                b->blocks[b->count].elements[blockCount++] = neighbourhood[i];
            }
        }
        b->blocks[b->count].elements[blocksize] = neighbourhood[neighbourhoodSize]; //ensures the last item is -1
        b->blocks[b->count].signature = getSignature(b->blocks[b->count].elements);
        return 1;
    }
    if (start == neighbourhoodSize) {
        return 0;
    }
    int new = 0;

    used[start] = true;
    b->count += findCombinations(b, neighbourhood, neighbourhoodSize, start + 1, currLen + 1, used, col);

    used[start] = false;
    b->count += findCombinations(b, neighbourhood, neighbourhoodSize, start + 1, currLen, used, col);

    return new;
}

我认为问题可能是findCombinations()修改了我发送给它的指针,* b,可能导致竞争条件。我的问题是我不确定如何解决它。

1 个答案:

答案 0 :(得分:0)

使用其他库中的函数在OpenMP并行区域内是完全有效的,因为这些库提供了线程安全的例程,否则您可能会遇到无法控制的数据争用,因此,您只能在一段时间。

如果您不确定您的程序是否是线程安全的,您可以尝试使用Valgrind helgrind或GCC / LLVM thread sanitizer等工具。