У меня есть параллельная программа, которая иногда запускается, а иногда просто дает ошибку сегментации. Исполняемый файл при принудительном запуске с 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 536
is int bf_dup_eleminate_read ( const bloom_filter *bf, FILE *fp, int j )
Дополнительные детали:
Теперь мой фильтр цветения представляет собой структуру, определенную как
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.
cilk_for
создает log(no_of_lines) для базовых 2 задач, а затем присваивает его количеству потоков, навязанному программистом для использования программой. - person Aman Deep Gautam   schedule 02.07.2012bloom_filter
, я уверен, вы хотели написатьif ( bf->array == NULL ) { free(bf); ... }
в качестве последнего утверждения, не так ли... :-) - person aps2012   schedule 02.07.2012