文章16
标签10
分类5

cmh的期末大作业随想

cmh程序设计 期末大作业

概述

对n by n个三维格点进行积分,实际上是一个五层的循环,在第三层以后加上#pragma omp for collapse(3) reduction(+, sum)其实就有尚可的效率了。

注意到每个三维格点的数据只集中在以分布函数的截断长度r为半径,以对应三维空间的点为球心的球中,我们只需要对这一部分(或者是2r by 2r by 2r的一个盒子)的格点进行积分。这是一个很强的优化。

只考虑效率因素,不是很必要使用MPI。

困难

并行的设计本身不是难点,难点在于ScaLAPACK的使用。

可以参考的是一个Github项目:ScaLAPACK Example。名义上是C++项目,实际上除了输入输出外,几乎都是C代码。把他改成一个并行加速的对角化函数(C语言)留作练习(雾)。

ScaLAPACK函数相关的文档,我找到的最好的是IBM Parallel ESSL的文档,里面给出了详细的参数解释和样例。

Netlib的文档基本上约等于没有,文档写在注释里面,并且非常难读,我也没有找到示例。ScaLAPACK是一个Fortran 77库,类似函数的功能叫subroutine。Fortran的传参都是实参,对应C/C++都是指针,在函数内部就可以对传入参数进行修改。这一点在调用参数时需要注意。

先说这些,可能以后聊聊Fortran吧(不要让我真的写Fortran 77代码)。

(被正态了,悲)

天津游记

其实天津不是一个好的旅游城市,论文化的异域感不如哈尔滨,论旅游设施远不如苏杭,底子里还是一个典型的半殖民地半封建时代生长起来的北方海滨大都市,和青岛大连有些相似(但这俩是正经旅游城市,而且海比天津好看多了),甚至城市的天际线都有些分散,壮观不足。只因离北京近,才在这个五一为广大大学生所青睐。

然而,倘若真的在天津生活,想必又是一副别样光景。这个城市没有那么大的架子,地铁公交上不大见得到衣着一眼便知价格不菲的时装的职业女性;早上随意找一家早餐摊,吃一两样当地早餐,让碳水的幸福激励一天的努力,也是一件幸事。

我总是觉得,北京的文化中缺一条河,像上海的黄浦江,沈阳的浑河,天津的海河那样,穿起一座城市所有的喜怒哀乐。河边可以放声高歌一曲,可以约上三五伙伴聊天,小孩子沿着无边无际的河嬉戏奔跑,新婚情侣傍河拍下人生中定情的那一张婚纱照,而我们漫游在这条各种情感交汇的河边,吹着凉爽湿润的风,怡然自得。

移动互联网确实在影响我的注意力

在内心里,我一直自诩为传统互联网时代的残党(其实我是个内心戏很多的人),在互联网上获取信息还是尽可能多地依赖主动的检索和订阅,还有QQ群和贴吧等社群内的讨论。个人觉得还是很好地保持了自己的喜好不完全受自动化推荐算法支配吧。
今天打开QQ,偶然间扫到登录状态的小绿点,突然意识到自己的注意力从另一个角度被改变了。手机$7\times24$小时不离手之后,加入了各种学生组织之后,总是时不时地抬起手机收消息。明明从前QQ的在线状态都会设成“隐身”的,现在却要默认我随时能够应答消息,社交软件焦虑越来越严重了。
想来自动化推荐算法和即时通讯软件恰恰分别针对了两种人性的弱点:人会更想看到自己喜欢的东西、人是群居生物,有社交需求。只能说事物的出现都有必然性在里面

对于生活的困难,天气之子是比铃芽之旅更好的药

前一段时间看完铃芽之旅,技术上各方面(作画,超流畅3D转描,音乐,剧情张弛有度的节奏)都是近期商业剧场版动画的典范。但是看过之后感觉差点意思。想起天气之子,才发觉缺的味道在哪。

铃芽之旅的故事中,虽然也有灾难,但是还是洋溢着一种青春的活力,一种人与人之间的温暖,一种灾难之下掩盖不住的乐观。すずめ有着爱着他的家人,遇到灾难和亲友努力就可以解决,可以没有负担地爱上一个突然闯进生活的人。这固然很美好,但问题是这太美好了,以至于不真实。而天气之子,男女主的生长环境无疑是不健康的,并且灾难也没有结束(甚至可以说是放弃了结束灾难),但是在这灾难之中,却有两人互相支持。对于这两人来说,有这两人相互支持就够了。这样的设计,无疑更有剧情张力,也更得我心,足以抵过后期故事逻辑的一些问题(在看故事的时候,我是那种更注意感情而非逻辑的人)。

在生活中,铃芽之旅那种童话一般的故事几乎不可能发生在我的身上,但是像天气之子一样和我的家人,三五朋友一起,在风波中相互支持,受伤了相互舔舐伤口,这个是我们触手可及也最该去做的。

(更不动了)某冠以原神之名的程序课程杂记

序言

不玩原神老师是一位很负责,编程功底(从非科班的角度来看)也很强的老师。但是有一个问题:他太强了,从写代码时候敲键盘的速度就可见一斑。课后问老师助教问题的人很多,不敢问的则更多。于是有了写这个东西的想法,不敢说给老师作注,就当是我学习过程的杂记吧。这门课比我码力高强得多的人也大有人在,还请老师助教(如果他们看到了的话)和各位大佬多多批评指正。

Bash脚本

不谈这个,老师的幻灯片提供了很好的讲解。在此基础之上,没有必要系统学习bash,用到时候搜索就好。

From C to C++ (before C++11?)

why c++

  • 主流,网络资源较多,从c过渡相对容易
  • 性能比纯手写没有优化的Python组件高
  • 支持面向对象

drawbacks

  • 短时间掌握面向对象还是比较困难,并且面向对象对于很多计算任务来说包袱太重了
  • c++缺少好用的包管理,使用外部库比较繁琐

至于fortran,老东西爆金币吧

类与对象踩坑合集

不同于bash,c++面向对象部分边写边搜是十分耗费精力的,建议还是稍稍系统地学一下。下面仅提及一些比较重要的特性和比较隐蔽的问题。

如果要选课学c++,大部分人第一个会想到程设(程序设计实习)。这门课在屑课颇多的信科确实算是值得跨院系选的课,不过这门课迭代版本软设已经来了,会增加c++11以后的新特性训练(看了一眼他们的上机题,有比较多的分量是讲lambda表达式等特性的),不急的话等这门课成熟了也好。

构造函数、重载赋值与浅拷贝

当你的对象里分配了动态内存的时候,一个往往让初学者很头疼的问题是:我的赋值,复制相关的功能总是报错。是的,你遇到了臭名昭著的浅拷贝问题。

在没有定义复制构造函数,并且没有重载赋值运算符的时候,c++调用默认的会默认直接进行指针的赋值,而不会复制内存空间。因此,我们需要实现自己的赋值和复制构造函数。

不要以为不赋值就可以避开问题,c++在函数调用和返回时会自动调用复制构造函数,这是隐式的,很容易忽略,个人认为也是短短的几节课很难覆盖的问题。

class demo
{
    char *p;
    int size;
    public:
    demo(const demo &d)
    {
        p = new char[size];
        for(/* range */) // 赋值……
    }
    demo &operator=(const demo &d)
    {
        if (!p) delete[] p;
        p = new char[size];
        for(/* range */) // 赋值……
        return *this;
    }
};

这里,函数的调用和返回类型可以理解为一种约定俗成的规范,重载赋值这样写是为了保证demo对象的赋值和c++基本数据类型的赋值行为一致。

const限定符

举个例子

// 在上面的demo类里面补上成员函数len(),返回size的值。
int demo::len()
{
    return demo.size;
}
bool cmp(const demo &d1, const demo &d2)
{
    return d1.len() < d2.len()
}

这样会遇到问题!

test.cpp:32:13: error: 'this' argument to member function 'len' has type 'const demo', but function is not marked const
    cout << d1.len() < d2.len();
            ^~
test.cpp:25:9: note: 'len' declared here
    int len()
        ^

解决方法:

int demo::len() const
{
    return demo.size;
}

简单地加一个const就可以。

MPI编程记录

MPI传递结构体

如若写C/C++有一定封装的结构体(特别是结构体数组),在MPI中需要做一些处理。

  • 不要使用任何变长容器(vector, stack, std::string),因为在定义MPI结构体时每个数据的大小需要确定;请使用C数组(type_t[])。
  • 对于传递类,我的习惯是先定义一个结构体,仅包含类内的所有数据,内部不含任何变长容器,然后按照传结构体的方式传递。创建一个结构体数组,储存原来对象容器的所有内容,然后传递这个结构体数组。

示例代码:

// tbd

资料卡

  • Missing Semester(中文翻译),在互联网上享有盛名的MIT讲座,同样是简单介绍shell,git等工具,可以作学习过程中的补充。
  • CSDIY,贵校信科同学创建的计算机自学指南,作为资料的索引,内容极其丰富。
  • 或许csapp也可以拿来读读

私货:我为什么推荐Arch系发行版

其实初用起来,Arch和一般发行版没什么特殊区别。个人用Arch系(WSL是Arch,实机是Manjaro)的主要原因是AUR(Archlinux User Repository)。与内置的pacman, apt源不同,AUR源是用户上传的,把一些二进制/Github项目/多个软件的集合打包成一个包,便于管理(安装/卸载)。上课有讲过从源码编译安装openblas,而在AUR上被简化成yay -S openblas-git,会自动编译、安装、添加到路径。

// tbd

">