实验:1.0 基本香农熵块级重排\n\n目标:在 单个基本块 内,用 香农熵 度量指令分布混乱度,然后贪心重排使同 opcode 相邻,观察 SPEC2006/2017 子项 401.bzip2 的能量变化。\n\n---\n\n1. 环境\n\n- 硬件:i7-13700H,固定 3.6 GHz,Turbo/HT 关 \n- 软件:LLVM 18 Release + 手写 FunctionPass \n- 基准:401.bzip2(训练输入 `input.combined`) \n- 指标:`perf stat -e energy-pkg,task-clock,instructions,cycles` \n- 编译:`-O3 -fno-unroll-loops -mllvm -enable-entropy-v1`\n\n---\n\n2. 实现(60 行 Pass)\n\n```cpp\n// EntropyV1.cpp\nstruct EntropyV1 : public FunctionPass {\n static char ID;\n EntropyV1() : FunctionPass(ID) {}\n\n bool runOnFunction(Function &F) override {\n for (BasicBlock &BB : F) {\n if (BB.size() \u003C 4) continue;\n\n // 1) 统计 opcode 频次\n DenseMap\u003Cunsigned, unsigned> freq;\n for (Instruction &I : BB)\n ++freq[I.getOpcode()];\n\n // 2) 计算香农熵\n unsigned N = BB.size();\n double H = 0.0;\n for (auto [opc, c] : freq) {\n double p = 1.0 * c / N;\n H -= p * log2(p);\n }\n\n // 3) 贪心重排:按 opcode 频次升序,同 opcode 尽量连续\n SmallVector\u003CInstruction *> order;\n for (auto &I : BB) order.push_back(&I);\n std::stable_sort(order.begin(), order.end(),\n [&freq](Instruction *a, Instruction *b) {\n return freq[a->getOpcode()] \u003C freq[b->getOpcode()];\n });\n\n // 4) 原地重排