-
C++多线程之三
异步std::async 接受一个带返回值的 lambda,自身返回一个std::future 对象。lambda 的函数体将在另一个线程里执行。调用 future 的 get() 方法可以得到返回值。 std::async 的第一个参数可以设为 std::launch::deferred,这时不会创建一个线程来执行,他只会把 lambda 函数体内的运算推迟到 future 的 get() 被调用时。也就是 main 中的 interact 计算完毕后。如果不想让std::...…
-
C++多线程之二
死锁(Dead Lock)当一个操作需要使用两个互斥锁的时候,可能会发生死锁,如下面的例子:#include <iostream>#include <thread>#include <string>#include <mutex>#include <fstream>using namespace std;class LogFile { std::mutex _mu; std::mutex _mu2; ofstre...…
-
C++多线程之一
并发 vs 并行并发和并行都是指多个任务同时执行的概念,但是它们的含义略有不同。并发(Concurrency)指在同一时间间隔内,多个任务在交替执行,每个任务在某个时间段内执行一部分,然后暂停,让其他任务执行。在任意一个时间点只有一个任务在执行。并行(Parallelism)指多个任务同时执行,即在同一时刻,多个任务在不同的处理器上同时执行,每个任务独立执行,并且相互之间不会影响。在并行中,各个任务是同时执行的,每个任务占用不同的处理器或者计算机资源,因此可以大大缩短执行时间。 ...…
-
编译与链接
源文件到可执行目标文件的过程 预处理阶段预处理器根据字符#开头的命令,修改原始的C程序,得到另一个C程序,通常是以.i作为文件扩展名。 预处理命令 include: 就是copy&paste define: 宏定义 ifdef pragma once:头文件保护符 ...…
-
Transformer源码分析
输入每个样本有三个输入,分别是: encode的输入: P是填充字符(pad), 使得同一个batch中的样本长度一致 decoder的输入: S是句子开始 真实值: E是句子结尾 模型架构超参数d_model = 512 # Embedding Size d_ff = 2048 # FeedForward dimension d_k = d_v = 64 # dimension of K(=Q), Vn_layers = 6 # nu...…
-
Transformer
Self-attention问题背景很多问题的输入是一组向量,并且向量的数量可能不一样,例如nlp、语音识别、graph等。 输出可能跟输入数量一样(Sequence Labeling),也可能不一样(Seq2Seq)。 我们通常需要考虑输入数据的上下文,才能使网络更好地理解输入数据。传统的做法是固定一个window,把一个window的输入输入同一个网络中。但是window太大会使得计算量太大,window太小上下文不完整。 计算逻辑因此提出了s...…
-
DLRM源码解读
参数设置import argparseparser = argparse.ArgumentParser( description="Train Deep Learning Recommendation Model (DLRM)")parser.add_argument("--arch-sparse-feature-size", type=int, default=2)...parser.add_argument("--lr-num-decay-steps", type=int, de...…
-
DLRM
深度学习推荐系统的演进 模型设计4大技术Embedding将稀疏的类别特征转换成稠密向量 在更复杂的场景下,embedding也可以用来表示多个item的加权组合,多个item的权重可以用下面的向量来表示。 Matrix Factorization其实在推荐系统早期的经典算法–矩阵分解中,就用到了embedding。随着技术的发展,人们把user/item的embedding扩展到其它的类别特征。矩阵分解算法中,使用了user em...…