Ще направи ли Mathematica по-бърза една по-добра графична карта или повече ядра?

Като цяло, може ли Mathematica автоматично (т.е. без да пише код специално за това) да използва хардуера на GPU и/или да паралелизира вградените операции в множество ядра?

Например, за начертаване на единична много интензивна CPU диаграма или решаване на много CPU интензивно уравнение, ще доведе ли надграждането на графичния хардуер до ускоряване? Надграждането до CPU с повече ядра ще ускори ли нещата? (Осъзнавам, че повече ядра означават, че мога да решавам повече уравнения паралелно, но съм любопитен за случая с едно уравнение)

Просто се опитвам да разбера как Mathematica използва хардуера.


person nicolaskruchten    schedule 26.12.2011    source източник
comment
Предполагам, че зависи от операцията и дали използва GPU и по какъв начин. Бих се осмелил да кажа, че повечето сложни операции не използват GPU, тъй като програмирането на GPU е значително различно от програмирането на CPU. Например, FFT се вписва добре в GPU модел, но набор от уравнения, които не могат да бъдат обработени чрез линейна алгебра, вероятно е съвсем различна история.   -  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
@Nasser, почти същото за мен. Изобразяването на хистограми и DateListPlots често е стъпката, определяща скоростта -- дори с PerformanceGoal->"Speed". DateListPlot е бавен, защото функциите за дата и час в Mma са много бавни. Бих искал да видя 50 пъти подобрение на скоростта, за да ги направя конкурентни с напр. VBA.   -  person Mike Honeychurch    schedule 27.12.2011
comment
Твърдите гласове по този въпрос са още едно доказателство защо се нуждаем от специфичен за Mathematica сайт StackExchange.   -  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 изчисления, поне като цяло. Тъй като трябва да направите нещо с паралелни ядра, тогава трябва да инициализирате повече ядра и/или да качите 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}

и с поддръжка на GPU

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], който оценява израз чрез автоматично паралелизиране

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 Това е малко твърде общ проблем, като цяло можете да получите много от вашия GPU, въпреки това бих казал, че е от второстепенно значение, първо имайте предвид CPU и RAM, още по-важен ще бъде стилът на програмиране в Mathematica. - person Artes; 15.04.2018

Като цяло не, по-бърз GPU няма да ускори нормалните изчисления на Mathematica.

Трябва да използвате функции, поддържани от Cuda/OpenCL, за да използвате GPU. Можете да получите общ преглед на опциите и някои примери за тяхното използване тук: Поддръжка на 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