Julia个人流程演示代码
本文为我的个人经验分享视频Julia高性能代码入门流程相应的代码。
除了官方文档的性能建议必须知道的以外,总的来说有几个套路:
- 参数分类。
- 物理常数直接默认全局变量,并声明
const
类型。Julia编译成静态语言的时候就不会害怕有别的程序会改动它,从而大幅提升性能。 - 利用
struct
来打包机器参数,节省开发时间;
- 物理常数直接默认全局变量,并声明
- 数组预先分配其在内存中的大小;
- 做好缓存。利用多重分派,避免循环和矢量化操作的重复计算问题。
- 做好多线程。这个是提升最大的。
- 一个提醒。通常来说,数组
for
循环第一个index
放最里面——因为它改动最频繁,而数组访问第一个index
最快。但实际上,谁放外面谁放里面需要具体问题具体分析。只按照性能建议中的将第一个index放最内层未必最快。
数据生成
using BSON: @savezvec = randn(10000)*0.12
δvec = randn(10000)*1.06e-3@save "zvec_δvec.bson" zvec δvec
MATLAB代码
data = readtable("data.csv");
zvec = table2array(data(1:end, 1));
deltavec = table2array(data(1:end, 2));%%restenergy = 0.511e6;
clight = 3e8;nturns = 10001;
nparticle = length(zvec);v1 = 3.6395053705870048e+06;
v2 = 655751.6971214055228756;
r = v2/v1;
phi_s = 2.1575815005097385;
phi_2s = 6.0620746573056303;
h1 = 756;
h = 3;
circum = 1360.4;
centerenergy = 6e9;
alpha_c = 0.0000156;%% 10000个粒子相空间坐标,不保存历史tic;for i = 1:nturnsdeltavec = deltavec + v1/centerenergy * (sin(phi_s - 2 * h1 * pi / circum .* zvec) - sin(phi_s) + r * sin(phi_2s - 2 * h1 * h * pi / circum .* zvec) - r * sin(phi_2s));etavec = alpha_c - 1./(centerenergy/restenergy .* (1 + deltavec)).^2;zvec = zvec - circum .* etavec .* deltavec;
endtoc% %%
%
% tic;
%
% k1 = 2 * h1 * pi / circum;
% k2 = 2 * h1 * h * pi / circum;
% gamma = centerenergy/restenergy;
% c1 = v1 / centerenergy;
% c2 = sin(phi_s) + r * sin(phi_2s);
% c3 = 1/gamma^2;
%
% parfor j = 1:nparticle
% for i = 1:nturns
% deltavec(j) = deltavec(j) + c1 * (sin(phi_s - k1 * zvec(j)) + r * sin(phi_2s - k2 * zvec(j)) - c2);
% eta = alpha_c - c3/(1 + deltavec(j))^2;
% zvec(j) = zvec(j) - circum * eta * deltavec(j);
% end
% end% toc%% 更新10000个粒子相空间坐标,同时保存历史tic;zmat = zeros(nparticle, nturns);
delta_mat = zeros(nparticle, nturns);
for i = 1:nturnsdeltavec = deltavec + v1/centerenergy * (sin(phi_s - 2 * h1 * pi / circum .* zvec) - sin(phi_s) + r * sin(phi_2s - 2 * h1 * h * pi / circum .* zvec) - r * sin(phi_2s));etavec = alpha_c - 1./(centerenergy/restenergy .* (1 + deltavec)).^2;zvec = zvec - circum .* etavec .* deltavec;zmat(1:end, i) = zvec;delta_mat(1:end, i) = deltavec;
endtoc
Julia代码
using BSON: @load@load "zvec_δvec.bson" zvec δvec# 物理常数
const restenergy = 0.511e6
const clight = 3e8# 计算参数
nturns = 10001# 机器参数
struct Par# 这些参数要提前准备v1::Float64v2::Float64ϕs::Float64ϕ2s::Float64h1::Int64h::Int64circum::Float64centerenergy::Float64αc::Float64# 这些参数会自动计算r::Float64
end
function Par(v1, v2, ϕs, ϕ2s, h1, h, circum, centerenergy, αc)Par(v1, v2, ϕs, ϕ2s, h1, h, circum, centerenergy, αc, v2/v1)
endfunction _revolution_cache(p::Par)c1 = p.v1/p.centerenergyc2 = sin(p.ϕs) + p.r * sin(p.ϕ2s)c3 = 1/(p.centerenergy/restenergy)^2k1 = 2*p.h1*pi/p.circumk2 = 2*p.h1*p.h*pi/p.circum(; c1, c2, c3, k1, k2)
endfunction revolution_with_cache(z::Number, δ::Number, p::Par, c)δ = δ + c.c1 * (sin(p.ϕs - c.k1 * z) + p.r * sin(p.ϕ2s - c.k2 * z) - c.c2)η = p.αc - c.c3/(1+δ)^2z = z - p.circum * η * δz, δ
endfunction revolution_multithreads!(zvec::Vector, δvec::Vector, nturns::Int64, p::Par)c = _revolution_cache(p)nparticles = length(zvec)@sync @inbounds for i=1:nparticlesThreads.@spawn beginz, δ = zvec[i], δvec[i]@inbounds for j=1:nturnsz, δ = revolution_with_cache(z, δ, p, c)endzvec[i], δvec[i] = z, δendendzvec, δvec
endfunction revolution_singlethread!(zvec::Vector, δvec::Vector, nturns::Int64, p::Par)c = _revolution_cache(p)nparticles = length(zvec)@inbounds for j=1:nturns@inbounds @simd for i=1:nparticleszvec[i], δvec[i] = revolution_with_cache(zvec[i], δvec[i], p, c)endendzvec, δvec
endfunction revolution_history_1(zvec::Vector, δvec::Vector, nturns::Int64, p::Par)c = _revolution_cache(p)nparticles = length(zvec)zmat = zeros(eltype(zvec), nturns, nparticles)δmat = zeros(eltype(zvec), nturns, nparticles)@sync @inbounds for i=1:nparticlesThreads.@spawn beginz, δ = zvec[i], δvec[i]@inbounds for j=1:nturnsz, δ = revolution_with_cache(z, δ, p, c)zmat[j, i], δmat[j, i] = z, δendendendzmat, δmat
endfunction revolution_history_2(zvec::Vector, δvec::Vector, nturns::Int64, p::Par)c = _revolution_cache(p)nparticles = length(zvec)# 数组内存预分配zmat = zeros(eltype(zvec), nparticles, nturns)δmat = zeros(eltype(zvec), nparticles, nturns)ηvec = zeros(eltype(zvec), nparticles)tmpzvec, tmpδvec = zvec[:], δvec[:]@inbounds for i = 1:nturnstmpδvec .= tmpδvec .+ c.c1 .* (sin.(p.ϕs .- c.k1 .* tmpzvec) .+ p.r .* sin.(p.ϕ2s .- c.k2 .* tmpzvec) .- c.c2)ηvec .= p.αc .- c.c3 ./ (1 .+ tmpδvec) .^ 2tmpzvec .= tmpzvec .- p.circum .* ηvec .* tmpδveczmat[:, i] = tmpzvecδmat[:, i] = tmpδvecendzmat, δmat
endp = Par(3.6395053705870048e+06, 655751.6971214055228756, 2.1575815005097385, 6.0620746573056303, 756, 3, 1360.4, 6e9, 1.56e-5)
Julia个人流程演示代码相关推荐
- 【MM小贴士】从 purchase 到 payment 全流程演示
作为MM顾问,采购订单基本都会操作的.但是作为MM顾问,不能只懂MM,采购业务作为供应链体系当中的重要一环,我们要承接财务的应付账款,采购对账,预付账款等诸多环节.如果对这些业务不理解,或者没有实际操 ...
- OpenCV演示代码以查找图像中的轮廓(附完整代码)
OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 #include "opencv2/imgcodecs.hpp&quo ...
- OpenCV霍夫变换的演示代码(附完整代码)
OpenCV霍夫变换的演示代码 OpenCV霍夫变换的演示代码 OpenCV霍夫变换的演示代码 #include "opencv2/imgcodecs.hpp" #include ...
- 【Go API 开发实战 3】API 流程和代码结构
API 流程和代码结构 为了使读者在开始实战之前对 API 开发有个整体的了解,这里选择了两个流程来介绍: HTTP API 服务器启动流程 HTTP 请求处理流程 本小节也提前给出了程序代码结构图, ...
- php做一个微信退款,PHP实现微信申请退款流程实例代码
前面讲了怎么实现微信支付,详见博文:php实现微信支付(jsapi支付)流程 和ThinkPHP中实现微信支付(jsapi支付)流程.由于业务需求,还需要有微信退款,经过研究和摸索,也终于搞定了. ...
- 一个SPS + K2 + InfoPath + Mobile + Exchange的工作流程演示系统
前两个星期,投身在一个为客户做的工作流程演示项目中.项目的目标是在短时间内,演示构建一个能够体现移动设备优势的工作流系统. 项目中使用了SharePoint Portal Server 2003作为整 ...
- 十大经典排序算法(动态演示+代码)
时间复杂度是指程序执行函数或方法的效率常用大写的O表示,比如执行一个循环我们记做O(n),执行一个加法运算或者执行一个if操作我们记为O(1). 时间.空间复杂度比较 1 冒泡排序 算法思想: ...
- java安卓图片全屏_在Android中全屏显示GIF图片(演示代码)
[实例简介] 在Android中全屏显示GIF图片(演示代码),详细内容请参考:http://blog.csdn.net/u012939909/article/details/77418173 [实例 ...
- python scrapy 基本操作演示代码
python scrapy 基本操作演示代码 # -*- coding: utf-8 -*- import scrapy # from quotetutorial.items import Quote ...
最新文章
- 算法系列之二十:计算中国农历(二)
- py2与py3的区别
- 英特尔紧急召回SB主板,Intel 6系列芯片组设计缺陷
- 【完整示例】采用jenkins pipeline实现自动构建并部署至k8s
- 初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- [Java2入门经典]第9章 访问文件和目录
- 海淀区第九届单片机竞赛获奖名单_第十二届程序设计竞赛暨ACM选拔赛获奖名单...
- LeetCode Two Sum
- c语言学习-猜数字游戏
- 安装过MongoDB(4版本)重新安装时出现错误Verify that you have sufficient privileges to start system services如何解决
- 酷狗、QQ音乐歌词转换工具
- 立创开源 | 恒温加热台
- B. Disturbed People(模拟) Codeforces Round #521 (Div. 3)
- pptpd mysql_pptpd+freeradius+mysql安装步骤
- 腾讯抖音搬运视频如何消重
- pygame-KidsCanCode系列jumpy-part14-背景音乐及音效
- 将数据库中的数据转换成json格式
- 解决Waiting for incoming connection with ide key xdebug错误
- oracle数据库description,DESCRIPTION=(ADDRESSOracle12c环境下的EM配置和使用方法