Параллельные вычисления над функцией из связанной библиотеки в C - PullRequest
2 голосов
/ 23 августа 2011

Я новичок в параллельных вычислениях и ищу варианты и приемы.

Моя текущая проблема состоит в том, чтобы найти 2 32 независимых линейных уравнений типа B = AX; где размеры A [8x8], B [8x1] и X [8x1]; A является плотной матрицей.

Я использую функцию CLAPACK - zgelss для этого в последовательном порядке на процессоре Intel Core 7i, 4-ядерном, 8-поточном и компьютере Mac.

Более того, размер моей матрицы достаточно мал, чтобы использовать внутреннюю оптимизацию.

Я хочу применить параллелизм над этим циклом:

for (n = 0; n < 2^32; n++)
{...}

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

Несколько человек предложили использовать OpenMP , но после прочтения об OpenMP я обнаружил, что мы не можем применять директивы OpenMP к части кода, которая предварительно скомпилирована.

Если мы сделаем это, это будет работать, но это может быть небезопасно, потому что вы не можете приватизировать временные переменные внутри скомпилированных функций. {Пожалуйста, прокомментируйте правильно / неправильно / другое}

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

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Это правда, что, если вы не знаете, что библиотека, которую вы хотите вызвать, является поточно-ориентированной, вы не можете просто выполнять потоковые вызовы.Однако, начиная с Lapack 3.3, все вызовы lapack являются поточно-безопасными (хотя, если вы используете другой базовый пакет BLAS для питания подпрограмм lapack, вы должны будете убедиться, что они также являются поточно-ориентированными).Clapack - это всего лишь тонкий слой оберток вокруг разговоров в кармане;они должны быть поточно-безопасными [ Edit : это неправильно, как указано в janneb ниже;Clapack - это прямой автоматический перевод C старой версии Lapack, поэтому он, вероятно, не является поточно-ориентированным], но если вы не можете ничего найти в документации, чтобы убедиться в этом, достаточно просто (если немного неудобно) вызватьФортран подпрограммы напрямую.

Альтернативой может быть выполнение различных вызовов функций в разных процессах, а не в потоках.Это займет немного больше времени, но это достаточно просто.Каноническим способом было бы использование MPI - что имеет определенные преимущества, но может быть в этом случае чрезмерным убийством.

0 голосов
/ 29 августа 2011

с помощью информации, предоставленной Джонатаном и Яннебом, я могу успешно распараллелить функцию zgelss, используя openMP.

Я использовал LAPACK 3.3 и создал свой собственный интерфейс FORTRAN to C.

...