gpt4 book ai didi

c - 并行编程中的一个奇怪案例

转载 作者:太空狗 更新时间:2023-10-29 14:57:47 24 4
gpt4 key购买 nike

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

来自 main.c内部主要功能:

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
}

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

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;
}

bf_dup_eleminate_read来自 bloom-filter.c文件:

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 报告了这个错误是:

ID | Problem                         |  Sources       
P1 | Unhandled application exception | bloom-filter.c

调用堆栈是:

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 是一个结构定义为

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;
};

它的内存分配如下:

    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 中生成线程的关键字。

最佳答案

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

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 )

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

我会检查或尝试修复此错误的事情(没有一个能保证有效,其中一些你可能已经尝试过):

  1. 确保您没有超出您在程序的其他部分声明的任何局部变量使用的任何空间。

  2. 确保您没有写入已声明为局部变量然后从程序其他部分的函数返回的指针。

  3. 确保每个线程都有足够的堆栈空间来处理您声明的所有局部变量。您要声明任何大型的基于堆栈的缓冲区吗?默认的每线程堆栈大小取决于编译器设置,或者在本例中为 cilk 库。尝试在编译时增加每线程堆栈大小,看看崩溃是否消失。

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

关于c - 并行编程中的一个奇怪案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11286676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com