可以在OpenMP中将签名的long long用作iteratorion变量吗?

时间:2014-07-25 16:59:49

标签: c openmp unsigned

我试图测试这个程序的性能,之前我曾经有过unsigned long long,因为我把它看作一个例子,但是现在我试图并行化它,计数器必须签名

但我不确定我的结果是否只返回1的计数器,因为计数器的数据类型是长签名而非长签名。或者如果它与OpenMP与Xeon Phi有关。

在OpenMP tutorial website上,它说:“for中的迭代变量必须是有符号整数变量类型。在OpenMP 3.0中,它也可以是无符号整数变量类型,指针类型或常量随机访问迭代器类型。“

[...]
#include <sys/types.h>
#include <omp.h>

    [...]    
    size_t i, j;
    signed long long counter = 0;
    [...]
    if((ch1 ^ ch2) == 0)
    {
        counter = 1;
    }

    #pragma omp parallel for private(counter)
    for(i = 1; i < smallest; i++)
    {
        ch1 = getc(fp1); 
        ch2 = getc(fp2);

        if((ch1 ^ ch2) == 0)
        {
            counter++;
        }
    }
    [...]

http://pastebin.com/ESU1yXYT

处的完整代码

我是否必须投射一些数据类型才能找到百分比?或者它可能只是一个OpenMP问题?

1 个答案:

答案 0 :(得分:1)

omp并行for循环的迭代变量不是counter,它是i,其类型为size_t,不长。您的问题是您在循环中将counter声明为私有,根据here,这意味着为每个线程创建了一个新的计数器对象,并且所有对原始对象的引用都被新的替换。在您退出for循环后,我不确定counter的确切行为是什么,但它绝对不是您正在寻找的内容。你可能想做一些像减少

的事情
#pragma omp parallel for reduction(+:counter)
for(i = 1; i < smallest; i++)
{
    ch1 = getc(fp1); 
    ch2 = getc(fp2);

    if((ch1 ^ ch2) == 0)
    {
        counter += 1;
    }
}

修改

根据Microsoft,并行for循环后counter的值应该与进入循环之前的值相同,但我不知道这是一般的还是特定于实现的行为。