当前位置:首页>学习笔记>CUDA学习笔记:如何通过提升计算强度来优化矩阵乘法(二)

CUDA学习笔记:如何通过提升计算强度来优化矩阵乘法(二)

  • 2026-02-22 10:57:05
CUDA学习笔记:如何通过提升计算强度来优化矩阵乘法(二)

1. 写在前面

咱们接着之前的CUDA学习笔记系列,继续深入优化矩阵乘法的性能。在上一篇 Kernel4 中,

CUDA学习笔记:如何通过提升计算强度来优化矩阵乘法(一)

我们沿着“提升计算强度(计算量 / 访存量)”这条主线做了第一个关键升级:让一个线程不再只计算 C 中的一个元素,而是计算同一列上连续 TM 个元素(TM×1)。这样做的直接收益是:Bs 中的某个标量会在一个线程内被复用 TM 次,从而减少了对 Bs 的重复访问,计算强度显著提升。

但 Kernel4 仍有一个明显的“形状限制”:在列方向(N 方向)上,一个线程仍然只负责 1 列输出。也就是说,一个线程做的工作是“细长条”(TM×1)。如果我们进一步让一个线程同时在行方向与列方向都负责多个输出,就可以进一步提高 shared memory 中加载的数据(As/Bs)的利用率,让每次从 SMEM 取到寄存器的数据产生更多 FMA,从而继续提升计算强度。

因此,本篇博客我们在 Kernel4 的基础上,引入2D Block Tiling(更准确说是:Thread Tile 从 TMx1 扩展为 TM×TN

每个线程负责计算 C 子块中的一个 TM×TN 的小矩形(thread tile),而不是 TM×1。


2. 基于 2D Block Tiling 实现单线程多行多列计算(TM×TN)

本节只讲“直觉与流程”,尽量不引入复杂索引表达式。索引推导与代码细节放到后面第 3、4 节。

Kernel5 的整体结构

  • 每个 block 负责 C 中一个 BM×BN 的子块(block tile);

  • 沿 K 维度以 BK 为步长滑动(滑窗),每次从 A 中取 BM×BK 大小的矩阵,从 B 中取 BK×BN大小的矩阵,加载到 shared memory(As/Bs);

  • 在 shared memory 上计算本轮 BK tile 对 C 子块的贡献,累加到寄存器里的部分和,直到走完整个 K。

Kernel5 的关键变化发生在“内层计算”(inner loops)部分:

  • Kernel4:一个线程负责 C 的 TM×1(同一列的 TM 个元素),每个 dotIdx 只加载 1 个 B 标量,并复用 TM 次。

  • Kernel5:一个线程负责 C 的 TM×TN(一个小矩形),每个 dotIdx 会从 As 中取 TM 个 A,从 Bs 中取 TN 个 B,然后在寄存器中做一次 TM×TN 的 outer-product(外积)累加,直接更新 TM×TN 个输出。

直观对比(一次 dotIdx 下的“访存 vs 计算”):

  • Kernel4:读取约 TM+1 个标量,做 TM 次 FMA。

  • Kernel5:读取约 TM+TN 个标量,做 TM×TN 次 FMA。

当 TM、TN 都大于 1 时,计算量是乘法增长(TM×TN),而读取量是加法增长(TM+TN)——这就是 Kernel5 相比 Kernel4 进一步提升计算强度的本质原因

Kernel5 计算流程示意图:

上图从 block 级 与 thread 级 两个视角,完整展示了 Kernel5 的计算流程。

在 outer loop(上半部分) 中,每个 block 固定负责计算 C 矩阵中的一个 BM×BN 子块。计算并不是一次完成的,而是沿着 K 维度以 BK 为步长滑动:每次从矩阵 A 中取一个 BM×BK 的子块,从矩阵 B 中取一个 BK×BN 的子块,并分别缓存到共享内存 As 和 Bs 中。随后,这两个共享内存子块在本轮 inner loop 中保持不变。

在 inner loop(下半部分) 中,Kernel5 的核心思想开始体现。与 Kernel4 不同的是,一个 thread 不再只负责 C 中的一列(TM×1),而是负责 C 中一个 TM×TN 的矩形微块。对于每一个 dotIdx,线程会从 As 中取出 TM 个 A 元素(同一列),同时从 Bs 中取出 TN 个 B 元素(同一行),并在寄存器中执行一次 TM×TN 的 outer-product,直接更新 TM×TN 个结果。

这种做法使得一次 dotIdx 下:

  • 从共享内存加载的数据量仅为 TM+TN

  • 但产生的计算量为 TM×TN 次乘加

下面我们对图中的元素进行逐块说明


2.1 上半部分:outer loop(Block 级视角)

左下:A 矩阵(BM × K)

  • 横轴:K

  • 纵轴:M

  • 蓝色横条:

    • 高度 = BM

    • 宽度 = BK

  • 箭头 →:  👉 A 的 BM×BK 子块在 K 方向滑动

for (bkIdx = 0; bkIdx < K; bkIdx += BK) {  // load As  A += BK;}

右上:B 矩阵(K × BN)

  • 横轴:N

  • 纵轴:K

  • 蓝色竖条:

    • 高度 = BK

    • 宽度 = BN

  • 箭头 ↓:  👉 B 的 BK×BN 子块在 K 方向滑动

B += BK * N;

右下:C 矩阵(BM × BN)

  • 绿色块:一个 block 负责的 C block tile

  • 标注:cRow=1, cCol=1

    • 表示这是第 (1,1) 个 block

✅ 关键理解点

一个 block:

  • 固定负责 一个 BM×BN 的 C 子块

  • 在 K 方向上反复:

    • 取 A 的 BM×BK

    • 取 B 的 BK×BN

    • 累加到同一块 C

✅ 这就是标准的 block tiling + K 滑窗

另外需要注意中间的标注:cached in SMEM

这句是非常重要但容易被忽略的提示

As 和 Bs 在 inner loop 期间是“不动的”

也就是说:

  • 每个 BK tile:

    • A(BM×BK) → As

    • B(BK×BN) → Bs

  • 然后 所有线程都只从 As/Bs 读,不再碰 global memory


2.2 下半部分:inner loop(Thread 级视角)

这部分是 Kernel5 的本质。

左下:As(BM × BK),标了 resIdxMdotIdx

  • 横轴:dotIdx(0…BK-1)

  • 纵轴:resIdxM / 行方向

  • 👉 一次 dotIdx 对应 As 的“一列”


右上:Bs(BK × BN),标了 dotIdxresIdxN

  • 横轴:resIdxN, 列方向

  • 纵轴:dotIdx(0…BK-1)

  • 👉 一次 dotIdx 对应 Bs 的“一行”

这两块合起来就是 kernel 里的:

for (uint i = 0; i < TM; ++i) {    regM[i] = As[(threadRow * TM + i) * BK + dotIdx];}for (uint i = 0; i < TN; ++i) {    regN[i] = Bs[dotIdx * BN + threadCol * TN + i];}

右下 C 微块(TM × TN)

图里标了:

  • TM:纵向

  • TN:横向

  • 每个线程计算 TMxTN 个结果,图中是 2x2

for (uint resIdxM = 0; resIdxM < TM; ++resIdxM) {    for (uint resIdxN = 0; resIdxN < TN; ++resIdxN) {      threadResults[resIdxM * TN + resIdxN] +=          regM[resIdxM] * regN[resIdxN];    }}

图中每个 thread:

  • 固定一个 (threadRow, threadCol)

  • 对应 C 中一个 TM×TN 的小矩形

  • 每个 dotIdx:

    • 从 As 取 TM 个 A

    • 从 Bs 取 TN 个 B

    • 做一次 TM×TN 的 outer-product


3. Block 和 Thread 的布局

这一节的目的只有一个:把"线程的几何关系”讲清楚。后面所有索引的写法,本质上都是基于这一节的布局。

3.1 block tile 与 thread tile

  • BlockTile:每个 block 负责结果矩阵 C 中 BM×BN 大小子块的计算。

  • ThreadTile:每个 thread 负责这个子块内的一个 TM×TN 小矩形的计算。

因此,一个 block 里 thread 的逻辑网格应该是:

  • 行方向:BM/TM 个 thread(把 BM 行铺满)

  • 列方向:BN/TN 个 thread(把 BN 列铺满)

这两者相乘就是 blockDim.x:

3.2 threadIdx.x → (threadRow, threadCol)

Kernel5 用 1D 的 threadIdx.x,但逻辑上拆成二维 thread 坐标:

const int threadCol = threadIdx.x % (BN / TN);const int threadRow = threadIdx.x / (BN / TN);

其中:

  • (BN/TN) 表示列方向一行有多少个 thread;

  • threadCol 是该 thread 在列方向的编号;

  • threadRow 是该 thread 在行方向的编号。

3.3 一个 thread 负责的 C 微块坐标

该 thread 负责的 TM×TN 微块左上角坐标(相对该 blocktile)是:

  • 行起点:threadRow * TM

  • 列起点:threadCol * TN

因此该 thread 覆盖:

  • 行:threadRow*TM ... threadRow*TM+TM-1

  • 列:threadCol*TN ... threadCol*TN+TN-1

举例(TM=TN=8):如果 threadRow=1, threadCol=2,它负责 C 子块内:

  • 行:8~15

  • 列:16~23

后面写回索引 C[(threadRow*TM+m)*N + threadCol*TN+n] 就是从这里来的。


4. Kernel5 的代码实现与计算流程解析(按执行顺序)

本节按真实执行流程介绍:GMEM → SMEM → REG → FMA → 写回 GMEM

4.1 outer loop:BK 滑窗与共享内存缓存(GMEM → SMEM)

Kernel5 的外层循环沿 K 维度以 BK 为步长滑动。每次滑动会把:

  • A 的 BM×BK 子块加载到 As

  • B 的 BK×BN 子块加载到 Bs

然后在 SMEM 上计算本轮贡献。

4.1.1 blocktile 定位与指针偏移

const uint cRow = blockIdx.y;const uint cCol = blockIdx.x;A += cRow * BM * K;B += cCol * BN;C += cRow * BM * N + cCol * BN;

这里把 A/B/C 指针移动到当前 block 负责的 tile 起点:

  • A:定位到第 cRow*BM 行的起点(列从 0 开始)

  • B:定位到第 cCol*BN 列的起点(行从 0 开始)

  • C:定位到该输出子块左上角


4.1.2 分配 shared memory(As/Bs)

shared float As[BM * BK];shared float Bs[BK * BN];
  • As: 在共享内存中缓存当前 K-tile 下 A 的 BM×BK;

  • Bs : 在共享内存中缓存当前 K-tile 下 B 的 BK×BN。


4.1.3 确定 “谁来搬运?”——装载索引与 strideA/strideB

Kernel5 与 Kernel4 的一个不同点是:一个 thread 可能需要加载多个元素,因此需要用 stride 来做均摊。

  • As 的装载索引:

const uint innerRowA = threadIdx.x / BK;const uint innerColA = threadIdx.x % BK;const uint strideA   = numThreadsBlocktile / BK;
  • Bs 的装载索引:

const uint innerRowB = threadIdx.x / BN;const uint innerColB = threadIdx.x % BN;const uint strideB   = numThreadsBlocktile / BN;

说明:

  • innerColA = tid % BK / innerRowA = tid / BK:把线程线性 id 映射到 As 的列宽 BK 上;

  • strideA = numThreads / BK:一次装载中,所有线程能覆盖 As 的多少行;

  • B 同理。


4.1.4 GMEM → SMEM 的装载与同步

for (uint loadOffset = 0; loadOffset < BM; loadOffset += strideA) {  As[(innerRowA + loadOffset) * BK + innerColA] =      A[(innerRowA + loadOffset) * K + innerColA];}for (uint loadOffset = 0; loadOffset < BK; loadOffset += strideB) {  Bs[(innerRowB + loadOffset) * BN + innerColB] =      B[(innerRowB + loadOffset) * N + innerColB];}__syncthreads();

这两段循环确保 As/Bs 的 tile 被完整搬入 SMEM,__syncthreads() 保证 block 内线程都能看到完整缓存。


4.1.5 指针前移:滑窗沿 K 维度移动

A += BK;B += BK * N;
  • A 在 K 方向向右移动 BK 列;

  • B 在 K 方向向下移动 BK 行。


4.2 dotIdx 的物理意义

A 的一列 × B 的一行(SMEM → REG 的一次取样)

在当前 BK tile 内,我们还要对 dotIdx = 0..BK-1 做累加:

for (uint dotIdx = 0; dotIdx < BK; ++dotIdx) {  // block into registers  for (uint i = 0; i < TM; ++i) {    regM[i] = As[(threadRow * TM + i) * BK + dotIdx];  }  for (uint i = 0; i < TN; ++i) {    regN[i] = Bs[dotIdx * BN + threadCol * TN + i];  }  for (uint resIdxM = 0; resIdxM < TM; ++resIdxM) {    for (uint resIdxN = 0; resIdxN < TN; ++resIdxN) {      threadResults[resIdxM * TN + resIdxN] +=          regM[resIdxM] * regN[resIdxN];    }  }}__syncthreads();

dotIdx 的物理含义可以这样理解:

  • 在 As(BM×BK)中固定 dotIdx,相当于取出 A tile 的第 dotIdx 列(长度为TM);

  • 在 Bs(BK×BN)中固定 dotIdx,相当于取出 B tile 的第 dotIdx 行(长度为TN)。

接下来每个线程只关心:

  • 这列里与自己 thread tile 对应的 TM 个 A 值

  • 这行里与自己 thread tile 对应的 TN 个 B 值


4.3 regM / regN 与 TM×TN 的 outer-product(REG 级计算核心)

Kernel5 在每个线程里维护三个“寄存器缓存数组”:

// allocate thread-local cache for results in registerfilefloat threadResults[TM * TN] = {0.0};// register caches for As and Bsfloat regM[TM] = {0.0};float regN[TN] = {0.0};

说明:这些无修饰符的局部变量通常会优先放到寄存器,但在寄存器压力过大时也有可能会被编译器放到 local memory。


4.3.1 从 SMEM 把 A 的 TM 个值缓存到 regM

for (uint i = 0; i < TM; ++i) {    regM[i] = As[(threadRow * TM + i) * BK + dotIdx];}

解释:

  • threadRow*TM 是该线程负责的 TM 行起点;

  • i 遍历这 TM 行;


4.3.2 从 SMEM 把 B 的 TN 个值缓存到 regN

for (uint i = 0; i < TN; ++i) {    regN[i] = Bs[dotIdx * BN + threadCol * TN + i];}

解释:

  • threadCol*TN 是该线程负责的 TN 列起点;

  • i 遍历这 TN 列;


4.3.3 outer-product:用 regM×regN 更新 TM×TN 个输出

for (uint resIdxM = 0; resIdxM < TM; ++resIdxM) {    for (uint resIdxN = 0; resIdxN < TN; ++resIdxN) {      threadResults[resIdxM * TN + resIdxN] +=          regM[resIdxM] * regN[resIdxN];    }}

这就是“outer-product(外积)累加”:

  • regM 是长度 TM 的向量(A 的 TM 个元素)

  • regN 是长度 TN 的向量(B 的 TN 个元素)

  • 二者外积得到一个 TM×TN 的矩阵,正好对应该线程负责的 C 微块

因此一次 dotIdx 下:

  • SMEM→REG 读取约 TM + TN 个标量

  • 计算产生 TM×TN 次 FMA(乘法级增长)

从而可以显著提升计算强度。


4.4 写回 C:为什么两个方向都要乘 tiling 系数(REG → GMEM)

当整个 K 方向的滑窗循环完成后,threadResults 保存了该 thread tile 的最终结果,需要写回到 C。

写回循环如下:

for (uint resIdxM = 0; resIdxM < TM; ++resIdxM) {    for (uint resIdxN = 0; resIdxN < TN; ++resIdxN) {      C[(threadRow * TM + resIdxM) * N + threadCol * TN + resIdxN] =          alpha * threadResults[resIdxM * TN + resIdxN] +          beta * C[(threadRow * TM + resIdxM) * N + threadCol * TN + resIdxN];    }}

这里的索引形式是 Kernel5 相比 Kernel4 最直观的区别:

  • 行方向:每 thread 负责 TM 行 → threadRow * TM + resIdxM

  • 列方向:每 thread 负责 TN 列 → threadCol * TN + redIdxN

由于 C 是行优先存储(row-major),一维寻址就是:C[row∗N+col]

代入 row/col 即得到上述写回索引:(threadRow * TM + resIdxM) * N + threadCol * TN + resIdxN

Kernel5 的完整数据通路:GMEM(A,B) →(装载)→ SMEM(As,Bs) →(每个 dotIdx 取 TM/TN)→ REG(regM,regN) →(outer-product 累加)→ REG(threadResults) →(写回)→ GMEM(C)


5. 总结

本篇博客延续"提升计算强度"这条主线,在 Kernel4 1D BlockTiling (TM×1)的基础上进一步引入 2D BlockTiling(TM×TN),把单线程的计算形状从“细长条”扩展为“矩形微块”。

Kernel5 的关键收益来自内层循环中计算模式的变化:在每个 dotIdx 下,线程把 As 的 TM 个元素与 Bs 的 TN 个元素缓存到寄存器中,通过一次 TM×TN 的 outer-product 更新 TM×TN 个输出,使得计算量随 TM×TN 成乘法增长,而读取量仅随 TM+TN 成加法增长,从而显著提高计算强度。


6. 参考

https://siboehm.com/articles/22/CUDA-MMM:《Kernel 5: Increasing Arithmetic Intensity via 2D Blocktiling》

https://github.com/siboehm/SGEMM_CUDA/tree/master

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-22 17:15:22 HTTP/2.0 GET : https://67808.cn/a/469442.html
  2. 运行时间 : 0.103186s [ 吞吐率:9.69req/s ] 内存消耗:4,693.95kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9508c7a5ac92b9f9c6f423491ff3fd58
  1. /yingpanguazai/ssd/ssd1/www/no.67808.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/no.67808.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/no.67808.cn/runtime/temp/6df755f970a38e704c5414acbc6e8bcd.php ( 12.06 KB )
  140. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000846s ] mysql:host=127.0.0.1;port=3306;dbname=no_67808;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001494s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000717s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000700s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001744s ]
  6. SELECT * FROM `set` [ RunTime:0.000587s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001802s ]
  8. SELECT * FROM `article` WHERE `id` = 469442 LIMIT 1 [ RunTime:0.001045s ]
  9. UPDATE `article` SET `lasttime` = 1771751723 WHERE `id` = 469442 [ RunTime:0.001441s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000597s ]
  11. SELECT * FROM `article` WHERE `id` < 469442 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000740s ]
  12. SELECT * FROM `article` WHERE `id` > 469442 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000457s ]
  13. SELECT * FROM `article` WHERE `id` < 469442 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003640s ]
  14. SELECT * FROM `article` WHERE `id` < 469442 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000995s ]
  15. SELECT * FROM `article` WHERE `id` < 469442 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006430s ]
0.104750s