繁体   English   中英

使用线程> 4的SSE指令在openMP程序中出现分段错误

[英]Segmentation fault in openMP program with SSE instructions with threads > 4

我编写了一个使用SSE指令的简单C ++ openMP程序,当线程数大于4时,我遇到了段错误。我在Linux上使用g ++。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <emmintrin.h>
#include <assert.h>
#include <stdint.h>
#include <omp.h>

unsigned **a;

void f(int input_index){
    int j;
    __m128i* t = (__m128i*) a[input_index];
    for(j=0; j<4; j++)
            t[j] = _mm_set1_epi32(input_index* lenS);
}

int main(int argc, char *argv[])
{
int i,j,nThreads,tid;
bitD = new unsigned*[4];
for(i=0; i<4; i++)
    bitD[i] = new unsigned[16];

omp_set_num_threads(8); 

#pragma omp parallel private(i,nThreads,tid)
{
    tid = omp_get_thread_num();
    nThreads = omp_get_num_threads();                
    for(i=0; i<(4/nThreads); i++){
            f(i*nThreads+tid);                        
     }              
}


for(i=0; i<4; i++)
    for(j=0; j<16; j++)
        printf("a[%d][%d]=%d\n",i,j,bitD[i][j]);
}

正如我在上面的评论中已经提到的,您的问题与SSE指令的使用无关(至少与您发布的代码无关)。 原因是,如果使用四个以上线程,则循环

for(i=0; i<(4/nThreads); i++)  /* (4/nThreads) == 0 */

永远不会输入,永远不会调用函数f

得出的结论是,如果线程多于4个,则bitD[i][j]的值未初始化。 但这通常不会导致分段错误。 为了安全起见,您可以在分配中初始化内存:

bitD[i] = new unsigned[16]();

注意最后的()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM