Посоветуйте видеокарту(ы)

В общем ситуация такая: нужны вычислительные мощности, первоначльно я склонялся в сторону кластера, но случайно зашел на CUDA статью, и, вроде как это для меня подходит. Решил попробовать.
За алгоритмами дело не станет, я сам программист и вполне способен разобраться. Вопрос встал о железе. Тут я стушевался. Я в игрушки почти не играю, видео не обрабатываю, потому мало знаю о конкретных видюхах. Попускав слюни на супер-модули tesla, я набил в гуле nvidia tesla цена и резко про них забыл. Я понимаю, что получить огромную производительность за гроши не получится, но хотелось бы получить максимум за те деньги, что есть. Лучше ли будет купить 2 (или 4) видеокарты поплоше, или 1 подороже их всех уделает по производительности(я так понял, что и 4 видюхи можно запрячь, но проще не возиться, купить 2 и SLI включить)? И если брать, то что примерно? Бюджет в районе 10000 (на видюхи). Апрегрейд не столь важен, если мне понравится, то через пол-года приобрету действительно мощную систему. Т.е. необходимо "поиграться", но уж совсем в песочнице возиться неохота... Так что лучше взять? Что-нибудь из линейки quadro постарее, или какой-нибудь GeForce? Посоветуйте пожалуйста.

Forums: 

Небольшой совет

Передо мной стоит похожая задача, правда бюджет у меня другой.
Вот то что я нашёл/узнал/подсказали:
-По поводу Tesla - лично проверял Tesla C1060 имеет точно такую же производительность на умножении матриц(использовались SGEMM и DGEMM от CuBlas, результат - 370SingleFlop/s, 76DoubleFlop/s) как и GTX280. Самое существенное отличие это увеличенный объём памяти - 4GB против 1GB. А цена отличается в разы. Так что если выбирать между C1060 и GTX280, нужно учитывать специфику Вашей задачи, быть может вам не нужен большой объём памяти?
-Скоро появится в продаже GTX480, NVidia вроде говорит про увеличенную во много раз скорость double вычислений. Я думаю что выход GTX480 должен повлиять на цены видеокарт в целом, так что если есть запас времени, лучше подождать выхода GTX480(даже если не собираетесь брать её).
-На данный момент я стою перед выбором - HD5870/GTX285/"Ждать GTX480" .
Конкретно сейчас, меня интересует разумное сравнение производительности GTX285 и HD5870 на какой-нибудь разумной задаче(хотя бы умножение матриц).
По тестам на FPS в играх побеждает вроде HD5870 (http://www.guruht.com/2009/09/ati-hd-5870-vs-gtx-285-benchmarks.html и т.п.). А вот по тестам вычислений везде какие-то разные результаты:
http://www.nix.ru/computer_hardware_news/hardware_news_viewer.html?id=15...
http://www.geeks3d.com/20100330/geforce-gtx-480-opencl-performance-tested/
http://www.bealto.com/gpu-benchmarks.html
По моему субъективному мнению HD5870 предпочтительнее GTX285
- На днях посмотрел рекомендации программирования OpenCL от ATI - "ATI Stream Computing OpenCL Programming Guide", и пришёл к выводу что оптимальный OpenCL код для видеокарт ATI 5XXX серии будет очень похож на оптимальный OpenCL код для NVidia - тот же coalescing, те же банки в локальной памяти и т.п.(если я ошибаюсь на этот счёт, буду рад если меня поправят... может использование векторов данных(float4 т.п.) сильно повлияет на код )
- Субъективно - ATI вкладывает меньше средств в продвижение и поддержку OpenCL/Stream и т.п чем Nvidia.

А вообще, какая у Вас задача? От этого очень многое зависит.

Ну, вообще, мне не нужно

Ну, вообще, мне не нужно нияего отображать или рендерить.
Мои алгоритмы имею кое-что общее с md5 брутфорсом и с нейронными сетяи. Т.е. высокопараллельные и прожорливые задачи. Спросил на форуме нвидии. Там сказали, что тесла есть кака, и для начала лучше брать что-нибудь из диапазона GTX260-295. Возьму 285 наверное.

MD5 НС

А я и не говорил ничего про отображение и рендеринг. Если вы про тесты FPS - они в какой-то мере характеризуют скорость вычислений, ведь по сути это и есть вычисления.
Всякие брутфорсы ключей прекрасно параллелятся и не требуют пересылки огромного количества данных/взаимодействия между потоками, поэтому очень хорошо подходят для GPGPU. Возможно вам будет интересен вариант с FPGA(для своей работы я его тоже рассматривал, и даже находил статьи о том что кто-то реализовал такую-же задачу как у меня.. но у меня нет времени на это). Вот пример - http://www.youtube.com/watch?v=zEwWvVP_RU0 . Концепция FPGA вычислений очень привлекательна - вы описываете логическую структуру на очень низком уровне, сами решаете сколько ALU/FPU поместить, какие связи/шины между блоками, быть может вам нужно лишь FPU сложение - значит вы можете использовать сэкономленные вентили для других целей. Можно поместить много параллельно работающих блоков, причём не обязательно эти блоки должны быть однотипные.
По поводу нейронных сетей. Симуляция нейронной сети тоже хорошо параллелится, но насколько я понимаю на каждом шаге требуется сбор промежуточных результатов(сумма, потом применение пороговой функции) чтобы получить результат шага. То есть например если у вас будет несколько видеокарт, то надо продумать их взаимодействие и т.п. Да и обучение сети, насколько я понимаю, тоже требует сбора результатов на каждой итерации... конечно всё зависит от типа/структуры нейронной сети, алгоритма обучения и т.п.

FPGA это круто, но дорого, да

FPGA это круто, но дорого, да и мощности мне не хватит. У меня в перспективе покупка 1u серверов. Если мне понравится, то буду собирать CUDA кластер, и на нем свою дуру гонять :).

CUDA эмуляция

CUDA имеет режим эмуляции - то есть выполнение CUDA кода эмулируется процессором, конечно будет медленно, но "пощупать" можете прямо сейчас.
Насколько я понимаю эмуляции OpenCL у NVidia ещё нет, но Cuda и OpenCL очень похожи, и портировать код не трудно.
У ATI есть поддержа использования OpenCL на CPU (но я не уверен, заработает/установиться без ATI карточки или нет)

В коде-то я своем уверен. Мне

В коде-то я своем уверен. Мне интересно именно на реальном девайсе обкатать. Нужно будет написать еще очень много кода, но этого не имеет смысла делать, если на реальном устройстве он будет тормозить. Т.е. я хочу на этой карточке научиться оптимизировать под CUDA, протестировать новые алгоритмы, ну а потом, если все получится, закупать мощности.

Cuda optimization

Как именно оптимизировать код CUDA, насколько я понимаю, зависит от версии Compute Capability.
У карт GTX 480/470(Fermi) новая версия - 2.0 .
Тут есть табличка по Compute Capability:
http://developer.download.nvidia.com/compute/cuda/3_0/toolkit/docs/NVIDI...

А вот документация по оптимизации:
http://www.serc.iisc.ernet.in/ComputingFacilities/systems/Tesla_Doc/NVID...
http://developer.download.nvidia.com/compute/cuda/3_0/docs/NVIDIA_FermiT...

Кстате, на счёт FPGA.

Кстате, на счёт FPGA. http://www.ll.mit.edu/HPEC/agendas/proc08/Day2/35-Day2-PosterDemoB-VanCo...
Как я понял, на 3SE260(вроде старая модель) достигли около 50GFlop/s на умножении матриц.
Да, конечно дорого, но вот если в будущем они подешевеют и разовьются, FPGA могут составить конкуренцию видеокартам в плане вычислений. Что будет пинком грязным трюкам, типа 1/4 от возможной скорости, невозможность использовать ECC и т.п.

Если есть готовый код,

Если есть готовый код, который надо только "скомпилировать и запустить", я могу прогнать на 5870 и 280GTX.
Много времени на это не могу потратить, а полчаса как-нибудь вечером - запросто.
Идеально, если это будет готовый VS2008-проект, чтобы мне голову не включать (тем более, она вечером плохо включается). Т.е. я помню про ваше желание код умножения матриц прогнать, но тут нужно именно голову включить, лучше бы совсем готовый код с правильными таймерами и т.п.

По моим личным впечатлениям, даже 280-ка при правильном использовании - заметно быстрее 5870, но это может быть у меня задачи такие, а может быть просто к NVidia я привык, а на 5870 делаю какие-то мелкие, но неприятные ошибки (в смысле организации доступа к памяти и т.п.)

GTX285 HD5870

А чем плох OpenCL'овский MatrixMultiplication из примеров которые идут с ATI Stream SDK?

Если GTX285 окажется быстрее HD5870, я буду только рад, так как всегда предпочитаю продукты NVidia.

Умножение матриц - это такое

Умножение матриц - это такое место, где оптимизация под конкретную архитектуру дает чудовищный эффект.

Я не запомнил конкретных цифр, но вроде бы получалось так: на этом тесте GTX280 медленнее 5870 раза в полтора.
Но при этом - CuBLAS работает раз в 10 (с точностью полпорядка, ибо по памяти пишу) быстрее. Волковский код для 4870 не запускал, но там должно быть тоже минимум на порядок быстрее.

Ну и сравнивать явно суб-оптимальные, но одинаковые реализации - глупо как-то.

OpenCL

Если речь идёт об оптимальном коде умножения матриц конкретно под HD5870, то его у меня нет, я ведь недавно только начал изучать GPGPU, да и чтобы написать оптимальный код под железо, желательно это железо иметь под рукой.

Насколько я понимаю оптимального кода умножения матриц нет для HD5870? Если это так, то хотелось бы узнать хотя-бы результат для "не оптимального" ATI Stream SDK MatrixMultiplication, чтобы иметь хотя-бы смутное представление.
Запуская не оптимальный код, мы узнаём хотя бы минимум на который способна железка. Ведь оптимальный код по-идее будет быстрее этого минимума?
Допустим для HD5870 на одинарной точности с не оптимальным кодом получим 300GFlop/s, ну ведь это о чём-то скажет? Понятное дело что это не даст право выносить приговор, что быстрее, а что нет.
Мне лучше узнать результат не оптимального умножения матриц чем смотреть на таблицы FPS в играх, и т.п.

OpenCL

Так же можно запускать тесты типа много MAD'ов во всех ядрах.
Или например тест - считать из памяти все значения из двух матриц по-одному разу, в самом оптимальном виде, без выполнения каких-либо операций над значениями(надеюсь компилятор это не съест оптимизацией).
Это даст нам представление о верхнем пределе производительности.

Безусловно делать глупые выводы на основание тестов это глупо.(тавтология раскрывает смысл. Ведь не обязательно делать глупые выводы?).

При считывании,

При считывании, организованном оптимально, вы получите bandwidth по памяти, а latency будет спрятана. Толку то?

Поймите, вообще абстрактных тестов какого-то качества, втч и на OpenCL и на DX11 (в смысле DirectCompute) в сети уже навалом. Они даже чуть более осмысленные, чем просто две цифирки.

Делать какие-то выводы для вашей задачи - невозможно, не зная ее.

Выводы

А я и не просил делать выводы для моей задачи. Решение что и когда покупать, я ведь сам принимать буду.

Я еще раз повторяю - этот

Я еще раз повторяю - этот пример примерно на порядок медленнее того, что мы можем ожидать получить. Почему - не знаю (NVidia-вский MatrixMul - тоже позорный, причем как бы не более).

Такие цифирки, конечно, лучше чем вообще ничего, но ориентироваться на них - вполне бессмысленно. Ну это как если бы мы сравнивали жигули и формулу-1 в вечерних пробках в Москве, формула скорее всего окажется чуть быстрее (за счет лучшей динамики есть шансы пару светофоров проскочить быстрее), но очевидно же, что сравнение очень хромое.

OpenCL

Я прекрасно понимаю что вы имеете ввиду и без примеров про машинки.

"Такие цифирки, конечно, лучше чем вообще ничего, но ориентироваться на них - вполне бессмысленно."
Да, вот именно, это лучше чем ничего. Я не собираюсь ориентироваться на эти две цифирьки.

Я получил примерно 100SignleGFlop/s для HD4850 на не оптимальном коде OpenCL от ATI Stream(без использования Local Storage). GTX280 которая стоит почти в три раза больше показывает 370GFlop/s с "оптимальным" CuBlas кодом. Это ведь о чём -то говорит, это ведь лучше чем ничего?

Что мешает вам показать результат не оптимального-отличающегося-примерно-на-пол-порядка-от-идеального-теста умножения матриц от ATI Stream и сделать надпись жирными буквами: "НЕ ДЕЛАТЬ НИКАКИХ ВЫВОДОВ"

Ну так - конечно, ничего не

Ну так - конечно, ничего не мешает, кроме того, что мне не нравятся результаты (не сами по себе, а именно в сравнении с тем, что можно получить на данном оборудовании). "Будем гоняться, но только на первой передаче".

И я беспокоюсь не столько за Вас, сколько за то, что эти результаты как-то пойдут в народ без контекста.

Там же засада понятно в чем - если у одной железки, скажем, 8k регистров, а у другой - 32k, то мы либо запускаем одинаковый код (и у второй тогда 3/4 local storage простаивает), либо пускаем разный, а тогда что мы сравниваем?

Конкретно с SGEMM - 5870 должна быть сильно (в разы, если не на порядок) быстрее, это я экстраполирую почти терафлопс 4870 на архитектуру 5xxx, а про GTX280 и так известно, что гигафлопсов 300-400. В тестах OpenCL же я вижу именно что "первую передачу" - результаты примерно на порядок медленне, чем ожидаемые.

Да, кстати, попробовал запустить тест на 5870 прямо сейчас, выяснил что от апгрейда драйверов на 10.3 - все сломалось. Уроды!

OpenCL

"И я беспокоюсь не столько за Вас, сколько за то, что эти результаты как-то пойдут в народ без контекста."
Я предполагал это. Тогда вопрос о запуске не оптимизированных тестов снят, спасибо за объяснение.

Вместе с тем, если я придумаю

Вместе с тем, если я придумаю какие-то разумные юнит-тесты, я конечно ими поделюсь. MatrixMultiplication в этом смысле мне очень не нравится, а вот NVidia-вские гистограммы, например, очень даже наоборот

Хоть я и отказывался, но

Хоть я и отказывался, но сегодня эти результаты на меня сами выпали в процессе разборки с новыми драйверами 10.4 от ATI и они настолько близкие, что их *можно* опубликовать :)

ATI-шный пример MatrixMultiplication.exe с параметрами -x 2048 -y 2048 -z 2048 -t цифирка гигафлопсов, которую он выдает:

HD5870:
Executing kernel for 1 iterations
-------------------------------------------
KernelTime (ms) : 53.5694
GFlops achieved : 320.703

GTX280:

Executing kernel for 1 iterations
-------------------------------------------
KernelTime (ms) : 58.985
GFlops achieved : 291.258

Но как я отношусь к этому тесту - я выше написал (на 5870 я вправе бы ожидать в разы больше, на 280ке CUDA 2.1beta тоже была процентов на 20-25 быстрее: http://www.gpgpu.ru/articles/sgemm-7.html)

Такие дела.

Спасибо за информацию! Как я

Спасибо за информацию!
Как я говорил, ко мне скоро(надеюсь без осложнений) прийдёт GTX480, если у кого-нибудь есть код для тестов, можете его постить. Только просьба в нормальном виде, желательно с CMakeLists.txt, ну или хотя бы vcproj/Makefile, результаты которые интересуют, выводить либо в файл, либо в stdout. На машине с GTX480 наверное подниму Linux(что-нибудь из rpm based, типа Fedora/Centos, нет времени возиться с Gentoo) и Windows(XP x64 либо Windows2008R2X64(наверное кому-то будет интересно - Mircrosoft даёт доступ студентам к своим продуктам(для образовательных целей) http://www.dreamspark.com/ , там есть и разные VS prof версий, и windows'ы серверных версий и т.д. ))

Результаты для GTX480(-x 2048

Результаты для GTX480(-x 2048 -y 2048 -z 2048 -t ):
Одинарная точность: 357.5GFlop/s
Двойная точность: 55.3GFlop/s

Появилась возможность немного

Появилась возможность немного протестить FireStream 9270(RV770, как и у HD4850).
Тесты CAL(на OpenCL совсем позорные результаты(даже без использования Shared)):
----------------------------------
./throughput -w 2048 -h 2048
Supported CAL Runtime Version: 1.3.185
Found CAL Runtime Version: 1.4.635
Use -? for help
Program: ./throughput Kernel System
WxH In-Out Src Dst Iter GB/sec GB/sec
2048x2048 1 1 4 4 2 84.60 0.53
2048x2048 2 2 4 4 2 78.06 0.54
2048x2048 3 3 4 4 2 73.54 0.53
----------------------------------
./double_matmult -w 1024 -h 1024
Supported CAL Runtime Version: 1.3.185
Found CAL Runtime Version: 1.4.635
Use -? for help
Program: double_matmult Sizes - A: 1024x1024 B: 1024x1024 C:1024x1024
Verify: F Verbose: F Quiet: F
Matrix Size Kernel Gflops System Gflops Kernel Time System Time
(1024x1024) 141.752 22.174 0.0303 0.1937
----------------------------------
./cachespeed -w 1024 -h 1024
Supported CAL Runtime Version: 1.3.185
Found CAL Runtime Version: 1.4.635
Use -? for help
Program: ./cachespeed Kernel System
WxH In-Out Src Dst Iter GB/sec GB/sec
1024x1024 1 1 4 4 2 109.86 0.45
1024x1024 2 1 4 4 2 153.21 0.63
1024x1024 3 1 4 4 2 226.79 0.87
1024x1024 4 1 4 4 2 276.16 1.07
1024x1024 5 1 4 4 2 318.91 1.19
1024x1024 6 1 4 4 2 320.74 1.91
1024x1024 7 1 4 4 2 337.84 1.69
1024x1024 8 1 4 4 2 342.24 1.79
1024x1024 9 1 4 4 2 347.19 2.04
1024x1024 10 1 4 4 2 355.88 2.59
1024x1024 11 1 4 4 2 357.48 2.57
1024x1024 12 1 4 4 2 358.25 2.92
1024x1024 13 1 4 4 2 359.20 3.28
1024x1024 14 1 4 4 2 364.53 2.96
1024x1024 15 1 4 4 2 346.31 4.55
1024x1024 16 1 4 4 2 377.28 4.00
----------------------------------
./memexport_matmult -w 2048 -h 2048
Supported CAL Runtime Version: 1.3.185
Found CAL Runtime Version: 1.4.635
Use -? for help
Program: memexport_matmult Sizes - A: 2048x2048 B: 2048x2048 C:2048x2048
Verify: F Verbose: F Quiet: F
Matrix Size Kernel Gflops System Gflops Kernel Time System Time
(2048x2048) 486.937 31.503 0.0706 1.0907
----------------------------------
./memimport_matmult -w 1024 -h 1024
Supported CAL Runtime Version: 1.3.185
Found CAL Runtime Version: 1.4.635
Use -? for help
Program: memimport_matmult Sizes - A: 1024x1024 B: 1024x1024 C:1024x1024
Verify: F Verbose: F Quiet: F
Matrix Size Kernel Gflops System Gflops Kernel Time System Time
(1024x1024) 65.308 31.838 0.0658 0.1349