Fenrier Lab

UDP 协议校验和计算

UDP 协议不具备差错恢复机制,但能通过校验和判断网络传输是否出现丢包。UDP 的校验和由三部分内容求和得到,分别是伪首部、首部以及数据报文,如下图所示 为了弄清楚这些字段究竟是什么东西,下面我们使用 wireshark 来抓取一个 UDP 包来详细分析。为了制造这个 UDP 包,使用如下代码来向某 ip 地址发送一段数据(这个 ip 不一定非得实际存在,我们只需要观察基于 UDP 协议封装的数据,所以只要能被 wireshark 获取就行) import java.io.IOException; import java.net.*; /** * Created by wangx on 2017/10/19. */ public class Client { p...
点我阅读更多...

Java 本地调用连接 Intel 数学核心库

纯 Java 语言实在算不上一种高性能的数值计算语言,当然抽象层次越高,效率一般越低,也没什么好抱怨的。如果有相当大的数值计算需求,那么我们可以将这部分代码用 C/C++ 来实现,再通过 Java 来调用,将能很好地提升 Java 程序的性能。 Intel@reg Math Kernel Library 是 Intel 公司开发的高性能数学函数库,作为例子,这里我们只讨论 BLAS 这块,其他部分根据说明文档和例子去操作就可以了。BLAS 全称是 Basic Linear Algebra Subprograms,即基本线性代数子程序,它本身只定义了三个层次的线性代数计算函数接口,其中 是向量与向量的计算,例如点积、向量求和等, 是矩阵与向量的计算,如矩阵向量乘法等, ...
点我阅读更多...

Java 本地调用(jni)编程基础

首先说明一下,根据经验来看,得益于高性能的 Java 虚拟机,使用纯 Java 实现的代码不一定就比 c 语言的慢。但是在大量的 c 语言库中还藏有不少珍宝,或许是没必要重复造轮子,或许是没有信心写出比那些经过多年考验的代码更健壮的程序,使用 Java 代码调用 C/C++ 仍然具有很高的价值。 一个 hello world 例子 本地方法的定义类似于接口函数,因为都还没实现嘛,不同的地方在于需要在返回值前面加上 native 关键字,例如下面的 Hello 类定义了 本地方法 say() //Hello.java public class Hello{ public native void say(String something); } 这段程序需要 c 语言实现,首先...
点我阅读更多...

AUTODYN 并行计算(单机)

使用多核 CPU 来加速 AUTODYN 计算是一个行之有效的方法,而且设置也相当简单,这里稍微记录一下。 首先是 MPI 路径,在安装 ANSYS 的时候就已经装上了 MPI,可以在 ANSYS 主目录下的 commonfiles 文件夹下找到 ,这里要做的是将其路径加入系统环境变量,在 cmd 中运行 mpirun 命令应该能出现一系列提示。 然后是编写脚本 ,在任一文件夹下创建 applfile 文件(无扩展名),加入一段参数 -e MPI_FLAGS=y0 -e ANSYS_EXD_MPI_TYPE=pcmpi -h machine1 -np 1 "G:\Program Files\ANSYS Inc\v162\aisol\AUTODYN\winx64\autodyn.e...
点我阅读更多...

C语言编译与 intel MKL 连接

C语言编译过程 一段c语言源码最终编译成可执行程序要经历多个阶段,包括预处理阶段、编译阶段、汇编阶段以及链接阶段。比如将 hello.c 代码编译成可执行文件将经历如下图所示的过程: //hello.c #include <stdio.h> int main() { printf("Hello world"); } 其中,预处理阶段将源程序使用符号 # 依赖的内容直接复制到代码中,并生成以 .i 为后缀的新文件。对应的 gcc 命令为 gcc -E hello.c -o hello.i 编译阶段将文本文件 hello.i 翻译成汇编语言程序 hello.s ,这也是一个文本文件,其中的内容是汇编代码。 gcc -S hello.i -o hello.s...
点我阅读更多...