关于并行计算的一些试用

最近尝试了几种并行计算的方法。

1、openMP。这应该是gnu本身自带的一个插件,编译选项只需要加上 -fomp就可以了。使用时在for循环或者需要并行的语句前加上预处理选项。#pragma omp parallel等等,有若干种,整体思路就是把一些无关的函数并行计算。注意,一定是无关的,如果有先后关系的,可能计算结果就有问题了。这个用起来很简单,尤其是for循环等,加速很明显,可以加速到cpu核数倍。

2、TBB。线程构建模块。这个是intel的库,可以让任务并行。不过需要修改代码,从task等扩展出来,以便被TBB管理调用。当然,TBB还有一些存储管理的功能,亲测也可以提速20%以上。但是需要改类的代码,改动不大。加速效果如何没有具体实验。

3、MPI。或MPICH。看官宣,这个已经被用在太湖之光的超算上了。也是个开源库,编译安装都很简单。唯一对已有代码不友好的就是需要把原线程的数据发送到另外的线程,以便加速计算。计算完之后,还要把结果拷贝回来。不过拷贝函数之类的,MPI有现成的函数可以用,用法也还算简单。不过就试用来看,线程和计算函数属于强绑定关系,如果想动态调整函数与线程的绑定关系,很难。就是说如果计算量不是很大的话很容易浪费计算资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
删除加密文件 remove(encryptedFile.c_str()); // 检查配置文件是否已经过期 if (checkExpiration(configFile)) { cerr << "Trial period has expired." << endl; flock(lockFile, LOCK_UN); close(lock好的,下面是OpenMP并行奇偶排序的程序: ```c #include <stdio.h> #include <omp.h> File); return false; } // 获取当前时间 time_t now = time(NULL); // 计算截止void odd_even_sort(int *arr, int n) { #pragma omp parallel { int phase, i, tmp; for (phase = 0; phase < n; phase++) { if (phase % 2 == 0) { #pragma omp for for (i = 1; i < n; i += 2) { if (arr[i - 1日期 struct tm expDateTm; localtime_r(&now, &expDateTm); expDateTm.tm_mday += TRIAL_PERIOD; mktime(&expDateTm); char expDateStr[11]; strftime(expDateStr, sizeof] > arr[i]) { tmp = arr[i - 1]; arr[i - 1] = arr[i]; arr[i(expDateStr), "%Y-%m-%d", &expDateTm); // 写入截止日期到配置文件 if (!writeExpiration(configFile, expDateStr)) { cerr << "Failed to write expiration date to config file." << endl; ] = tmp; } } } else { #pragma omp for for (i = 1; i < n flock(lockFile, LOCK_UN); close(lockFile); return false; } // 解锁配置文件 flock - 1; i += 2) { if (arr[i] > arr[i + 1]) { tmp = arr[i(lockFile, LOCK_UN); close(lockFile); return true; } int main(int argc, char** argv) { // + 1]; arr[i + 1] = arr[i]; arr[i] = tmp; } } } } } } int main() { int arr[] = {4, 2, 5, 1, 3}; 生成随机密码 string password = generateRandomString(KEY_SIZE/8); // 限制试用期 if (! int n = sizeof(arr) / sizeof(int); odd_even_sort(arr, n); int i; for (i = limitTrialPeriod(CONFIG_FILE, password)) { return 1; } // 正常运行 cout << "Hello,0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; world!" << endl; return 0; } ``` 这个示例代码使用AES对称加密算法来加密} ``` 在这个程序中,我们使用了OpenMP的并行for指令和并行section指令,并使用奇和解密配置文件,加密后的文件保存在指定的文件中,解密后的文件会自动删除。偶排序算法进行排序。在奇数和偶数阶段分别进行排序,并使用OpenMP的并行for指令在程序运行期间,使用文件锁来锁定配置文件,以防止其他程序修改或删除该文件。程序会将每个循环并行化,使得每个线程处理自己负责的部分数据。 编译和运在启动时检查配置文件的截止日期,并在每次读取和修改配置文件时检查试用期是否行代码的命令如下: ```bash gcc -fopenmp odd_even_sort.c -o odd_even_sort export OMP已经过期,如果过期则返回0。在试用期结束后,程序会自动关闭。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值