搜索/在JIT编译的GPU内核库中添加并测试内核

在JIT编译的GPU内核库中添加并测试内核

让AI修改按需编译(JIT)的GPU内核库时使用。逐层添加内核,只把生成的文件写入可写目录,按GPU类型进行测试,并先确认结果正确再测量速度。

要使用这个AI规则
## 搭建可编辑安装,修改内核后自动重新编译 使用可编辑安装,并保留环境中现有的框架和加速器版本。 如果隔离的依赖解析可能拉取不兼容的运行时软件包,请将其禁用。 构建或测试前,初始化所有必需的源代码子模块。 将即时编译作为默认开发循环。 编辑内核源文件,运行重点测试,让源文件哈希触发重新编译。 除非打包代码本身发生变化,否则不要在每次编辑内核后重新安装软件包。 只有陈旧工件属于诊断对象时,才清除 JIT 缓存。 只有首次使用需要更快速度或分发有此要求时,才使用预编译内核软件包。 在日常开发中,将预编译工件保持为可选项。 为检测到的本地 GPU 之外的设备构建时,明确设置目标架构。 根据可用内存限制编译器线程数和并行构建任务数。 以任务数、编译器线程数和每线程需求三者的乘积估算总编译内存。 不要让测试参数大小造成可避免的设备内存耗尽。 只有需要准确的硬件计时时,才安装性能分析支持。 审查前运行格式化和仓库钩子。 ## 生成的文件只写入可写的工作区,不写入安装目录 通过通用的规格接口表示每条编译工具链。 为每项规格提供唯一名称、源文件列表、编译器标志、链接器标志和支持的架构。 使用共享的构建与加载模板协调缓存查找、锁定、编译和加载。 明确生命周期:先尝试从缓存加载,需要时构建,再加载已编译模块。 如果设置了禁用标志,且不存在有效的缓存模块或预编译模块,则拒绝 JIT 编译。 安装后的软件包目录可能是只读的,因此绝不能将生成文件写入其中。 将源文件模板和预编译软件包数据保持为只读。 仅将渲染后的源文件和复制的编译单元写入生成源文件工作区。 仅将对象文件、共享库、元数据和构建文件写入 JIT 工件工作区。 根据确切的源文件列表和编译标志生成构建清单。 确保共享、临时或受限环境可以覆盖工作区位置。 使用架构上下文,将检测到的设备与明确请求的目标相结合。 编译开始前,将模块限制在受支持的架构系列内。 请求的架构均不受支持时,应明确失败。 不得在没有提示的情况下为其他设备系列编译。 ## 从设备代码到公共API,逐层添加新内核 针对裸指针和可移植内核类型实现与框架无关的设备代码。 不要在可复用的内核包含层中放置框架头文件。 在绑定层添加启动器,用于验证张量并准备调用参数。 通过项目的类型化跨语言 FFI 导出启动器。 根据专用化参数计算确定性的操作 URI。 在可写源文件工作区中创建每项操作独立的生成目录。 只有需要具体类型或参数专用化时,才使用模板。 只有内容不同时,才写入渲染后的配置。 将所需的编译单元复制到生成目录。 返回包含 URI、源文件、标志和架构限制的编译规格。 提供可复用已加载模块的缓存式高级 API。 分发需要时,为预先编译的软件包生成注册该操作。 从软件包入口点导出公共 API。 附加一个定义轴、输入、输出和可选参考结果的跟踪模板。 对于先规划后运行的 API,将跟踪功能附加到执行操作的方法。 添加实际可用的跟踪示例,重新生成基准定义工件,并提交预期结果。 重新生成后运行跟踪一致性测试和端到端测试。 ## 测试时跳过不支持的GPU,速度结论必须附带正确性检查 进行广泛验证时运行完整测试套件,迭代期间运行重点测试。 通过统一的能力辅助函数有意跳过不支持的硬件。 API 提供相关判定函数时,同时检查设备计算能力和后端支持情况。 明确每项功能的架构要求。 不要将不受支持的架构转变为测试失败。 不要因为本地设备不同而跳过受支持的架构。 选择能够验证契约,同时不会因可避免的内存不足而跳过的测试形状。 覆盖受变更影响的注意力、矩阵乘法、混合专家、通信和实用工具路径。 对集合或分布式测试使用多设备启动工具。 通过支持可比较后端和批量配置的统一工具执行基准测试。 优先使用硬件级性能分析器计时,不可用时改用加速器事件。 记录生成每项基准结果的计时机制。 报告中位数、变化、迭代次数、工作负载形状、数据类型、架构和后端。 比较内核时启用参考结果检查。 没有正确性检查和可复现参数时,不得宣称速度优势。 批准性能敏感型内核前,必须取得基准测试和测试证据。 ## 源码或目标GPU变化时,重新构建缓存的内核 对已加载模块使用进程内缓存,对已编译工件使用磁盘缓存。 源文件、标志、架构、参数或库版本变化时,使缓存模块失效。 根据操作类型、参数、源文件哈希、标志和目标架构派生缓存标识。 确保缓存键在不同专用化和工具链变体之间保持唯一。 将兼容性元数据存储在工件旁,并在加载前验证。 通过锁定保护编译,防止并发进程损坏共享工件。 对于单一架构 DSL 输出,存储一个包含元数据的模块目录,并为每项专用化存储一个对象。 根据 DSL 编译目标或活动设备派生架构。 编译器软件包版本或内核源文件哈希变化时,使 DSL 模块失效。 允许在诊断时禁用缓存,同时默认保持复用启用。 使用分派宏或生成代码管理数据类型与块大小的组合空间。 明确分派选择,并测试不支持的组合。 直接编写源代码已经足够时,不要添加模板化处理。 不要让陈旧的预编译软件包绕过版本兼容性检查。 只有进行有意且已诊断的混合版本实验时,才绕过版本检查。 ## 在内核运行前记录API输入,以便复现崩溃 在内核执行前记录 API 输入,使导致崩溃的参数能够在设备故障后保留下来。 禁用日志时,保持零开销。 为调用名称、输入和输出以及高开销统计提供分级级别。 仅在明确启用的高详细度诊断中收集统计信息和扫描无效值。 图捕获期间跳过不兼容的统计收集。 按事件数量和总大小限制诊断转储。 支持包含和排除过滤器,使高开销捕获仅针对相关 API。 如果转储必须在环境之间移动,请选择可移植的张量格式。 使用专用的可写转储目录。 只有在诊断故障时,才启用详细编译输出和调试符号。 同时检查生成源文件、构建清单、已编译模块和缓存元数据。 复现崩溃时记录形状、数据类型、架构、标志和选定的后端。 性能分析器或调试器需要源文件映射时,使用行信息。 将常规优化设置与调试构建分开。 将强制选择算法或后端视为诊断控制,而不是生产环境默认值。 记录复现结果时使用的每项非默认控制。 ## 校验下载的工件,并按明确的GPU列表构建发布包 在离线或锁定环境中缺少本地工件时,必须直接失败。 允许受信任的镜像替换默认工件仓库。 默认验证下载工件的校验和。 只有作为临时调试手段时,才禁用校验和验证。 限制并行工件下载数量。 尝试下载前,优先使用已配置的本地源。 保持编译标志和启动器覆盖值明确且可观察。 将工件加载器的日志控制与 API 调用日志控制区分开。 自动调优应使用稳定计时;事件计时不可靠时,可使用硬件全局计时器。 允许在受控的 CI 诊断中覆盖机密计算检测结果。 只有指定了明确的缓存位置且环境兼容时,才持久化自动调优结果。 加载策略阻止列表,避开已知会在当前软件栈上挂起或崩溃的内核。 让实验性路由和内核选择覆盖值保持其文档规定的默认设置。 针对明确的架构列表构建预先编译的软件包。 从唯一的权威版本来源生成软件包版本元数据。 对内核、设备支持和错误修复使用向后兼容的版本增量。 将不兼容的 API 变更限定在架构版本边界。 ## 让公共API和文档与内核代码保持一致 使用类型化跨语言 ABI,使同一内核能够服务多个宿主框架。 将框架特定的张量处理放在绑定中,而不是设备头文件中。 只有编译和图捕获需要时,才在宿主框架中注册自定义操作。 保持 Python API、JIT 生成器、绑定导出、预先编译注册表和软件包导出同步。 采用高级工作区或先规划后运行设计前,先从最简单的可工作内核模式开始。 参数变化时,同时更新函数签名、模板、启动器和测试。 从附近可工作的示例中学习既有的风格、复杂度、防御性和效率。 记录有意的偏离和性能关键型算法选择,并说明考虑过的替代方案。 对于特定于架构的行为,请查阅权威的指令集和工具链文档。 外部文档陈旧时,优先使用随项目提供的依赖源代码。 保持跟踪模板和生成的基准定义与公共 API 同步。 日志、要求、FFI 或代码生成模式发生变化时,更新基础设施示例和教程。 明确标记弃用的方法,或将其从当前指南中移除。 按照贡献政策披露有实质意义的 AI 协助。 只有源文件、生成工件、缓存、测试、基准、导出和文档一致时,才予以批准。