Сделает ли Mathematica более быструю видеокарту или большее количество ядер?

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

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

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


person nicolaskruchten    schedule 26.12.2011    source источник
comment
Я бы предположил, что это зависит от операции и от того, использует ли она графический процессор и каким образом. Осмелюсь предположить, что большинство составных операций не используют GPU, поскольку программирование на GPU существенно отличается от программирования на CPU. Например, БПФ хорошо вписывается в модель графического процессора, но набор уравнений, которые нельзя решить с помощью линейной алгебры, скорее всего, представляет собой совершенно другую историю.   -  person    schedule 27.12.2011
comment
Наверное, я спрашиваю, используют ли встроенные функции Mathematica GPU...   -  person nicolaskruchten    schedule 27.12.2011
comment
Вы заявили / подразумевали, что это так .. пропущено слово? :) Формы/брошюры Mathematica были бы местами, чтобы узнать это: определенно не здесь, если только вопрос не был о написании таких операций.   -  person    schedule 27.12.2011
comment
мой небольшой опыт выполнения базовых симуляций в M заключается в том, что вычисления в M выполняются ОЧЕНЬ быстро, но что мне кажется медленным, так это рендеринг графиков и графики. Так что все, что вы можете сделать, чтобы оптимизировать эту часть (более разумный способ создания графиков/графиков, использование таких параметров, как PerformanceGoal->"Speed" и MaxPlotPoints, и многие другие подобные вещи, поможет. Так что я бы предположил, что более быстрая видеокарта поможет. Что касается других аспектов. , M может использовать GPU с CUDA, я не использую эту часть.   -  person Nasser    schedule 27.12.2011
comment
@Насер, у меня то же самое. Рендеринг гистограмм и графиков DateListPlots часто является шагом, определяющим скорость, даже с PerformanceGoal->"Speed". DateListPlot работает медленно, потому что функции даты и времени в Mma очень медленные. Я хотел бы увидеть увеличение скорости в 50 раз, чтобы сделать их конкурентоспособными, например. VBA.   -  person Mike Honeychurch    schedule 27.12.2011
comment
Близкое голосование по этому вопросу является еще одним доказательством того, почему нам нужен сайт StackExchange, посвященный Mathematica.   -  person Verbeia    schedule 28.12.2011
comment
@Verbeia - я уважаю ваш оптимизм, но не завышайте свои ожидания. Технические специалисты в административных (властных) ролях могут стать властными всезнайками и таким образом оттолкнуть других.   -  person nilo de roock    schedule 29.12.2011
comment
@ndroock1 Я думаю, что этот разговор должен быть в чате   -  person Verbeia    schedule 29.12.2011


Ответы (3)


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

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

Needs["CUDALink`"] 

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

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

Теперь мы можем проверить время вычислений без поддержки GPU.

  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.

Изменить

Чтобы добавить пример параллельного ускорения ЦП (на двухъядерной машине), я выбираю все простые числа в диапазоне [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}

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

person Artes    schedule 26.12.2011
comment
Привет Artes, у меня есть связанный вопрос. Я получаю новый ноутбук в основном для использования с Mathematica. Вы говорите, что я должен сосредоточиться только на процессоре и не уделять особого внимания графическому процессору? - person Y2H; 15.04.2018
comment
@ Y2H Это слишком общая проблема, в основном вы можете многое получить от своего графического процессора, тем не менее, я бы сказал, что это второстепенное значение, в первую очередь, процессор и оперативная память, еще более важным будет стиль программирования в Mathematica. - person Artes; 15.04.2018

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

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

person Mr.Wizard    schedule 26.12.2011

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

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

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

person Szabolcs    schedule 26.12.2011
comment
Я знаю, что некоторые операции обработки изображений также будут использовать несколько ядер по умолчанию. - person Brett Champion; 27.12.2011
comment
Решение собственной системы (плотной или разреженной) также автоматически использует много ядер. - person acl; 28.12.2011
comment
@acl Я пробовал Eigenvalues на двухъядерном процессоре, но он использовал только одно ядро. Может быть, Eigensystem да, а Eigenvalues нет (это было бы необычно)? Я не могу проверить прямо сейчас. - person Szabolcs; 28.12.2011
comment
Он определенно использует 2 или 4 ядра для нахождения первых 100 собственных векторов разреженной системы, которую я только что попробовал. Это может зависеть от машины, поскольку она, вероятно, просто использует LAPACK (хотя я предполагаю, что mma включает в себя свои собственные библиотеки). - person acl; 28.12.2011
comment
Следует добавить, что количество параллельных процессов, которые вы можете запустить, зависит от вашей лицензии. При стандартной лицензии Parallelize будет распределять вычисления, если это возможно, между 4 ядрами. Конечно, вы можете иметь лицензию, которая позволяет больше, или использовать gridMathematica. - person Searke; 28.12.2011
comment
Итак, я только что попробовал With[{upN = 10000, sites = 2000}, sp = SparseArray[Thread[RandomInteger[{1, sites}, {upN, 2}] -> RandomReal[{0, 1}, upN]], {sites, sites}]]; {evals, evecs} = Eigensystem[sp, -500]; (который создает разреженный массив, а затем получает собственные значения и собственные векторы), и он использует оба ядра моего macbook. Я также запустил его на одной из своих офисных машин через ssh, и там он использует все 4 ядра (linux). - person acl; 28.12.2011
comment
@Searke Лицензия ограничивает количество параллельных ядер, которые вы можете запустить; однако то, что я описываю, - это одно ядро ​​​​mathkernel, занимающее 200% (или 400%). Я не уверен, ограничено ли это лицензией или нет, и не могу проверить. - person acl; 28.12.2011
comment
@Searke Вы можете проверить это, используя $MaxLicenseSubprocesses. Как и acl, я не верю, что это ограничение применимо к многоядерным числовым вычислениям, таким как LinearSolve. - person Szabolcs; 28.12.2011