一 OpenMP 教程 深入人剖析 OpenMP reduction 子句( 三 )


或||操作符#include <stdio.h>#include <omp.h>static int data = https://www.huyubaike.com/biancheng/100;int main() {#pragma omp parallel num_threads(2) reduction(||:data){printf("初始化值 : data = https://www.huyubaike.com/biancheng/%d tid = %d/n", data, omp_get_thread_num());if(omp_get_thread_num() == 0) {data = https://www.huyubaike.com/biancheng/0;}else if(omp_get_thread_num() == 1){data = 0;}}printf("在主函数当中 : data = https://www.huyubaike.com/biancheng/%d/n", data);return 0;}上面的程序输出结果如下所示:
初始化值 : data = https://www.huyubaike.com/biancheng/1 tid = 0初始化值 : data = 1 tid = 1在主函数当中 : data = 1从上面的结果看出 , 数据初始化的值是正确的,主函数当中得到的数据也是正确的,因为 100 || 0 || 0 == 1,这个也是 C 语言的条件或得到的结果 。
MIN 最小值#include <stdio.h>#include <omp.h>static int data = https://www.huyubaike.com/biancheng/1000;int main() {printf("Int 类型的最大值等于 %d\n", __INT32_MAX__);#pragma omp parallel num_threads(2) reduction(min:data){printf("data =https://www.huyubaike.com/t/t%d tid = %d/n", data, omp_get_thread_num());if(omp_get_thread_num() == 0) {data = https://www.huyubaike.com/biancheng/10;}else if(omp_get_thread_num() == 1){data = 20;}}printf("data = https://www.huyubaike.com/biancheng/%d/n", data);return 0;}上面的程序执行结果如下所示:
Int 类型的最大值等于2147483647data =https://www.huyubaike.com/biancheng/2147483647 tid = 0data =2147483647 tid = 1data = 10可以看出来初始化的值是正确的,当我们求最小值的时候,数据被正确的初始化成对应数据的最大值了 , 然后我们需要去比较这几个值的最小值,即 min(1000, 0, 20) == 10,因此在主函数当中的到的值等于 10 。
MAX 最大值#include <stdio.h>#include <omp.h>static int data = https://www.huyubaike.com/biancheng/1000;int main() {#pragma omp parallel num_threads(2) reduction(max:data){printf("data = https://www.huyubaike.com/biancheng/%d tid = %d/n", data, omp_get_thread_num());if(omp_get_thread_num() == 0) {data = https://www.huyubaike.com/biancheng/10;}else if(omp_get_thread_num() == 1){data = 20;}}printf("data = https://www.huyubaike.com/biancheng/%d/n", data);return 0;}上面的程序输出结果如下所示:
data = https://www.huyubaike.com/biancheng/-2147483648 tid = 0data = -2147483648 tid = 1data = 1000可以看出程序被正确的初始化成最小值了,主函数当中输出的数据应该等于 max(1000, 10, 20) 因此也满足条件 。
& 按位与#include <stdio.h>#include <omp.h>static int data = https://www.huyubaike.com/biancheng/15;int main() {#pragma omp parallel num_threads(2) reduction(&:data){printf("data = https://www.huyubaike.com/biancheng/%d tid = %d/n", data, omp_get_thread_num());if(omp_get_thread_num() == 0) {data = https://www.huyubaike.com/biancheng/8;}else if(omp_get_thread_num() == 1){data = 12;}}printf("data = https://www.huyubaike.com/biancheng/%d/n", data);return 0;}上面的程序输出结果如下:
data = https://www.huyubaike.com/biancheng/-1 tid = 0data = -1 tid = 1data = 8首先我们需要知道上面几个数据的比特位表示:
-1 = 1111_1111_1111_1111_1111_1111_1111_11118= 0000_0000_0000_0000_0000_0000_0000_100012 = 0000_0000_0000_0000_0000_0000_0000_110015 = 0000_0000_0000_0000_0000_0000_0000_1111我们知道当我们使用 & 操作符的时候初始值是比特为全部等于 1 的数据,也就是 -1,最终进行按位与操作的数据为 15、8、12 , 即在主函数当中输出的结果等于(8 & 12 & 15) == 8,因为只有第四个比特位全部为 1,因此最终的结果等于 8。
|按位或#include <stdio.h>#include <omp.h>static int data = https://www.huyubaike.com/biancheng/1;int main() {#pragma omp parallel num_threads(2) reduction(|:data){printf("data = https://www.huyubaike.com/biancheng/%d tid = %d/n", data, omp_get_thread_num());if(omp_get_thread_num() == 0) {data = https://www.huyubaike.com/biancheng/8;}else if(omp_get_thread_num() == 1){data = 12;}}printf("data = https://www.huyubaike.com/biancheng/%d/n", data);return 0;}上面的程序输出结果如下所示:
data = https://www.huyubaike.com/biancheng/0 tid = 0data = 0 tid = 1data = 13我们还是需要了解一下上面的数据的比特位表示:
0= 0000_0000_0000_0000_0000_0000_0000_00001= 0000_0000_0000_0000_0000_0000_0000_00018= 0000_0000_0000_0000_0000_0000_0000_100012 = 0000_0000_0000_0000_0000_0000_0000_110013 = 0000_0000_0000_0000_0000_0000_0000_1101线程初始化的数据等于 0 ,这个和前面谈到的所有的比特位都设置成 0 是一致的,我们对上面的数据进行或操作之后得到的结果和对应的按位或得到的结果是相符的 。

推荐阅读