我想在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);
}
}
答案 0 :(得分:0)
_mm512_load_pd()
要求您加载的地址为64字节对齐。
数组f
和force_array
需要将它们的起始地址对齐,并使用_mm_alloc(size,64)
进行分配,或者像对待堆栈对象一样声明__attribute__((aligned(64))
。
我认为这里的问题不是起始地址,而是内循环期间的计算地址。如果nd=3
表示k=1
从force_array
开头的偏移量为3倍,即24个字节。
您需要将每个强制对象填充到8个字节以使用对齐的加载,否则您将需要使用未对齐的加载。
致以最诚挚的问候,
Alastair
P.S。 y1和y2加载8个双倍,只相差8个字节,你确定这是你想要实现的吗?