使用 Kiro 和 Arm MCP Server 的自动化云迁移
抱歉,我需要您提供要翻译的具体文本内容(文章正文),才能为您完成简体中文翻译。请将需要翻译的文本粘贴在这里,我会在保持原有格式、代码块和链接不变的前提下为您进行翻译。
Introduction
AWS Graviton 提供了 AWS 上任何 EC2 实例中最佳的性价比,最近的 Graviton 5 公布更让其价值主张更强大。迁移到 Graviton 在财务上是明智的,同时也能为您的应用带来巨大的性能提升。
大多数应用可以无缝迁移,但如果您的代码中有针对 x86 的特定优化怎么办?
好消息: 您不再需要手动进行迁移。
在本文中,我将展示如何结合使用 Kiro(AWS 的智能 IDE)和 Arm MCP Server,自动化整个迁移过程——包括 Docker 镜像、SIMD 内在函数、编译器标志,全部内容。
Arm MCP Server 为你提供的功能
Arm MCP Server 实现了 Model Context Protocol (MCP)——一种让 AI 编码助手接入专用工具的标准方式。将它连接到 Kiro 后,你将获得一个能够:
- ✅ 检查 Docker 镜像 是否支持
arm64,无需手动浏览清单。 - 🔍 扫描代码库,查找 x86‑特定代码(intrinsics、构建标志等)。
- 📚 搜索 Arm 知识库,获取迁移指南和等价的 intrinsic 信息。
- 🧪 分析汇编,了解性能特征。
示例:迁移遗留的基准测试应用
想象一下,你接手了一个与 x86 紧密耦合的遗留基准测试应用。下面是原始的 Dockerfile。
FROM centos:6
# CentOS 6 reached EOL – use vault mirrors
RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-Base.repo && \
sed -i 's|^#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Base.repo
# Install EPEL repository (required for some development tools)
RUN yum install -y epel-release && \
sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/epel.repo && \
sed -i 's|^#baseurl=http://download.fedoraproject.org/pub/epel|baseurl=http://archives.fedoraproject.org/pub/archive/epel|g' /etc/yum.repos.d/epel.repo
# Install Developer Toolset 2 for better C++11 support (GCC 4.8)
RUN yum install -y centos-release-scl && \
sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-SCLo-scl.repo && \
sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo && \
sed -i 's|^# baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-SCLo-scl.repo && \
sed -i 's|^# baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
# Install build tools
RUN yum install -y \
devtoolset-2-gcc \
devtoolset-2-gcc-c++ \
devtoolset-2-binutils \
make \
&& yum clean all
WORKDIR /app
COPY *.h *.cpp ./
# AVX2 intrinsics are used in the code
RUN scl enable devtoolset-2 "g++ -O2 -mavx2 -o benchmark \
main.cpp \
matrix_operations.cpp \
-std=c++11"
CMD ["./benchmark"]
为什么这个 Dockerfile 在 Graviton 上无法工作
| 问题 | 说明 |
|---|---|
centos:6 | 没有 arm64 变体——基础镜像仅支持 x86。 |
-mavx2 | 仅适用于 x86 的编译器标志;Arm CPU 不识别 AVX2。 |
AVX2 本机函数 (__m256 等) | 在 Arm 上无法编译;需要使用 Arm 等价的 SIMD 本机函数。 |
如果你没有自行发现这些问题,也没关系——Kiro + Arm MCP Server 会帮你找出来。
有问题的矩阵乘法代码
以下是使用 AVX2 本机指令进行双精度矩阵乘法的 matrix_operations.cpp 文件。(此片段故意简化——完整实现中包含实际的乘法内核。)
// matrix_operations.cpp
#include "matrix_operations.h"
#include <vector>
#include <random>
#include <iostream>
#include <immintrin.h> // AVX2 intrinsics
// ---------------------------------------------------------------------------
// Matrix constructor
// ---------------------------------------------------------------------------
Matrix::Matrix(size_t r, size_t c) : rows(r), cols(c) {
// Allocate a rows × cols matrix filled with zeros
data.resize(rows, std::vector<double>(cols, 0.0));
}
// ---------------------------------------------------------------------------
// Fill the matrix with random values in the range [0.0, 10.0)
// ---------------------------------------------------------------------------
void Matrix::randomize() {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(0.0, 10.0);
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < cols; ++j) {
data[i][j] = dis(gen);
}
}
}
// ---------------------------------------------------------------------------
// (The multiplication routine that uses AVX2 intrinsics is omitted here)
// ---------------------------------------------------------------------------
为什么此代码在 ARM v8 AArch64 上会失败
| 问题 | 说明 |
|---|---|
AVX2 本机指令 (_mm256_*) | 这些 x86‑64 专有指令在 ARM v8 上不可用。 |
| 缺少 include guard / 头文件 | 原始片段省略了若干标准头文件,导致编译错误。 |
std::vector 初始化错误 | std::vector(cols, 0.0) 应写成 std::vector<double>(cols, 0.0)。 |
| 循环截断 / 语法错误 | randomize 方法的部分代码不完整。 |
建议的迁移路径(使用 Kiro 助手)
-
检测架构
- Kiro 读取 CI 配置(
.github/workflows/*.yml),确定运行器为arm64。
- Kiro 读取 CI 配置(
-
识别不兼容的本机指令
- 它扫描源码中的 AVX2 本机指令(
_mm256_*),并将其标记为不可移植。
- 它扫描源码中的 AVX2 本机指令(
-
提出可移植的替代方案
- Kiro 建议将 AVX2 代码替换为 ARM NEON 等价实现(
float64x2_t、float64x4_t等),或在性能影响可接受的情况下回退到标量实现。
- Kiro 建议将 AVX2 代码替换为 ARM NEON 等价实现(
-
自动化重构(可选 PR)
- Kiro 可以生成一个 Pull Request,内容包括:
- 将 Docker/CI 镜像更新为 ARM 兼容的基础镜像。
- 调整构建命令(例如添加
-march=armv8-a+simd)。 - 用 NEON‑兼容代码或可移植的标量循环替换 AVX2 本机指令。
- Kiro 可以生成一个 Pull Request,内容包括:
-
验证
- 完成修改后,Kiro 在
arm64运行器上运行基准测试,将性能与原始 x86 构建进行对比,并报告差异。
- 完成修改后,Kiro 在
TL;DR
- Problem: x86‑specific Docker 基础镜像、编译器标志以及 AVX2 内置函数导致代码无法在 Graviton(ARM)实例上运行。
- Solution: 使用 Kiro + Arm MCP Server 自动检测并替换有问题的部分(例如 AVX2 内置函数、仅限 x86 的预处理器检查)。
- Result: 一个干净、兼容 ARM 的 Docker 镜像和源代码,可在最新的 Graviton 5 实例上运行,提供性价比高的性能提升。
试一试吧——你的未来的自己(以及你的 AWS 账单)会感谢你的!
头文件 matrix_operations.h
#ifndef MATRIX_OPERATIONS_H
#define MATRIX_OPERATIONS_H
#include <cstddef> // size_t
#include <vector> // std::vector
#include <iostream> // std::cout (optional, for debugging)
class Matrix {
private:
std::vector<std::vector<double>> data; // 2‑D storage
size_t rows;
size_t cols;
public:
// ctor
Matrix(size_t r, size_t c);
// fill the matrix with random values (0‑1)
void randomize();
// matrix multiplication (returns a new matrix)
Matrix multiply(const Matrix& other) const;
// sum of all elements – handy for a quick sanity check
double sum() const;
// simple accessors
size_t getRows() const { return rows; }
size_t getCols() const { return cols; }
};
// Benchmark driver – defined in a separate .cpp file
void benchmark_matrix_ops();
#endif // MATRIX_OPERATIONS_H
修复内容
| 问题 | 原始 | 已修复 |
|---|---|---|
| 缺少 include guard 结束标记 | #endif // MATRIX_OPERATIONS_H 出现在类定义 之前 | 将 guard 移动,使其包裹整个文件 |
#include 行为空 | #include | 添加所需头文件(<cstddef>、<vector>、<iostream>) |
| 向量声明语法错误 | std::vector> data; | 改为 std::vector<std::vector<double>> data; |
| 未闭合的注释 / 多余文本 | "Time: " | 删除 – 这不是头文件的一部分 |
| 函数原型缺少分号 | 无 | 在需要的地方为每个原型添加 ; |
源文件 main.cpp
#include "matrix_operations.h"
#include <iostream>
int main() {
std::cout << "Matrix Operations Benchmark\n"
<< "============================\n";
#if defined(__x86_64__) || defined(_M_X64)
std::cout << "Running on x86‑64 architecture with AVX2 optimisations\n";
#else
std::cout << "Running on a non‑x86 architecture (e.g., ARM/Graviton)\n";
#endif
// Execute the benchmark – implementation lives in matrix_operations.cpp
benchmark_matrix_ops();
return 0;
}
修复内容
| 问题 | 原始 | 已修复 |
|---|---|---|
缺少 <iostream> 的包含 | #include(空) | 添加了 #include <iostream> |
#error 指令阻止了在 ARM 上的编译 | #error "This code requires x86-64 architecture with AVX2 support" | 已替换为运行时消息;代码现在可以在任何架构上编译。 |
| 缩进不一致 / 多余空格 | 混合使用制表符和空格 | 已规范为 4 空格缩进 |
不必要的 using namespace std;(不存在)——保留显式的 std:: 以保持清晰 | – | 无需更改 |
如何使项目兼容 ARM
-
移除 AVX2 内在函数 – 用可移植的 SIMD 库(例如 xsimd 或编译器自动向量化)替代。
-
更新 Dockerfile
# 使用兼容 ARM 的基础镜像 FROM public.ecr.aws/ubuntu/ubuntu:22.04-arm64 # 安装构建工具 RUN apt-get update && apt-get install -y \ build-essential cmake git \ && rm -rf /var/lib/apt/lists/* # 复制源码并构建 COPY . /app WORKDIR /app RUN cmake -B build && cmake --build build -j$(nproc) -
使用相应的编译选项
g++ -O3 -march=armv8.2-a+simd -std=c++20 -I. -o matrix_demo main.cpp matrix_operations.cpp -
在 Graviton 上运行容器 – 镜像现在可以在没有 x86 特定检查的情况下启动,并且能够利用 ARM 原生 SIMD 扩展。
快速测试
# 本地构建(ARM 主机或通过 Docker 模拟)
docker build -t matrix-bench:arm .
# 运行
docker run --rm matrix-bench:arm
预期输出:
Matrix Operations Benchmark
============================
Running on a non‑x86 architecture (e.g., ARM/Graviton)
[benchmark output…]
现在代码已完全可移植,您可以利用 Graviton 5 实例提供的高性价比性能。祝编码愉快!
将 Kiro + MCP 迁移到 ARM
代码中包含许多 x86 特定的内在函数,但 Kiro 可以自动处理转换。
1. 配置 Kiro 以连接 ARM MCP 服务器
在项目根目录创建文件 .kiro/settings/mcp.json:
{
"mcpServers": {
"arm-mcp": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/path/to/your/code:/workspace",
"armlimited/arm-mcp:1.0.1"
]
}
}
}
注意事项
- 该命令通过 Docker 运行 ARM MCP 服务器。
- 将
/path/to/your/code替换为项目的绝对路径。 - Kiro 会自动识别新服务器。通过在聊天中输入
/mcp验证连接;你应该会看到列出arm-mcp及其工具。
2. 在聊天中进行快速检查
你可以让 Kiro 执行临时检查,例如:
Check the base image in the Dockerfile for ARM compatibility
Kiro 将使用 MCP 工具并报告 centos:6 仅支持 amd64。
3. 使用引导文档自动化迁移
创建 .kiro/steering/arm-migration.md:
---
inclusion: manual
---
Your goal is to migrate a codebase from x86 to ARM. Use the MCP server tools to help you with this. Check for x86‑specific dependencies (build flags, intrinsics, libraries, etc.) and replace them with ARM‑equivalent ones, ensuring compatibility and optimizing performance. Examine Dockerfiles, version files