определение глобальной строковой переменной const для доступа к потокам в вызовах функций - PullRequest
0 голосов
/ 26 мая 2019

Разрешить глобальный доступ к константной строке из различных потоков, вызывающих функцию.

У меня есть следующий код, который выбирает случайный символ из списка символов (разрешенный алфавит) и добавляет его для формированияслучайное словоЯ использую это для генетического алгоритма, но когда я пытаюсь распараллелить его, чтобы сделать его быстрее (домашнее задание), но в конечном итоге он идет медленнее.После того, как я спросил моего профессора и исправил большинство проблем, последняя деталь заключается в том, что мой алфавит не позволяет читать несколько потоков одновременно.

Я попытался определить GENES, а затем использовать #pragma omp threadprivate(GENES), что являетсяКоманда, которую, по словам моего профессора, сработает.

Я пытался

const string GENES = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ"
#pragma omp threadprivate(GENES)

, которая возвращает это при компиляции.

error: ‘GENES’ declared ‘threadprivate’ after first use

Я также пытался

string GENES;
#pragma omp threadprivate(GENES)
GENES = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ;

, который возвращает:

error: ‘GENES’ declared ‘threadprivate’ after first use
#pragma omp threadprivate(GENES)
                             ^
error: ‘GENES’ does not name a type
GENES = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ 1234567890, .-;:_!\"#%&/()=?@${[]}";

Наконец, я попытался определить GENES в потоках и передать их в качестве параметра или жестко закодировать их в функцию.Все это замедляет работу программы.

Я ожидал, что программа будет работать быстрее, но на самом деле она идет медленнее, от 0,5 до 1-3 секунд после добавления потоков.Я проверил, и это не из-за времени создания потоков.

Это должно быть исправлено, сделав строку доступной для всех потоков, но я не могу скомпилировать и запустить любые решения, которые я нашел успешно.

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Мой алфавит не позволяет читать несколько потоков одновременно.

Это не правда.

Прекрасно читать из std::string с несколькими потоками! Поскольку это const, ни один поток не может записать в него 1 . Это и правильно и быстро 2 .

В целом в C ++ const подразумевает поточно-ориентированный . Оставьте GENES в курсе, это, скорее всего, не причина вашей проблемы с производительностью.

Если вы хотите выяснить проблемы с производительностью, я предлагаю использовать соответствующие инструменты анализа производительности для вашей платформы, которые знают о многопоточности / OpenMP. Если вы хотите задать вопрос о том, как улучшить параллельную производительность вашей программы, пожалуйста, наберите

  1. Включите минимальный воспроизводимый пример . Это не значит, что ваша вся программа должна быть включена . Но минимальная версия, которая имеет проблему с производительностью.
  2. Поделитесь своими конкретными результатами измерений и методологией.
  3. Расскажите, как вы компилируете программу, и спецификации системы, на которой вы ее запускаете (процессор и память)

1: не предполагая зла const_cast s

2: Если вы не поместите изменяемую глобальную переменную в одну и ту же строку кэша, что кажется довольно маловероятным.

1 голос
/ 26 мая 2019

Итак, я наконец-то получил его для компиляции с #pragma omp threadprivate(GENES), используя следующий код, благодаря другу:

extern const string GENES;
#pragma omp threadprivate(GENES)
const string GENES = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...