Будет ли лучшая видеокарта или больше ядер сделать Mathematica быстрее? - PullRequest
11 голосов
/ 27 декабря 2011

В общем, может ли Mathematica автоматически (т.е. без написания кода специально для этого) использовать аппаратное обеспечение графического процессора и / или распараллеливать встроенные операции на нескольких ядрах?

Например, для рисования одного графика с очень интенсивной загрузкой процессора или решения уравнения с очень интенсивной загрузкой процессора обновление ускорится? Будет ли ускорение перехода на процессор с большим количеством ядер? (Я понимаю, что больше ядер означает, что я мог бы решать больше уравнений параллельно, но мне любопытно, в случае одного уравнения)

Просто пытаюсь понять, как Mathematica эксплуатирует аппаратное обеспечение.

Ответы [ 3 ]

11 голосов
/ 27 декабря 2011

Я бы не сказал, что Mathematica автоматически выполняет вычисления на GPU или Paralell-CPU, по крайней мере, в целом.Поскольку вам нужно что-то делать с ядрами paralell, вам следует инициализировать больше ядер и / или загрузить CUDALink или OpenCLLink и использовать специальные функции Mathematica, чтобы использовать потенциал ЦП и / или ГП.

Например, у меня нет очень мощной видеокарты (NVIDIA GeForce 9400 GT), но мы можем проверить, как работает CUDALink.Сначала я должен загрузить CUDALink:

Needs["CUDALink`"] 

Я собираюсь проверить умножение больших матриц.Я выбираю случайную матрицу 5000 x 5000 действительных чисел в диапазоне (-1,1):

M = RandomReal[{-1,1}, {5000, 5000}];

Теперь мы можем проверить время вычислений без поддержки графического процессора

  In[4]:= AbsoluteTiming[ Dot[M,M]; ]

  Out[4]= {26.3780000, Null}

и с поддержкой графического процессора

In[5]:= AbsoluteTiming[ CUDADot[M, M]; ]

Out[5]= {6.6090000, Null}

В этом случае мы получили увеличение производительности примерно в 4 раза, используя CUDADot вместо Dot.

Edit

Чтобы добавить пример параллельного ускорения ЦП (на двухъядерном компьютере), я выбираю все простые числа в диапазоне [2^300, 2^300 +10^6].Сначала без распараллеливания:

In[139]:= AbsoluteTiming[ Select[ Range[ 2^300, 2^300 + 10^6], PrimeQ ]; ]

Out[139]= {121.0860000, Null}

при использовании Parallelize[expr], который вычисляет expr с помощью автоматического распараллеливания

In[141]:= AbsoluteTiming[ Parallelize[ Select[ Range[ 2^300, 2^300 + 10^6], PrimeQ ] ]; ]

Out[141]= {63.8650000, Null}

Как и следовало ожидать, мы получили почти в два раза более быструю оценку.

8 голосов
/ 27 декабря 2011

Обычно нет, более быстрый графический процессор не ускоряет обычные Mathematica вычисления.

Вы должны использовать функции, поддерживаемые Cuda / OpenCL, чтобы использовать графический процессор. Вы можете получить обзор опций и некоторые примеры их использования здесь: Поддержка CUDA и OpenCL .

4 голосов
/ 27 декабря 2011

Я не могу комментировать то, как Mathematica использует графический процессор (поскольку у меня никогда не было возможности попробовать), но я не верю, что он делает это по умолчанию (, т.е. без написания вами кода специально для использованияGPU )

Добавление большего количества ядер поможет, если вы явно распараллелите свои вычисления ( см. Parallelize и связанные функции ).

Если вы не распараллелитеЯ уверен, что все еще существуют определенные численные расчеты, в которых используются преимущества нескольких ядер.Я не уверен, какой именно, но я знаю, что некоторые функции, связанные с линейной алгеброй (LinearSolve, Det и т. Д.) По умолчанию используют несколько ядер.

...