流式传输存储英特尔 MIC 上的分段故障



我想在英特尔 MIC 上的代码中实施流存储。我有一个force_array和 3 个变量 tempx、tempy 和 tempz。我需要做一些计算,然后将它们存储在另一个数组中,该数组在不久的将来不会使用。所以我觉得流媒体商店将是提高性能的更好选择。但是我看到我遇到了分段错误,我不确定是因为负载还是存储。这段代码的前面和后面有几行代码,整个代码段位于两个 for 循环中,前面是 openmp 指令。由于它是一个并行程序,我无法很好地调试它。任何人都可以通过找出错误来帮助我吗?

提前致谢!!代码给出如下:

    for(k=0;k<np;k++)    //np is the number of particles.
    {
      for(j=k+1;j<np;j++)
      {
        __m512d y1, y2, y3, y4, y5, y6;
        y1 = _mm512_load_pd(force_array + k*nd + 0);
        y4 = _mm512_load_pd(&tempx);
        y1 = _mm512_sub_pd(y1,y4);
        y2 = _mm512_load_pd(force_array + k*nd + 1);
        y5 = _mm512_load_pd(&tempy);
        y2 = _mm512_sub_pd(y2,y5);
        y3 = _mm512_load_pd(force_array + k*nd + 2);
        y6 = _mm512_load_pd(&tempz);
        y3 = _mm512_sub_pd(y3,y6);
        _mm512_storenr_pd((f+k*nd+0), y1);
        _mm512_storenr_pd((f+k*nd+1), y2);
        _mm512_storenr_pd((f+k*nd+2), y3);
      }
   }

>_mm512_load_pd()要求从中加载的地址为 64 字节对齐。

数组fforce_array需要将其起始地址 64 字节对齐并与 _mm_alloc(size,64) 一起分配,或者像您所做的那样为堆栈对象声明__attribute__((aligned(64))

我认为这里的问题不是起始地址,而是内部循环期间计算的地址。 如果nd=3,这意味着当k=1 force_array开头的偏移量为 3 双精度即 24 字节时。

您需要将这些强制对象中的每一个填充到 8 个字节以使用对齐的负载,否则您将需要使用未对齐的负载。

此致敬意

阿拉斯泰尔

附言 y1 和 y2 加载 8 个仅相隔 8 个字节的双精度,您确定这是您要实现的目标吗?

最新更新