我试图在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操作。
是的,可以使用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::mt19937
rng之间的某些交互作用造成的。这不是推力能为你解决的。
推力也有随机数发生器,这些随机数发生器是为配合它而设计的。
我有一个奇怪的问题,我无法解决。它与助推推力代码有关。 法典: 此文件的名称为“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 的制作流程,这对普通用户来说都有一定的门槛。有