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

时间:2014-11-29 08:52:41

标签: intel-mic

我想在Intel 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);
      }
   }

1 个答案:

答案 0 :(得分:0)

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

数组fforce_array需要将它们的起始地址对齐,并使用_mm_alloc(size,64)进行分配,或者像对待堆栈对象一样声明__attribute__((aligned(64))

我认为这里的问题不是起始地址,而是内循环期间的计算地址。如果nd=3表示k=1force_array开头的偏移量为3倍,即24个字节。

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

致以最诚挚的问候,

Alastair

P.S。 y1和y2加载8个双倍,只相差8个字节,你确定这是你想要实现的吗?