有符号的 long long 可以用作 OpenMP 中的迭代变量吗?

标签 c openmp unsigned

我正在尝试测试这个程序的性能,之前我曾经使用 unsigned long long 因为我看到了这个例子,但现在我正在尝试并行化它,计数器必须被签名

但我不确定我的结果是否返回仅 1 的计数器,因为计数器的数据类型是有符号的 long long 而不是无符号的 long long。或者是否与 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 问题?

最佳答案

omp 并行 for 循环的迭代变量不是 counter,而是 i,其类型为 size_t,而不是 long long。您的问题是您在循环中将 counter 声明为私有(private),根据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 的值应该与进入循环之前相同,尽管我不知道这是一般行为还是特定于实现的行为。

关于有符号的 long long 可以用作 OpenMP 中的迭代变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24960793/

相关文章:

C - 函数读取(文件、缓冲区、要读取的字节)打破字符串

c++ - 'mpirun' 不被识别为内部或外部命令,

multithreading - 所有线程的 OpenMP 刷新和一致性

C 将无符号字符转换为十六进制

java - 如何在java中生成0到2^32-1之间的随机数

c++ - 如何在 C++ 中将负数写为无符号文字

c - C 中右移的奇怪行为(有时是算术,有时是逻辑)

C - 如何检查数字是整数还是 float ?

c++ - 最优雅的循环结构?

c - 如何使用 OpenMP 任务实现减少?