Как связаны между собой alloca и безопасность потоков? - PullRequest
0 голосов
/ 30 января 2019

Общий вопрос теории.

Я пытаюсь собрать библиотеку из исходного кода (FFTW, если кому-то все равно, но это действительно не имеет значения), и я заметил, что есть возможность отключить использованиеalloca.

Мне известно об опасности использования alloca, но я оцениваю производительность FFTW с и без alloca.

Имеет ли allocaИзвестные проблемы с безопасностью потоков?Я наблюдаю экстремальное снижение производительности, когда использую определенное количество потоков с FFTW (которое, очевидно, вызывает alloca в фоновом режиме).Я придерживаюсь использования числа потоков, равного степени 2, если это имеет значение.

Возможно ли, что FFTW разделяет объекты в локальном стеке потока через alloca?Я просто пытаюсь понять, почему я вижу такие экстремальные хиты производительности с определенным количеством потоков.Тем не менее, я не совсем понимаю теорию того, что alloca действительно делает с потоками.

1 Ответ

0 голосов
/ 30 января 2019

Краткий ответ: Это не .alloca() гарантированно безопасен для MT.


Более длинный ответ: alloca() не сложная функция.По спецификации возвращает указатель на местоположение, которое может быть автоматически освобождено.Обратите внимание, что это больше не является хорошей практикой:

Функция alloca () возвращает указатель на начало выделенного пространства.Если выделение вызывает переполнение стека, поведение программы не определено.

Как видите, выделение может вызвать переполнение стека, поэтому пространство выделяется в стеке путем увеличения SP.Потоки разделяют кучу, но не стек, поэтому вы не столкнетесь с проблемами при многопоточном использовании alloca().

Более безопасный способ - использовать VLA, а не alloca(), потому что обаТо же самое и (как я подозреваю), VLA быстрее и легче.

...