19 年时候学OOP(?)时候的post,更新一下记录一下遇到的新的设计模式:

std::enable_if

用 std::enable_if 增加一个新的函数参数
利用 SFINAE (Substitution Failure Is Not An Error)
模板替换失败不会报错,只会使对应模板不存在

template<int val>
void func(int x, typename std::enable_if<val, int>::type y) {
    printf("in func yes %d\n", x);
}

template<int val>
void func(int x, typename std::enable_if<!val, int>::type y) {
    printf("in func no %d\n", x);
}

int main() {
    func<0>(123, 123);
    
}

当 enable_if 为 false 时,std::enable_if<!val, int> 不存在 type 参数,模板替换错误,此时函数不存在

https://www.runoob.com/design-pattern/design-pattern-intro.html

委托模式


class I /*interface*/ {
public:
    virtual void f() = 0;
    virtual void g() = 0;
};

class A : public I {
public:
    void f(){std::cout << "A::f()" << std::endl;}
    void g(){std::cout << "A::g()" << std::endl;}
};

class B : public I {
public:
    void f(){std::cout << "B::f()" << std::endl;}
    void g(){std::cout << "B::g()" << std::endl;}
};


class C : public I {
public:
    C() { m_i = new A();/*delegation*/ }

    void f(){ m_i->f(); }
    void g(){ m_i->g(); }

    // normal attributes
    void toA(){ m_i = new A(); }
    void toB(){ m_i = new B(); }

private:
    I* m_i;
}

工厂模式

public class ShapeFactory {

   //使用 getShape 方法获取形状类型的对象
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }        
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}

CRTP

静态多态



template 
struct base
{
    void interface()
    {
         // ...
         static_cast(this)->implementation();
         // ...
    }
};
 
struct derived : base
{
     void implementation()
     {
         // ...
     }
};

visitor模式

将数据与对数据的操作分离


//前向声明,访问者
class Visitor;

//被访问的抽象类,只有一个接口,用来接受访问者
class Object
{
public:
    virtual void accept(Visitor&v) = 0;
};

//具体的被访问的对象,学生。
class StudentA :public Object
{
    std::string name;
    int score;
public:
    StudentA(std::string name_);
    int getScore();
    std::string getName()
    {
        return name;
    }
    void setScore(int num);
    virtual void StudentA::accept(Visitor & v)
    {
        v.visit(this);
    }
};

//抽象访问者,只有一个接口,访问.
class Visitor
{
public:
    virtual void visit(Object* obj)=0;

};

//具体的访问者一,班主任,实现访问(学生并给学分)
class ClassLeader :public Visitor
{
public:
    virtual void visit(Object* obj);
};
//具体的访问者二,校长,实现访问(学生并批评不及格的学生)
class HeadMaster :public Visitor
{
public:
    virtual void visit(Object* obj);
};

observer模式

一些观察者观察一个数据,当数据被改动时通知所有观察者


public class Subject {
   
   private List observers 
      = new ArrayList();
   private int state;
 
   public int getState() {
      return state;
   }
 
   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }
 
   public void attach(Observer observer){
      observers.add(observer);      
   }
 
   public void notifyAllObservers(){
      for (Observer observer : observers) {
         observer.update();
      }
   }  
}
public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}
public class BinaryObserver extends Observer{
 
   public BinaryObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }
 
   @Override
   public void update() {
      System.out.println( "Binary String: " 
      + Integer.toBinaryString( subject.getState() ) ); 
   }
}

最近两年跑各种 event 的次数增加了很多,是时候开一个 post 记录一下跑过的 event 了。在这里记一下跑过的国内 event,每次跑日本会单独开一个post(但愿不会咕)。

2022.7.23 长春漫展

挺没意思的一个本地活动,属于是在家憋久了

2023.2.11 西安 燃乐project两周年 次元偶像庆典

疫情实在是在家憋太久了,看到西安有这个event就拉上liuyun顺便去西安转了一圈。本质上是一个宅舞拼盘+starenergy地偶场。有几个节目的表现力确实不错,当anikura蹦也很开心,演员们都很用心。到starenergy的时候有点震撼了,第一次看地偶,没想到西安团能凑出这么多人,而且旁边几个老哥成箱开化棒,也算是第一次现场跟偶像系call,拉副歌警报。

2023.2.18 北京 MEET RE

还是疫情憋坏了系列,看到北京有地偶场所以就来看看,本质上算是地上代餐?在现场拉mix还是很解压的,地偶场也有地偶场的魅力。这也是第一次见透团,挺喜欢透团的现场的,加推。

2023.3.9 北京 新清华学堂 龙猫室内乐

和才子去看了龙猫室内乐,好像是第一次参加新清的演出?

2023.3.19 北京 lumos idol live Vol.2

一个lumos在西单的live,第一次见到 SFD 老哥。李美丽唱了giligili爱。在演示烈剑的时候吸引来了辰烃yy xs。

2023.3.25 北京 MEET RE:SP

和湖中一起看的,另一场有透团的MEET。MEET传统艺能晚1h开场。

- 阅读剩余部分 -

A100

peak FP64 : 9.7TFLOPS
peak FP32 : 19.5 TFLOPS
peak FP16 : 78 TFLOPS
peak TF32 tensor core : 156 TFLOPS

192KB L1 cache (shared memory) / SM
40MB L2 cache
40GB 主存, 1555GB/s 带宽

PCIe 4 : 31.5GB/s

在地学系的 centos 7 CPU 集群上配 slurm
登录节点 192.168.100.10
计算节点 192.168.100.2[1-8]

slurm 依赖 munge

yum update
yum install epel-release
yum install -y munge munge-libs munge-devel

拷贝 munge-key :

scp data:/etc/munge/munge.key /etc/munge/
chown munge: /etc/munge/munge.key
chmod 400 /etc/munge/munge.key

安装其他依赖:

yum install -y openssl openssl-devel pam-devel numactl numactl-devel hwloc hwloc-devel lua lua-devel readline-devel rrdtool-devel ncurses-devel man2html libibmad libibumad 
yum install -y perl-ExtUtils-MakeMaker
yum install -y mysql
yum install -y perl-PCP-PMDA

从头编译 slurm :

tar -xvjf slurm-18.08.2.tar.bz2
cd slurm-18.08.2/
./configure --prefix=/usr --sysconfdir=/etc/slurm --with-munge=/usr/bin/munge
make -j12
make install 
make install-contrib

拷贝 slurmd 服务 :

cp etc/slurmd.service /etc/systemd/system

登录节点启动服务 slurmctld
计算节点启动服务 slurmd

slurmd log 路径默认为 /var/log/slurmd.log

slurm 配置文件为 /etc/slurm/slurm.conf,需保证所有节点的配置文件相同

配置 /etc/slurm/cgroup.conf 如下:

CgroupAutomount=yes
ConstrainCores=no
ConstrainRAMSpace=no

新建 slurm 用户:

groupadd -g 888 slurm
useradd  -m -c "SLURM workload manager" -d /var/lib/slurm -u 888 -g slurm  -s /bin/bash slurm

使用 slurm 运行 slurmd.service

/etc/systemd/system/slurmd.service 中设置

[Service]
User=slurm

slurm 生成配置:https://slurm.schedmd.com/configurator.html

slurmd -Dvvv # 调试启动
slurmd -C # 查看节点配置
scontrol show node [node] # 查看 node 状态
scontrol update NodeName=[node] State=UNDRAIN # 将 node 状态设为 undrain     sf

slurmdPidFile 默认位于 /var/run/slurmd.pid,路径
/var/run 目录只有 root 有写权限,且 /var/run 是 tmpfs
新建 /var/run/slurm,权限设置为 0770
/etc/tmpfiles.d/slurm.conf 中添加

d /var/run/slurm 0770 root slurm -

开机后自动设置路径
修改 /etc/systemd/system/slurmd.service 中 PIDFile 为 /var/run/slurm/slurmd.pid

然后 systemctl daemon-reload