首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >并行编程中的一个奇怪的例子

并行编程中的一个奇怪的例子
EN

Stack Overflow用户
提问于 2012-07-02 08:23:06
回答 1查看 861关注 0票数 5

我有一个并行程序,它有时会运行,有时会出现分段错误。当强制使用3个线程运行时,可执行文件运行良好(基本上,它也使用单线程运行,这只是串行的),但当强制使用任何其他线程值运行时,它会出现分段错误。以下是场景:

从main函数内部的main.c

代码语言:javascript
运行
复制
cilk_for ( line_count = 0; line_count != no_of_lines ; ++line_count )
{
     //some stuff here
     for ( j=line_count+1; j<no_of_lines; ++j )
     {
         //some stuff here
         final_result[line_count][j] = bf_dup_eleminate ( table_bloom[line_count], file_names[j], j );
         //some stuff here
     }
     //some stuff here
}

bloom-filter.c文件中的bf_dup_eleminate函数:

代码语言:javascript
运行
复制
int bf_dup_eleminate ( const bloom_filter *bf, const char *file_name, int j )
{
    int count=-1;
    FILE *fp = fopen (file_name, "rb" );
    if (fp)
    {
        count = bf_dup_eleminate_read ( bf, fp, j);
        fclose ( fp );
    }
    else
    {
        printf ( "Could not open file\n" );
    }
    return count;
}

来自bloom-filter.c文件的bf_dup_eleminate_read

代码语言:javascript
运行
复制
int bf_dup_eleminate_read ( const bloom_filter *bf, FILE *fp, int j )
{
    //some stuff here
    printf ( "before while loop. j is %d ** workder id: **********%d***********\n", j, __cilkrts_get_worker_number());
    while (/*somecondition*/)
    {/*some stuff*/}
    //some stuff
}

我从intel inspector报告的这个错误是:

代码语言:javascript
运行
复制
ID | Problem                         |  Sources       
P1 | Unhandled application exception | bloom-filter.c

调用堆栈是:

代码语言:javascript
运行
复制
exec!bf_dup_eleminate_read - bloom-filter.c:550
exec!bf_dup_eleminate - bloom-filter.c:653
exec!__cilk_for_001.10209 - main.c:341

类似地,gdb也会在同一位置报告错误,它是:

现在gdb告诉我您有以下错误

0x0000000000406fc4 in bf_dup_eleminate_read (bf=<error reading variable: Cannot access memory at address 0x7ffff7edba58>, fp=<error reading variable: Cannot access memory at address 0x7ffff7edba50>, j=<error reading variable: Cannot access memory at address 0x7ffff7edba4c>) at bloom-filter.c:536

Line 536int bf_dup_eleminate_read ( const bloom_filter *bf, FILE *fp, int j )

其他详细信息:

现在我的bloomfilter是一个结构,定义为

代码语言:javascript
运行
复制
struct bloom_filter
{
    int64_t m;      //size of bloom filter.
    int32_t k;      //number of hash functions.
    uint8_t *array;
    int64_t no_of_elements_added;
    int64_t expected_no_of_elements;
};

并按如下方式分配内存:

代码语言:javascript
运行
复制
    bloom_filter *bf = (bloom_filter *)malloc( sizeof(bloom_filter));
    if ( bf != NULL )
    {
        bf->m = filter_size*8;      /* Size of bloom filter */
        bf->k = num_hashes;
        bf->expected_no_of_elements = expected_no_of_elements;
        bf->no_of_elements_added = (int64_t)0;
        bf->array = (uint8_t *)malloc(filter_size);
        if ( bf->array == NULL )
        {
            free(bf);
            return NULL;
        }
    }  

bloom_filter只有一个副本,每个线程都应该访问相同的副本(因为我没有修改任何东西,只读)。

谁能帮帮我,因为我被困在这里4天了,我就是想不出办法。最糟糕的是它运行了3个线程!

注意: cilk_for只是一个在cilk中产生线程的关键字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-02 12:01:36

当调试器告诉您这样的错误时:

代码语言:javascript
运行
复制
0x0000000000406fc4 in bf_dup_eleminate_read (
    bf=<error reading variable: Cannot access memory at address 0x7ffff7edba58>,
    fp=<error reading variable: Cannot access memory at address 0x7ffff7edba50>,
    j=<error reading variable: Cannot access memory at address 0x7ffff7edba4c>
) at bloom-filter.c:536

536: int bf_dup_eleminate_read ( const bloom_filter *bf, FILE *fp, int j )

它通常表示函数入口代码(称为函数"prologue")正在崩溃。简而言之,当CPU计算三个局部变量的地址并在堆栈上为它们分配空间时,堆栈已经损坏,CPU崩溃。

我将检查或尝试修复此错误的内容(这些内容都不能保证有效,而且您可能已经尝试过其中一些内容):

  1. 确保您在程序的其他部分中声明的任何局部变量没有溢出任何空间。
  2. 确保您没有写入已声明为局部变量然后从程序的其他部分中的函数返回的指针。
  3. 确保每个线程有足够的堆栈空间来处理您声明的所有局部变量。您是否声明了任何基于堆栈的大型缓冲区?默认的每线程堆栈大小取决于编译器设置,或者在本例中取决于cilk库。尝试在编译时增加每个线程的堆栈大小,看看崩溃是否会消失。

如果运气好的话,上面的其中之一应该可以帮助您缩小问题的根源。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11286676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档