2015-11-24 1 views
2

для моего проекта У меня есть программа R, которая много раз вызывает функцию C, реализованную с использованием #include <R.h> и #include <Rdefines.h>. Поскольку я хочу максимально ускорить весь алгоритм, я закодировал R-программу непосредственно на C++, поэтому, чтобы удалить слой трансляции между C и R. Я назвал ранее закодированную функцию C из C++ в качестве обычной функции. Я смог выполнить перевод и получить тот же результат.R вызов кода C быстрее, чем вызов функции C++ на C-код?

Глядя на время работы, я обнаружил, что выполнение R выполняется быстрее, чем C++ (2 м 10 с против 2 м 50 с). Чтобы узнать, где «проблема», я использовал два профайлера: gprof и Valgrind, которые сообщают об использовании времени выполнения в 99% времени с помощью внешней функции C. Это не дает мне объяснений в отношении этой разницы во время выполнения 30%, в то время как 99% времени тратится на выполнение одного и того же кода. Для интеграции C++ и C я попробовал обе ссылки на объектный файл C и связал все .o из C с созданием единой библиотеки (libExternal.a). Есть ли у вас какие-либо предположения, которые могут быть причиной этой разницы?

Я приложил часть отчета valgrind. Внешняя функция C подчеркнута. enter image description here

Спасибо!

Вот результат перфорация стат -d по программе C++: enter image description here Вот результат перфорация стат -d по программе R: enter image description here

Я хочу напомнить вам, что 99% времени проводится в функции C, которая одинакова для обоих. В коде C++ я просто создаю объекты перед передачей функции, поэтому данные должны быть рядом друг с другом в памяти. Благодарим за помощь.

+1

Включите код пожалуйста. – nrussell

+1

или включить * некоторые * код, который также показывает проблему. или даже код контрпримера. Выполнение этого может быть даже достаточно для вас, чтобы выяснить проблему самостоятельно ... – Spacedman

+0

Я не могу добавить код, так как он слишком длинный, и это не поможет. Что я могу сказать, чтобы объяснить, что делает алгоритм, так это то, что я выполняю итерацию по матрице данных, сделанной во входе, и в зависимости от индекса я динамически создаю несколько массивов, чтобы содержать некоторые результаты, и передаю массивы и матрицу данных в c функция, которая оценивает некоторые меры на них, возвращая массив. R делает то же самое, но объекты, которые проходят, являются объектами R, которые преобразуются в c-массивы с помощью кода c. – Nadir

ответ

2

Очевидно, что расположение памяти и доступ к памяти могут сыграть здесь решающую роль. В принципе, если процессор тратит 99% времени на функцию X(), это не значит, что он действительно что-то делает. Скорее всего, процессор ожидает доставки данных, а одна реализация ждет меньше (или больше), чем другая.

Я бы посоветовал проверить, используя perf набор, хиты кэш и промахов и т.д.

Ссылка: http://www.bnikolic.co.uk/blog/hpc-prof-events.html

+0

CPU не ждет данных внутри функции. C++ передает матрицу и некоторые массивы в качестве указателей, и они используются функцией. Вы правы, что это может быть проблема с кешем/ram, но я не могу понять, потому что массив только создается при передаче, а их положение в ram должно быть рядом с другим. – Nadir

+0

'ЦП не ждет данных внутри функции' - wll, CPU в значительной степени ВСЕГДА ждет данных, это характер современных зверей, поэтому у нас есть многоуровневые кеши и иерархия времени доступа. Вопрос только в том, как долго они ждут. Вы попробовали «perf stat»? –

+0

Я добавил perf stat -d результаты в обоих случаях. Спасибо за вашу помощь – Nadir

Смежные вопросы