我试图测试这个程序的性能,之前我曾经有过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++;
}
}
[...]
处的完整代码
我是否必须投射一些数据类型才能找到百分比?或者它可能只是一个OpenMP问题?
答案 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
的值应该与进入循环之前的值相同,但我不知道这是一般的还是特定于实现的行为。