草庐IT

稀疏奖励

全部标签

c++ - AVX2 根据条件将连续元素扩展为稀疏 vector ? (如 AVX512 VPEXPANDD)

有谁知道如何向量化以下代码?uint32_tr[8];uint16_t*ptr;for(intj=0;j这基本上是一个屏蔽的收集操作。自动矢量化器无法处理这个问题。如果ptr是一个uint32_t*它应该可以直接用_mm256_mask_i32gather_epi32实现.但即便如此,你如何生成正确的索引vector?并且无论如何只使用打包加载并洗牌结果(需要类似的索引vector)会不会更快? 最佳答案 更新答案:主要代码段已重写为函数和解决方案添加了适用于AMD处理器的内容。正如PeterCordes在评论中提到的,AVX-51

单GPU就能压缩模型,性能不变参数少25%!微软提出模型稀疏化新方法

众所周知,对于大语言模型来说,规模越大,所需的算力越大,自然占用的资源也就越多。研究人员于是乎把目光转到了这片领域,即模型的稀疏化(Sparsification)。今天要介绍的SliceGPT,则可以实现模型的事后稀疏。也就是说,在一个模型训练完了以后再进行稀疏化操作。该模型由微软研究院和苏黎世联邦理工学院联合发表在了arXiv上。目前主流的稀疏化技术面临着挺多挑战和困难。比方说,需要额外的数据结构,而且在当下的硬件条件下,速度有限。SliceGPT就能很好的解决这些问题——它能用一个较小的矩阵来替换每个权重矩阵,从而降低网络的嵌入维度。而实际结果也是非常不错的,在LLAMA-270B、OPT

c++ - 如何存储稀疏矩阵?

我需要在C++中实现两种类型的存储稀疏矩阵:链表数组(有效方式)空间复杂度在这里非常重要。最有效的方法是什么? 最佳答案 nnz:稀疏矩阵的非零数row_size:矩阵行数column_size:矩阵列数有很多种方式,它们的空间复杂度:压缩稀疏行(CSR):2*nnz+row_size内存数压缩稀疏列(CSC):2*nnz+column_size内存数坐标格式(COO):3*nnz内存数对于空间复杂度:如果row_size>column_size,则使用CSC格式,否则,使用CSR格式。对于时间复杂度:对于CSR格式,Row会被O(

c++ - Eigen 稀疏矩阵行列式为零

我正在尝试计算我正在操作的稀疏矩阵是否为正定矩阵。为此,我尝试使用西尔维斯特标准,这意味着领先的未成年人是积极的。为了计算矩阵的行列式,我为矩阵的每个block构建了一个sparseLU求解器,然后它可以给出矩阵的行列式。但是从某个维度(大约130*130)开始,我得到的结果是所有行列式都是0。这不是我问题中的一些特殊维度(矩阵有32*32block)所以我相信这个问题是相关的一些由Eigen应用的截断算法,其行列式简单地低于某些阈值。我对这种机制的搜索没有得到像样的结果。我的矩阵的尺寸约为16k*16k,所有非零元素都在对角线附近的96个元素上。Eigen中是否实现了任何截断机制,我

【译】稀疏混合专家模型的崛起: Switch Transformers

原作: 塞缪尔·弗兰德引言:为最强大的语言模型铺平道路的核心技术 使用Dall-E生成的图像稀疏混合专家模型(MoE)已成为最新一代LLMs的核心技术,例如OpenAI的GPT-4、MistralAI的Mixtral-8x7等。简而言之,稀疏MoE是一种非常强大的技术,因为理论上,它允许我们以O(1)的计算复杂度扩展任何模型的容量!然而,正如通常的情况一样,问题在于细节,要让稀疏的MoE正常工作就需要确保这些细节完全正确。在本文中,我们将深入探讨稀疏MoE领域的一个核心贡献,即SwitchTransformer(Fedus等人,2022年),它首次展示了利用这项技术实现了令人印象深刻的扩展特性

稀疏数组

稀疏数组的一些常见问题1.什么是稀疏数组?1.1what?稀疏数组是一种针对大部分元素值为相同或者默认值的数组进行优化存储的方法。在稀疏数组中,只存储那些不同于默认值的元素及其对应的位置信息,从而节省存储空间。1.2why?稀疏数组通常用于处理大规模数组中大部分元素值相同的情况,比如二维数组中的地图数据、棋盘数据等。这种情况下,使用稀疏数组能够显著减少存储空间的开销,提高存储效率。2.稀疏数组与二维数组之间如何转化?2.1how?下面po一张思路图,以此解答。2.2具体的code(以java为例)备注:该文件中。第115行以及第139行代码为拓展,可自行进行阅读做以提示!

c++ - 在 C++ 中解决稀疏线性系统的最佳方法 - GPU 可能吗?

我目前正在做一个我们需要解决的项目|Ax-b|^2。在这种情况下,A是一个非常稀疏的矩阵,A'A每行最多有5个非零元素。我们正在处理图像,A'A的维度是NxN,其中N是像素数。在本例中N=76800。我们计划转到RGB,然后维度将是3Nx3N。在matlab中求解(A'A)\(A'b)大约需要0.15秒,使用double。我现在已经对Eigens稀疏求解器进行了一些试验。我试过:SimplicialLLTSimplicialLDLTSparseQRConjugateGradient和一些不同的顺序。目前为止最好的是SimplicialLDLT使用AMDOrdering大约需要0.35-

c++ - 我可以使用 Eigen 稀疏矩阵来满足一般存储要求吗

我需要一个模板化的稀疏矩阵实现,但只是为了减少内存占用,不进行任何数值求解。所以我尝试使用Eigen,即使我不需要数学部分。为什么?它恰好在我的机器上,我已经用它来做其他事情了。但我肯定不是Eigen专家!上下文:我有一个类型T(比如structT{inta;floatb;vectorc;};,我需要存储这个的大矩阵(比如超过1000x1000)并且大多数值都是空的/不相关的。因为我不做任何数学运算,所以我认为提供一个赋值运算符来进行存储/检索操作就足够了,如下所示:intmain(){Eigen::SparseMatrixmat(1000,1000);//1000000element

c++ - 接受特征密集矩阵和稀疏矩阵的函数

我正在努力为一个开源数学库添加稀疏矩阵支持,并且希望不要为Dense和Sparse矩阵类型提供重复的函数。下面的例子展示了一个add函数。一个具有两个功能的工作示例,然后是两次失败的尝试。下面提供了指向代码示例的Godbolt链接。我查看了关于编写采用Eigen类型的函数的Eigen文档,但他们使用Eigen::EigenBase的答案不起作用,因为MatrixBase和SparseMatrixBase具有EigenBase中不存在的特定方法https://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html我们使用C++

c++ - 更高效的稀疏矩阵元素访问器

我和成员写了一个小的稀疏矩阵类:std::map>sm;下面的方法是我用来访问矩阵元素的函数,如果不能通过迭代器访问的话:doublematrix::operator()(intr,intc)const{std::map>::const_iteratori=sm.find(r);if(i==sm.end()){return0.0;}std::map::const_iteratorj=i->second.find(c);if(j==i->second.end()){return0.0;}returnj->second;}这个函数仍然需要经常调用。有人知道如何改进此功能吗?先谢谢了。