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...
点我阅读更多...