英特尔 MKL 多线程矩阵向量乘法 sgemv() 在小中断后变慢

2023-11-29

我需要每 500 微秒运行一次多线程矩阵向量乘法。矩阵是一样的,向量每次都在变化。

我在 64 核 AMD CPU 上的 MKL 中使用 Intel sgemv()。如果我在一个小测试程序中计算没有间隙的 for 循环中的乘法,则每次调用 sgemv() 需要 20 微秒。如果我向 for 循环添加一个大约需要 500 微秒的自旋循环(轮询 TSC),则每次 sgemv() 调用的时间会增加到 30 微秒(如果我使用 OMP_WAIT_POLICY=ACTIVE,且 OMP_WAIT_POLICY=PASSIVE(默认值)),则甚至长达 60 微秒。

有谁知道会发生什么以及为什么休息时速度会变慢?可以采取什么措施来避免这种情况?

无论旋转循环是单线程还是在“#pragma omp parallel”上下文中,似乎都没有什么区别。在旋转循环中是否让 AVX 单元保持忙碌也没有什么区别。 CPU 内核是隔离的,测试程序以高优先级运行,并使用 SCHED_FIFO(在 Linux 上是这样)。

自旋等待功能:

static void spin_wait(int num)
{
  uint64_t const start = rdtsc();
  while( rdtsc() - start < num )
  {;}
}

for-loop

uint64_t t0[num], t1[num];
for( int i=0; i<num; i++ )    
{
  // modify input vector, just incrementing each element

  t0[i] = rdtsc();
  cblas_sgemv(...);
  t1[i] = rdtsc();
  spin_wait( 500us );
}

可能与上下文切换有关,因为您没有使用“真正的”实时操作系统。 也可能与缓存相关(或两者)。根据预测算法和问题的大小,如果您的代码仍然“热”并且您随后重复它数千次(即使对于与缓存相关的原因来说,美国范围似乎相当大,恕我直言,也许我们的范围似乎很大,那么缓存预取可能会工作得更好)如果还涉及 RAM 访问)。 我仍然不会排除频率缩放的原因,因为处理器可能会遇到功率限制,迫使其缩小一点(AVX2 指令通常非常耗电……)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

英特尔 MKL 多线程矩阵向量乘法 sgemv() 在小中断后变慢 的相关文章

随机推荐