当前位置: 首页 > 知识库问答 >
问题:

开MP码的推力等价

牧信厚
2023-03-14

我试图在open mp中并行化的代码是一个Monte Carlo代码,它可以归结为以下内容:

int seed = 0;
std::mt19937 rng(seed); 
double result = 0.0;
int N = 1000;

#pragma omp parallel for
for(i=0; x < N; i++)
{
    result += rng()
}
std::cout << result << std::endl;

我想确保随机数生成器的状态是跨线程共享的,并且对结果的添加是原子的。

有没有办法用strust::omp中的东西替换这个代码。从我到目前为止所做的研究来看,strust::omp更多地是一个指令,用于使用多个CPU线程,而不是GPU进行一些标准的strust操作。

共有1个答案

向嘉誉
2023-03-14

是的,可以使用Strust做类似的事情,在主机CPU上使用Strust OMP后端下的OMP线程(并行)执行。这里有一个例子:

$ cat t535.cpp
#include <random>
#include <iostream>
#include <thrust/system/omp/execution_policy.h>
#include <thrust/system/omp/vector.h>
#include <thrust/reduce.h>

int main(int argc, char *argv[]){
  unsigned N = 1;
  int seed = 0;
  if (argc > 1)  N = atoi(argv[1]);
  if (argc > 2)  seed = atoi(argv[2]);
  std::mt19937 rng(seed);
  unsigned long result = 0;

  thrust::omp::vector<unsigned long> vec(N);
  thrust::generate(thrust::omp::par, vec.begin(), vec.end(), rng);
  result = thrust::reduce(thrust::omp::par, vec.begin(), vec.end());
  std::cout << result << std::endl;
  return 0;
}
$ g++ -std=c++11 -O2 -I/usr/local/cuda/include -o t535 t535.cpp -fopenmp -lgomp
$ time ./t535 100000000
214746750809749347

real    0m0.700s
user    0m2.108s
sys     0m0.600s
$

在这个测试中,我使用了Fedora 20和CUDA6.5RC,运行在4核至强CPU上(基于time结果得到了大约3倍的加速比)。对于这个特定的代码,可能还可以进行一些进一步的“优化”,但我认为它们会不必要地混淆这个概念,并且我假设您的实际应用程序比仅仅对随机数求和要复杂得多。

我在这里展示的大部分内容都是从Strust direct system access页面中提取出来的,但是有几种类似的方法可以访问OMP后端,这取决于您是希望拥有一个灵活的、可重定向的代码,还是希望有一个专门使用OMP后端的代码(这一个专门针对OMP后端)。

推力::还原操作保证了你要寻找的“原子性”。具体地说,它保证两个线程不会同时尝试更新单个位置。但是,在多线程OMP应用程序中使用std::mt19937不在我的回答范围之内。如果我使用您提供的代码创建一个普通的OMP应用程序,我会观察到结果的可变性,这是由于(我认为)在多个OMP线程中使用std::mt19937rng之间的某些交互作用造成的。这不是推力能为你解决的。

推力也有随机数发生器,这些随机数发生器是为配合它而设计的。

 类似资料:
  • 我有一个奇怪的问题,我无法解决。它与助推推力代码有关。 法典: 此文件的名称为“myFirstMatrixTest.cu”。 所以,我有编译器错误: MSB3721退出命令" " C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v 9.2 \ bin \ nvcc . exe "-gen code = arch = compute

  •   mp-blog 是一个基于Node.js的博客系统. 本博客没有使用数据库,而是纯文本保存数据,使用github托管.编辑器使用Markdown. 安装依赖 npm insall 启动博客 npm start 随后,在/markdown目录放置.md文件,刷新页面,就能看到新编写的文章了,当然文章头部格式需要按照定义的编写,复制一份,修改对应的地方就行. 其中资源目录/public放置到了al

  • mp-html 一个强大的小程序富文本组件 功能介绍 支持在多个主流的小程序平台和 uni-app 中使用 支持丰富的标签(包括 table、video、svg 等) 支持丰富的事件效果(自动预览图片、链接处理等) 支持设置占位图(加载中、出错时、预览时) 支持锚点跳转、长按复制等丰富功能 支持大部分 html 实体 丰富的插件(关键词搜索、内容 编辑 等) 效率高、容错性强且轻量化(≈25KB,

  • Xtreme Media Player是一个免费开源的跨平台多媒体播放器。支持的媒体格式包括:mpeg audio (mp3), ogg vorbis, flac, speex, wav, aiff (aifc, aif), au (snd). 支持的播放列表格式包括:xspf, m3u 和 pls 。

  • mp-unpack是一个微信小程序反编译客户端 功能特点 基于electron-vue开发,可以打包为mac、Windows、Linux的安装包。 使用方法 ①通过release安装使用 1.下载release包安装后启动软件 2.将文件拖入工具内的上传区域或者选择准备好的wxapkg包 3.点击解包、在下方日志区查看解包执行过程,等待解包完成 4.解包成功之后点击日志下方的下载按钮即可下载解包后

  • mp-Math,微信公众号公式编辑插件,为微信公众号原生编辑器提供公式编辑功能。 想要在微信公众号的编辑器里输入公式吗?来试试我们的 Chrome 插件吧~ 相信不少人有在微信公众号上输入数学公式的需求,而微信至今没有推出官方的公式编辑器。有人被迫去选择一些新的工作流程,比如我在文章《一道从初中做到大学的数学题》中采用了 TEX→ PDF → SVG 的制作流程,这对普通用户来说都有一定的门槛。有