c++ - 使用 SSE 指令的 openMP 程序中线程 > 4 的段错误

标签 c++ multithreading segmentation-fault openmp sse

我写了一个简单的 C++ openMP 程序,它使用 SSE 指令,当线程数大于 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 指令的使用无关(至少与您发布的代码无关)。原因是如果你使用超过4个线程,循环

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

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

对此的结论是,在超过 4 个线程的情况下,bitD[i][j] 的值未被初始化。但这通常不会导致段错误。为了安全起见,您可以在分配中初始化内存:

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

注意最后的 ()

关于c++ - 使用 SSE 指令的 openMP 程序中线程 > 4 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29044588/

相关文章:

c++ - 在 Visual Studio 中启用单个警告

C# 内存模型、锁定和同步

c++ - Qt - 找不到 'thread' 文件

JavaFX 仅在另一个线程 hibernate 时更新

c - 使用 strtok 的段错误

c - 结构行为的段错误

c++ - boost odeint有蛙跳算法吗?

c++ - Boost.Filesystem create_directories 破坏目录名称

将字列转换为整数的 C 程序

C++ 使用 Winsock 写入/读取套接字