当前位置: 首页 > news >正文

mojo实现高阶函数(algorithm)

functional

实现高阶函数。

您可以从 algorithm 包导入这些 API。例如:

from algorithm import map

别名:

  • Static1DTileUnitFunc = fn[Int](Int, /) capturing -> None: Signature of a 1d tiled function that performs some work with a static tile size and an offset. i.e. func<tile_size: Int> (offset: Int)

  • Dynamic1DTileUnitFunc = fn(Int, Int, /) capturing -> None: Signature of a 1d tiled function that performs some work with a dynamic tile size and an offset. i.e. func(offset: Int, tile_size: Int)

  • BinaryTile1DTileUnitFunc = fn[Int](Int, Int, /) capturing -> None: Signature of a tiled function that performs some work with a dynamic tile size and a secondary static tile size.

  • Static2DTileUnitFunc = fn[Int, Int](Int, Int, /) capturing -> None: Signature of a 2d tiled function that performs some work with a static tile size and an offset. i.e. func<tile_size_x: Int, tile_size_y: Int> (offset_x: Int, offset_y: Int)

  • SwitchedFunction = fn[Bool]() capturing -> None

  • SwitchedFunction2 = fn[Bool, Bool]() capturing -> None

  • Static1DTileUnswitchUnitFunc = fn[Int, Bool](Int, Int, /) capturing -> None: Signature of a tiled function that performs some work with a static tile size and an offset. i.e. func<tile_size: Int> (offset: Int)

  • Static1DTileUnitFuncWithFlag = fn[Int, Bool](Int, /) capturing -> None

  • Dynamic1DTileUnswitchUnitFunc = fn[Bool](Int, Int, Int, /) capturing -> None

  • Static1DTileUnitFuncWithFlags = fn[Int, Bool, Bool](Int, /) capturing -> None

map

map[func: fn(Int, /) capturing -> None](size: Int)

将函数映射到从0到size的范围上。

Parameters:

  • func (fn(Int, /) capturing -> None):要映射的函数。

Args:

  • size (Int):元素的数量。

vectorize

vectorize[func: fn[Int](Int, /) capturing -> None, simd_width: Int, unroll_factor: Int](size: Int)

通过在 0 到 的范围内映射函数并在每一步size递增 来简化 SIMD 优化循环simd_width。其余部分size % simd_width将在单独的迭代中运行。

下面的示例演示了如何通过使用计算机上的 SIMD 寄存器同时设置多个值来提高循环的性能:

from algorithm.functional import vectorize# The amount of elements to loop through
alias size = 10
# How many Dtype.int32 elements fit into the SIMD register (4 on 128bit)
alias simd_width = simdwidthof[DType.int32]()fn main():var p = DTypePointer[DType.int32].alloc(size)# @parameter allows the closure to capture the `p` pointer@parameterfn closure[simd_width: Int](i: Int):print("storing", simd_width, "els at pos", i)p.store[width=simd_width](i, i)vectorize[closure, simd_width](size)print(p.load[width=size]())

在 SIMD 寄存器大小为 128 的机器上,这将在每次迭代时设置 4xInt32 值。 10 % 4 的余数为 2,因此最后两个元素将在两次单独的迭代中设置:

storing 4 els at pos 0
storing 4 els at pos 4
storing 1 els at pos 8
storing 1 els at pos 9
[0, 0, 0, 0, 4, 4, 4, 4, 8, 9]

您还可以展开循环以潜在地提高性能,但代价是二进制大小:

vectorize[closure, width, unroll_factor=2](size)

在生成的程序集中,函数调用将被重复,从而导致算术、比较和条件跳转操作减少。程序集在伪代码中看起来像这样:

closure[4](0)
closure[4](4)
# Remainder loop won't unroll unless `size` is passed as a parameter
for i in range(8, 10):closure[1](i)closure[1](i)

size如果已知编译时间可以减少剩余部分的迭代,则可以将其作为参数传递。仅当余数是 2 的指数 (2, 4, 8, 16, …) 时才会发生这种情况。如果不是 2 的指数,余数循环仍会展开以提高性能。

Parameters:

  • func ( fn[Int](Int, /) capturing -> None):将在循环体中调用的函数。
  • ​simd _ width ( Int):SIMD向量宽度。
  • ​unroll_factor ( Int):主循环的展开因子(默认 1 )****。

Args:

  • ​size ( Int): 循环的上限。

vectorize[func: fn[Int](Int, /) capturing -> None, simd_width: Int, size: Int, unroll_factor: Int]()

通过在 0 到 的范围内映射函数并在每一步size递增 来简化 SIMD 优化循环simd_widthsize % simd_width如果它是 2 的指数,则其余部分将在单次迭代中运行。

下面的示例演示了如何通过使用计算机上的 SIMD 寄存器同时设置多个值来提高循环的性能:

from algorithm.functional import vectorize# The amount of elements to 

相关文章:

mojo实现高阶函数(algorithm)

functional 实现高阶函数。 您可以从 algorithm 包导入这些 API。例如: from algorithm import map别名: ​Static1DTileUnitFunc = fn[Int](Int, /) capturing -> None: Signature of a 1d tiled function that performs some work with a static tile size and an off…...

先进制造aps专题二十四 云平台排产aps的方案设计

云平台排产aps的方案设计 针对对象是有排产需求无需定制的中小型工厂企业 一 网站功能&#xff08;b/s架构&#xff09; 1 前端界面 客户登录 排产项目管理 基础数据&#xff08;产品资料&#xff0c;产品工艺&#xff0c;工作日历&#xff0c;生产资源&#xff0c;工艺能力…...

JavaScript 逆向技巧总结

本节属于知识总结&#xff0c;只是对思路的梳理&#xff0c;不对具体内容进行展开 JS 逆向可以分为三大部分&#xff1a; 寻找入口&#xff0c; 调试分析&#xff0c; 模拟执行 寻找入口&#xff1a; 这是非常关键的一步&#xff0c;逆向在大部分情况下就是找一些加密参数到底…...

linux反向代理原理:帮助用户更好地优化网络架构

Linux反向代理原理详解 反向代理是一种在网络架构中常用的技术&#xff0c;尤其在Linux环境下被广泛应用。它可以帮助实现负载均衡、安全防护和请求缓存等功能。本文将深入探讨Linux反向代理的原理、工作机制以及其应用场景。 1. 什么是反向代理 反向代理是指代理服务器接收客…...

开源DevOps工具链管理:DevStream

DevStream&#xff1a;简化DevOps&#xff0c;加速创新- 精选真开源&#xff0c;释放新价值。 概览 DevStream&#xff0c;一个开源的DevOps工具链管理器&#xff08;DTM&#xff09;&#xff0c;由merico-dev团队精心打造&#xff0c;现已加入CNCF大家庭&#xff0c;并在devs…...

图数据库框架及其支持的开发语言和应用场景

图数据库框架及其支持的开发语言和应用场景 1. Neo4j 类型:原生图数据库特点:最流行的图数据库之一,使用Cypher查询语言,支持ACID事务,具有丰富的图算法库。支持的开发语言:Java, Python, JavaScript, Go, .NET, Ruby, PHP等。驱动和库:Neo4j Java Driver, Py2neo (Pyt…...

【Linux 18】核心转储

文章目录 &#x1f308; 一、什么是核心转储&#x1f308; 二、如何启动核心转储&#x1f308; 三、为什么有核心转储 &#x1f308; 一、什么是核心转储 核心转储 (Core Dump)&#xff1a;当一个进程异常终止时&#xff0c;会在触发进程崩溃的目录下生成一个以进程 pid 命名的…...

远程传输文件至服务器—spc 传输

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、SPC是什么&#xff1f;二、使用步骤1.进入 windows 客户端需要传输文件的目录。2.在该目录的路径栏输入 cmd&#xff0c;回车打开终端。3.确定服务器端 IP …...

HarmonyOS.FA开发流程

开发环境配置 1、DevEco Studio的安装 2、DevEcoStudio模拟运行工程&#xff1a;运行Tools->Device Manager&#xff0c;使用已认证的HW开发者联盟帐号Login&#xff08;在DP平台申请测试者权限&#xff09;&#xff0c;点击"允许"授权&#xff0c;选择一个设备运…...

三级_网络技术_21_无线局域网设备安装与调试

1.下列关于IEEE802.11标准的描述中&#xff0c;错误的是() IEEE802.11无线传输的频道定义在UNII波段 IEEE802.11在物理层定义了两个扩频技术和一个红外传播规范 IEEE802.11在MAC子层引入了一个RTS/CTS选项 IEEE802.11定义的传输速率是1Mbps和2Mbps 2.下列关于IEEE802.11标…...

机械学习—零基础学习日志(项目实践01)

llM项目分类与原理解析 Prompt项目 直接产出一些具体的文本与信息&#xff0c;使用markdown的格式。 对prompt进行较好的格式输出&#xff0c;固定格式。 ChatPaper 快速获取论文内容&#xff0c;然后了解对应的信息&#xff0c;判断是否有必要阅读这一篇论文 ChatBI&…...

SpringBoot排除默认日志框架

默认用的logback application.properties中的配置无需改变,自动装配会根据条件(哪个日志的.class是否存在) 进行切换 只要切换日志配置文件就好 比如原来使用的logback-spring.xml换成log4j2-spring.xml 日志文件网上找找...

质量管理理论(至简)

本文主要讲述质量管理的发展历程、质量管理常用的理论方法、质量管理过程、质量管理工具等内容&#xff0c;系统化展现质量管理知识体系。 一、质量管理发展历史 质量管理的发展历史大致划分为以下几个阶段&#xff1a; 质量管理发展阶段 质量检验阶段19世纪末&#xff0c;本…...

kaggle中访问本地上传的图片(找到图片地址)

由于代码中需要使用自己上传一个图片&#xff0c;对图片进行操作&#xff0c;尝试了很多种办法终于摸索出来了,希望可以帮助到大家 首先&#xff0c;在kaggle中左侧导航栏中找到datasets->New Dataset->Browse Files 创建成功后就可以看到数据集的详细信息 返回到代码中…...

ChatGPT到底是什么?它能做到什么?我们怎么才能使用到

ChatGPT是一个由OpenAI开发的人工智能聊天机器人程序&#xff0c;它基于先进的自然语言处理技术&#xff0c;能够与用户进行流畅的对话和文本交互。以下是ChatGPT的主要特点和能力&#xff1a; 到底是什么&#xff1f; 人工智能模型&#xff1a;ChatGPT是一个基于机器学习的大…...

浦科特M6S固态硬盘数据丢失与恢复:全方位指南

在当今数据驱动的时代&#xff0c;硬盘中的数据已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;数据丢失的风险始终存在&#xff0c;无论是由于意外删除、硬件故障还是其他未知原因。浦科特M6S作为一款高性能的固态硬盘&#xff0c;虽然以稳定性和速度著称&#xff…...

gdb: 编译,lzma,configure: error: missing liblzma for --with-lzma

如果是想编译时带着’–with-lzma’。如果编译主机以及安装了liblzma,gdb的configure会自动配置enable。 Build GDB with LZMA, a compression library. (Done by default if liblzma is installed and found at configure time.) LZMA is used by GDB’s “mini debuginfo” …...

LInux - 一文了解 ssh端口敲门knock

文章目录 基本概念工作原理实操注意事项 基本概念 SSH端口敲门技术是一种网络安全措施&#xff0c;用于防止未经授权的访问。通过端口敲门&#xff0c;可以动态地在防火墙上打开指定端口&#xff08;如SSH端口&#xff09;&#xff0c;仅允许符合特定敲门序列的用户访问。此技…...

Java面试篇(线程池相关专题)

文章目录 1. 为什么要使用线程池2. 线程池的核心参数和线程池的执行原理2.1 线程池的核心参数2.2 线程池的执行原理 3. 线程池中常见的阻塞队列3.1 常见的阻塞队列3.2 ArrayBlockingQueue 和 LinkedBlockingQueue 的区别 4. 如何确定线程池的核心线程数4.1 应用程序中任务的类型…...

git推送错误-->远程分支比本地的分支更新,无法直接推送

每次上传本地修改好的代码的时候,十次有八次都会出现这样的问题!!(暴躁!!!) 现在写个帖子记录一下,这个问题目前我还没有解决,欢迎懂的佬指点一下. 情景: 我在本地仓库做了一些代码的修改,准备上传到远程仓库上,下边是上传步骤: git add . # 将所有的修改都提交到缓冲区git …...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...