当前位置: 首页 > 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 …...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...