3

我正在使用 ARM926EJS。在没有 Linux 的情况下,我在内存复制测试中的内存速度提高了 20%(就像入门可执行文件一样)。但在 linux 中,相同的代码运行速度要慢 20%。

代码是

 
/// 下面的代码只是执行突发模式的内存复制测试。        
void asmcpy(void *a, void *b, int iSize)
{
   做
  {
    asm易失性(
             "ldmia %0!, {r3-r10} \n\t"
             "stmia %0!, {r3-r10} \n\t"
             :"+r"(a), "+r"(b)
             :
             :"r"(r3),"r"(r4),"r"(r5),"r"(r6),"r"(r7),"r"(r8),"r"(r9), “r”(r10)
             );
  }而(大小--)
}

我确认没有其他进程在 linux 上占用 CPU 时间。(我使用 time 命令检查了这一点,它显示实时与usr time相同 )

请告诉我linux可能有什么问题?

感谢和问候。

添加:

我的测试代码是

主函数()
{
  int a[320 * 120],b[320 * 120];

 for(int i=0; i != 10000; i++)
 {
   /// 大小除以 8 因为我们的 memcpy 函数在迭代中执行了 8 个整数加载存储
   asmcpy(a, b, (320 * 120) / 8);
 }
}

Getting Started 可执行文件是一个 bin 文件,它使用串行端口发送到 RAM,并通过跳转到 RAM 中的该地址直接执行。(无需操作系统)

添加。

我没有在其他处理器上看到这样的性能差异。他们使用的是 SD RAM,这个处理器使用的是 DDR Ram。可以是一个理由吗?

添加。入门代码中未启用数据缓存,并且在 Linux 模式下启用了数据缓存,因此理想情况下,所有数据都应被缓存并在没有任何 RAM 延迟的情况下进行访问,但 Linux 仍然慢 20%。

补充:我的微控制器是 LPC3250。两项测试均在相同的外部 DDR RAM 上进行了测试。

4

4 回答 4

10

这个芯片有一个 MMU,所以 Linux 很可能用它来管理内存。也许只是启用它会带来一些性能损失。此外,Linux 使用惰性内存分配策略,仅在第一次访问进程时才将内存页分配给它。如果您要复制一大块内存,MMU 将生成页面错误以要求内核在循环内分配页面。在低端处理器上,所有这些上下文切换都会导致缓存刷新并导致明显的减速。

如果您的系统足够小,请尝试无 MMU 版本的 Linux(如uClinux)。也许它会让你使用性能相似的更便宜的芯片。在嵌入式系统上,每一分钱都很重要。

更新:一些额外的细节:

每个 Linux 进程都有自己的内存映射,起初这仅包括内核和(也许)可执行代码。所有其余的线性 4GB(32 位)似乎都可用,但没有分配给它们的 RAM 页面。一旦您读取或写入未分配的内存地址,MMU 就会发出页面错误信号并切换到内核。内核发现它仍然有很多空闲的 RAM 页面,因此选择一个,将其分配给故障点并返回到您的代码,从而完成中断的指令。下一个不会失败,因为已经分配了整个页面(通常为 4KB);但是几次迭代之后,它会碰到另一个未分配的空间,MMU 将再次调用内核。

于 2009-09-09T14:57:29.533 回答
3

你是如何执行计时的?您的示例中没有计时代码。

您确定您没有测量进程加载/卸载时间吗?

两种情况下的处理器时钟速度是否相同?

如果使用外部 SDRAM,两种情况下的 RAM 时序是否相同?

是否在这两种情况下都启用了数据缓存?

克利福德

于 2009-09-09T19:06:27.963 回答
2

入门不仅仅是“可执行文件”。必须有一些代码来设置 DDR 控制器寄存器。

如果还启用了缓存,那么 MMU 也必须启用。我认为在 ARM926EJS 上,没有 MMU 就没有数据缓存。

我相信每次上下文切换都会导致缓存刷新,因为缓存是虚拟索引的,虚拟标记的,并且内核和用户空间不共享相同的地址空间,因此与没有操作系统相比,您可能有更多不需要的缓存刷新。

这是一篇关于运行 Linux 时 VIVT 缓存刷新成本的论文

于 2009-09-10T06:58:05.310 回答
1

您使用的是什么微控制器(不仅仅是什么 ARM CPU)?

在非 Linux 运行中,您正在测试的阵列是否有可能是微控制器设备本身的 RAM,而在 Linux 测试中,正在测试的阵列是否在外部 RAM 中?内部 RAM 的访问速度通常比外部 RAM 快得多 - 这可能是 Linux 测试速度较慢的原因,即使仅为 Linux 运行启用数据缓存也是如此。

于 2009-09-10T15:07:00.710 回答