Может ли лучшая видеокарта или больше ядер ускорить Mathematica?

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

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

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

Ответ 1

Я бы не сказал, что 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}

и с поддержкой GPU

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], который вычисляет выражение с помощью автоматического распараллеливания

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

Out[141]= {63.8650000, Null}

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

Ответ 2

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

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

Ответ 3

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

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

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