0%

当前并没有充分支持Fortran+MPI的现代IDE,但借助vscode的灵活性(a.k.a. 简陋)还是可以获得比较好的Fortran开发体验的。

安装插件

upload successful

这里推荐使用FORTRAN IntelliSenseModern Fortran两个插件,前者主要能够提供查看定义的功能,后者主要提供调试和代码补全的功能。FORTRAN IntelliSense还需要一个外部的Fortran Language Server,用pip就可以很轻松的安装上。

1
pip install fortran-language-server

配置插件

upload successful

打开File->Preferences->Settings,搜索Fortran,需要配置的地方通常有Fortran: Gfortran Executable,这里可以输入编译器的路径或者名字。比如我使用的是PGI编译器,就填入pgfortran即可。也可以在这个设置里修改Include Paths

配置编译Tasks

upload successful

阅读全文 »

CPU端序

sw26010和x86一样都是小端序。测试程序如下,输出均为1

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int is_little_endian() {
short s = 0x0110;
char *p = (char *) &s;
return (p[0] == 0x10);
}

int main() {
printf("%d\n", is_little_endian() );
return 0;
}

编译相关

输出头文件路径

1
2
echo | sw5cc -host -E -Wp,-v -
echo | sw5cc -slave -E -Wp,-v -

关键的头文件路径

  • /usr/sw-mpp/swcc/lib/gcc-lib/sw_64-swcc-linux/5.421-sw-500/include 包含SIMDDMA相关函数
  • /usr/sw-mpp/swcc/sw5gcc-binary/include 包含LDMFFTAthread相关函数

调试相关

作业系统

阅读全文 »

Digital Image Processing的处理经常需要密集的计算,效率低的代码处理一张500x500的图片都可以计算30秒。为了方便调参同时身为超算比赛参赛者,职业病犯了,写一个速度快的代码是很有必要的。本文的code和benchmark来自我写的DIP实验报告。

Convolution / Correlation

卷积 (Convolution)是DIP和CNN常用的一种操作,而Correlation是一种和卷积差不多的操作,把卷积核转置两下做卷积就是Correlation。Correlation在DIP可以用来做模糊和边缘检测。下面我给大家表演徒手写向量化Correlation。

常规思路

upload successful

假设padImgArr输入的图片,mask就是类似卷积核的一个东西(mask转置两下做Correlation就是Convolution)。正常思路当然是两层for循环,遍历图片的每一个像素,然后取像素临近的点,和mask来一发点乘。菜一点的人会再来两层for循环,去逐个计算像素值乘mask值的结果,稍微觉得有点不对劲的人,很容易想到对padImgArr切片做点乘再求和,这种想法的代码实现如下。

1
2
3
4
5
6
7
8
9
10
function outImgArr = correlation2(padImgArr, mask)
imgSize = size( padImgArr );
outImgArr = zeros( imgSize );
H = imgSize(1); W = imgSize(2);
for i = 2:H-1
for j = 2:W-1
outImgArr(i, j) = sum( padImgArr( i-1:i+1, j-1:j+1 ).*mask, "all" );
end
end
end

优化方法

如果你是一个对解释型语言的循环有PTSD的人,很快你会开始考虑如何减少循环次数。

upload successful

阅读全文 »

为了迎接即将来临的本博客成功活过一周内的大喜日子,我决定全面魔改博客以表示庆祝。这一次魔改博客主要的目标是提升浏览体验,切入点是链路质量和美化博客。

接入CDN

博客当前扔在白嫖来的腾讯云香港VPS上,不过这个博客都是用Docker打包好的,随时可以跑路。腾讯云香港的链路质量一言难尽,好的时候是真的好,烂的时候是真的烂,基本上和4G上网和4G回落2G上网的体验差不多。香港CN2应该早就被广大劳动人民玩坏了。另外比较坑的一点是有传言腾讯云会干扰SSL,本站顺手使用极为先进的HTTPS沦为极为卡顿的原因之一。所以找了一阵子免备案免信用卡按量计费的CDN,CloudFlare就不说了还不如不用,CloudCone的表现和不挂CDN差不多(主观感受),现在用的UDomain的China Routing CDN,在CN2卡得不能自理的时候,还可以提供不错的体验。

主题美化

之前用的主题是Terminal魔改版,说实话我挺喜欢这个主题的风格的,美中不足的就是缺功能,没有目录等常见功能。所以最后选择了完成度很高的烂大街的NexT.Gemini,为了避免博客主题Hash碰撞,不被一眼就看出来是什么大路货主题,决定魔改这个主题,并且继承Terminal的设计风格,复制粘贴CSS。另外还参考了这学期写作业用的Typora主题typora-markdown-resume

下面是一部分对该主题的调整内容

  • 强制文章标题使用h1标签
  • 添加utterances评论模块
  • 调整版权声明的颜色
  • 调整正文的字间距,粗细,大小,字体,颜色
  • 调整导航菜单的边距
  • 调整导航菜单字体粗细,大小,颜色
  • 调整导航栏的背景颜色
  • 调整标题字体的粗细
  • 修改h2标签的风格
  • 使用圆角矩形,添加阴影
  • 调整正文页的最大宽度,页边距
  • 调整圆角矩形间距
  • 调整页面和正文的背景颜色

最后,看起来很像Terminal主题和typora-markdown-resume主题的NexT.Gemini Remix主题就这么诞生了。

总结

这波操作给博客带来了一堆功能更新和界面优化(特别是移动端),包括但不限于

阅读全文 »

年少无知的我第一次看到酷炫的DHTMLX框架,便决定用DHTMLX写一发前端(第一次写前端),最后Chrome调试工具熟练度显著增加(?)

问题

只要用上了DHTMLXWindow组件,不管是跟DHX Suite的其他组件组合,还是跟DHX家的其他库组合,都能出现各种各样的问题,其中最为常见的问题就是本来应该浮于组件上方的组件反而衬于组件的下方。

解决方案

先介绍几个神奇的API

1
2
dhxWindow._handlers.setActive(); // 激活Window窗口
form.getItem("component-id")._popup._popup.classList.add("dhx_popup--window_active"); // 激活组件窗口

我遇到的第一种问题,新建的窗口未被正确激活,显示在旧窗口下方,这个时候可以这么写

1
2
3
4
setTimeout(() => {
dhxWindow.show();
dhxWindow._handlers.setActive();
}, 100);

这里延迟100ms启动是因为,这个bug偶尔会出现在点击按钮创建窗口的时候,等待100ms其实是等待用户释放鼠标。

我遇到的第二种问题是,WindowFormDatepicker,在同时有多个Window的情况下,Datepicker的日历出现在Window下方(能100%复现的bug),这个时候只要”激活”Datepicker的日历就好了。比如

阅读全文 »

当前网上有很多给Hexo NexT主题添加Utterances评论系统的教程,但是这些实现并没有充分利用Hexo的特性,所以我参考了其他评论模块的代码,将Utterances模块插入到文章中。

过程

创建utterances.swig

layout/_third-party/comments里创建utterances.swig,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{%- if page.comments %}
<script>
NexT.utils.loadComments(document.querySelector('#utterances-container'), () => {
// if (typeof parcelRequire === 'function') { return; }
var js = document.createElement('script');
js.type = 'text/javascript';
js.src = 'https://utteranc.es/client.js';
js.async = true;
js.crossorigin = 'anonymous';
js.setAttribute('repo', '{{ theme.utterances.repo }}');
js.setAttribute('issue-term', '{{ theme.utterances.issue_term }}');
js.setAttribute('theme', '{{ theme.utterances.theme }}');
document.getElementById('utterances-container').appendChild(js);
});
</script>
{%- endif %}

创建utterances.js

scripts/filters/comment下创建utterances.js,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* global hexo */

'use strict';

const path = require('path');

// Add comment
hexo.extend.filter.register('theme_inject', injects => {
let theme = hexo.theme.config;
if (!theme.utterances.enable) return;

injects.comment.raw('utterances', '<div class="comments" id="utterances-container"></div>', {}, {cache: true});

injects.bodyEnd.file('utterances', path.join(hexo.theme_dir, 'layout/_third-party/comments/utterances.swig'));

});

修改主题配置文件

在主题配置文件中添加

阅读全文 »

Day2 NVIDIA DLI 加速计算基础 —— CUDA C/C++

Systems Management Interface

命令查询有关此 GPU 的信息

1
nvidia-smi

Writing Application Code for the GPU

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CPUFunction()
{
printf("This function is defined to run on the CPU.\n");
}

__global__ void GPUFunction()
{
printf("This function is defined to run on the GPU.\n");
}

int main()
{
CPUFunction();

GPUFunction<<<1, 1>>>();
cudaDeviceSynchronize();
}
  • __global__ void GPUFunction()
    • 使用__global__关键字定义的函数需要返回 void 类型
  • GPUFunction<<<1, 1>>>()
    • 使用 <<< … >>> 语法提供执行配置
    • 通过执行配置指定线程层次结构

Compiling and Running Accelerated CUDA Code

1
nvcc -arch=sm_70 -o hello-gpu 01-hello/01-hello-gpu.cu -run
阅读全文 »

Hexo Pug 主题修改 非典型教程

为了庆祝2020年的到来和大二上学期的结束,(其实是越来越觉得博客太丑了),我决定对半岁大的博客痛下杀手全面改造。

这一次改造的目标是:

  • 提高可读性
  • 美化界面
  • 推广博客,以假装是dalao

1. 选择合适的主题

freemind

这是我之前用的主题freemind,并且在原来的主题上进行魔改,使得博客看起来更丑的同时降低了可读性

顺着终端风的思路,我找到了一个和终端有那么一丝丝关系的主题terminal

terminal

选择这个主题的理由很简单,可读性极佳,审美在线,把杂七杂八的东西扔进终端里,让页面的其他部分变得非常简洁

阅读全文 »

HP DL360e G8是一个买回来就嗡嗡嗡的服务器,我一开始以为服务器已经把噪音自动控制到最优,后来在网上冲浪的时候发现我错了。

无意间在Reddit上看到这么篇讨论

It’s a bit complicated with the e-Series because of the shitty RAID controller, but I’ll try to guide you to low rpm: (~21-23%)

  1. Check that none of the typical fan ramp up stuff applies (use original HP drives, no PCI-e cards)
  2. Make sure you set your BIOS to use the RAID controller (even if you don’t use the drives as a raid)
  3. Go into the smart storage thing when booting and setup your drives. If you don’t want to use RAID just create RAID0 configs for each single drive.
  4. Boot into the Service Pack, since the SPP has the necessary drivers the fans should spin down after a while to about 21-23% Alternative to 4: I also got them to spin down by installing the HP provided ESXi image which has the necessary drivers preinstalled. The fans spin down after about 1-2 minutes.

The reason for its weird behavior is the B120i RAID controller. It NEEDS to see it working via their proprietary drivers (hpvsa) to spin down the fans to their minimum. I couldn’t get them farther below 21-23% which was still too loud for office use IMO and too restricted for me (couldn’t get the fans to spin down running proxmox).

That all said, I’d recommend to ditch the server and sell it if you need a quiet server. They completed dropped the ball on the *e Gen8 servers. Just look into the official forums how they basically ignored their customers for years, promised firmware updates to fix the noise issues and then never delivered.

简而言之就是服务器的RAID卡,和PCI-E插槽上的东西会控制服务器风扇的转速。不信的话你可以先在BIOS设置里把SATA控制器从AHCI改成RAID以激活RAID卡,并启动HPE提供的SPP光盘上的系统,就可以观察到风扇转速从降到21%~23%。

这么操作后,我的服务器风扇转速从33%降到了左半侧18~23%,右半侧27%。我一开始以为右半侧插的那张声卡不碍事,把声卡拔掉以后右半侧风扇转速也降到了18~23%。

这意味着降低噪音需要激活RAID卡并且正确安装hpvsaRAID卡驱动,才能让服务器安静下来。md真是个智障的设计。

我的硬盘呢?

阅读全文 »