分类 未分类 下的文章

#pragma omp simd
for循环前对for循环显式simd优化

#pragma omp declare simd
函数前使函数生成simd版本

#pargma ivdep
for循环前忽略vector dependence

#pargma vector nontemporal
跳过过渡cache,直接stream到最下层cache

#include <omp.h>
int nt = omp_get_max_threads();

omp最多线程数

#pragma omp parallel private(A) share(B)
{
    int C;
    omp_get_thread_num();
}

omp多线程运行
每个thread有独立的A变量,B变量在所有thread间share
每个thread有独立C

export OMP_NUM_THREADS=5
限制omp线程数

fork thread:

#include <pthread.h>
int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,
(void*)(*start_rtn)(void*),void *arg);

fork出一个thread
-lpthread

fork process:

pid = fork();

parent进程pid = 0,child进程pid!=0

官方mooc笔记

factual question: evaluate each option to determine if it is correct
For the Negative Factual Information questions,
remember that you're looking for an answer
that either isn't in the paragraph,
or directly contradicts information in the paragraph.

给2020的自己订下两个目标:
1. 参加超算比赛,最好能和学长们一起拿到冠军
2. 发一篇paper,尽管目标很远,不过尽量去努力吧

以上

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() ) ); 
   }
}

MIPS指令集

PC寄存器(program counter): 保存当前运行指令地址
SP寄存器(stack pointer):当前栈指针,栈增长按地址从高到低
$a0 ~ $a3:传递函数参数
$v0 ~ $v1:函数返回值
$t0 ~ $t9:临时寄存器,过程调用中不需要被保存
$s0 ~ $s7:保留寄存器,过程调用中必须被保存
$zero:存储0
$gp:全局指针(指向静态数据)
$at: 由汇编器所使用

jr $ra: 无条件跳转至地址ra
lui $t0,255(load upper immediate):设置$t0中高16位为255

PC相对寻址:相对PC寄存器寻址

堆:从下向上增长(低地址向高地址),存储动态的内存

C后缀名

unix: .c : c源文件
.s : 汇编文件
.o : 目标文件
.a : 静态链接库
.so : 动态链接库
.out : 可执行文件

MS-DOS: .C, .ASM, .OBJ, .LIB, .DLL, .EXE

浮点数标准

单精浮点数:1位符号位,8位指数位,23位尾数
双精浮点数:1位符号位,11位指数位,52位尾数

| 指数 | 尾数 | 表示 |
| 0 | 0 | 0 |
| 0 | 非0 | 非规格化数 |
| 1 ~ max - 1 | 任意值 | 浮点数 |
| max | 0 | 无穷 |
| max | 非0 | NaN |

负指数使用偏阶
如-1 -> -1 + 127 = 126