LINUX.ORG.RU

thrust - кто пользуется?

 , , thrust


0

1

http://code.google.com/p/thrust/ - кто пользуется этим?

Честно говоря задолбался искать в своём CUDA-коде ошибки, связанные с неправильным выделением памяти... то ли я что-то неправильно делаю, то ли не знаю... наверное плохой из меня C-шник

Что мне нужно? Если вкратце, мне нужно в первую очередь просто посчитать интеграл (много раз для разных параметров функции), и просуммировать.

Ещё мне нужны матричные операции, нахождение обратное матрицы, суммирование и умножение матриц.

В thrust всё это есть? Документацию ещё не начал читать (она вроде там есть на сайте, но я не уверен, насколько хорошая). как там с надёжностью, нормально?.. обязательно прочитаю, если это то, что мне нужно.

STL до этого пользовался, но давно и очень мало :) не скажу, что понравилось, наверное не распробовал. из boost буквально пару классов использовал, не более того.

Я правильно понимаю, что, используя thrust, писать свои ядра фактически не придётся (всё это будет делать за меня библиотека), или нет?

Наверное стоит вдогонку спросить...

Вот есть библиотеки curand (она мне тоже нужна), cufft - (пока не понял, но вообще мне нужно преобразование Фурье, подойдёт или нет - вопрос), cublas - линейная алгебра, по идее там должно быть что-то для работы с матрицами, до этого с BLAS никогда не работал.

Мне с этими библиотеками напрямую надо будет работать, или в thrust всё это уже включено?

Уже начал читать quick start guide, но пока ничего толком не пойму =) наверное стоит завтра на свежую голову (если она у меня ещё будет свежая) продолжить..

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Книжки Борескова читали?

Перед использованием CUDA посмотрите на библиотеку Atlas http://math-atlas.sourceforge.net/

Может с ней будет досточной производительность.

Использовать CUDA или подобные технологии нужно когда мощностей процессорных версий библиотек уже не достаточно.

Deleted
()
Ответ на: комментарий от Deleted

читал, не очень они мне нравятся =) например, есть пример перемножения матриц, и там описывается как перемножать матрицы, если n кратно 16, что, как правило, с реальностью не совпадает =)

Увы, нет, мне нужна именно CUDA. Дело не в мощностях, это скорее для цели изучения =)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от Deleted

и таки да... мощности недостаточно. алгоритм, написанный на чистом C работать (в теории) часы и дни.... ну на практике я попросту не стал дожидаться =)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Кратной 16 выбрана размерность не случайно - для оптимизации реализации. Если Ваши матрицы по размерности не кратны 16, то дополните Ваши матрицы нулями и единицами чтобы их размерность стала кратной 16, а результат умножения матриц при этом не изменился.

Не знаю можно ли здесь формулы привести, Посмотрите книжки по теории матриц.

Было бы не плохо если бы на LOR встроили поддержку MathJaX http://www.mathjax.org/

Deleted
()
Ответ на: комментарий от BattleCoder

Atlas вылизанные алгоритмы на Fortran-е.

Попробуйте начать с них, хотя бы чтобы была возможность проверять правильность расчетов с использованием CUDA.

Deleted
()
Ответ на: комментарий от Deleted

то дополните Ваши матрицы нулями и единицами чтобы их размерность стала кратной 16, а результат умножения матриц при этом не изменился.

Об этом не подумал... Кстати да, матчасть мне определённо надо бы подучить... почитать книжку по линейной алгебре. На первом курсе это «типа было», а на самом деле, ну вы поняли... всё забылось.

BattleCoder ★★★★★
() автор топика

Для начала Thrust - это некое подобие stl в C++.

задолбался искать в своём CUDA-коде ошибки, связанные с неправильным выделением памяти

Это большой косяк. Контролировать данные и в видео памяти и на хосте задалбливает. А ещё вот такие трюки убивают :)

    // transfer data to the device
    thrust::device_vector<int> d_vec = h_vec;

матричные операции, нахождение обратное матрицы, суммирование и умножение матриц.

Это скорее cuBLAS вот только «нахождение обратное матрицы» прикол ещё тот и в BLAS его нет.

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

Напрягает, кстати, ещё то, что память на видео не очищается... и порой, когда при отладке хочу вывести «то, что в видеопамяти, предварительно скопировав, разумеется», на консоль, вижу иногда старые данные... и непонятно, то ли работает, то ли нет %)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от AlexVR

Ну раз нету, значит, буду сам писать... надеюсь, времени хватит.

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от AlexVR

Спасибо... посмотрю. хотя с недавнего времени обнаружил, что не такие уж и проблемы у меня с английским... читать, оказывается ВНЕЗАПНО умею. говорить труднее

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от AlexVR

Кстати, а не посоветуете ли каких годных книжек по линейной алгебре (желательно на русском, хотя подойдут и на английском)? По возможности не на 100500 страниц, но в то же время чтобы было понятно, что из чего и откуда и куда...

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Спасибо... посмотрю. хотя с недавнего времени обнаружил, что не такие уж и проблемы у меня с английским... читать, оказывается ВНЕЗАПНО умею. говорить труднее

Аналогично, тех. литературу читаю только в лёт, а вот если открою рот, то меня никто не понимает :)

AlexVR ★★★★★
()

Почитал внимательнее доки по этому thrust. Несколько мыслей:

1) довольно простое копирование между GPU и CPU, что, конечно, удобно, освобождает от таких вещей как cudaMalloc/cudaFree и т.п. и сокращает объём кода

2) для использования лучше бы всё-таки знать STL и что такое шаблоны, в общем, знать кресты, а я их знаю плоховато... (испорченный жаба-кодер)

3) если нужно сделать что-то простое типа сортировки или сложения двух векторов - всё норм, а вот что-то посерьёзнее уже сложнее - либо свои шаблоны писать (чего я не умею), либо использовать cublas/cufft, либо писать руками.

4) ещё в примерах использовалось присваивание по индексу векторам на device. Для меня загадка - каждое такое присваивание обходится копированием памяти, или всё-таки как-то оптимизируется, и создаётся ядро, которое выполняется «прозрачно»?

Вывод: буду читать доки по cublas/cufft, и либо буду их использовать, либо вручную писать логику на низком уровне (то есть свои ядра писать).

А от пары лишних malloc/free мой индусокод сильно не пострадает. (:

BattleCoder ★★★★★
() автор топика
1 июня 2012 г.

Решил, нафик thrust в моей задаче, всё сделал без него.... И наконец-то заработало... Разбил одно большое ядро на много маленьких ядер, которые решали подзадачи... и набор значений ему поменьше скармливаю.

Осталось только редукцию (сумму) перенести на GPU, и не факт, что это ещё будет быстрее, но попробовать стоит. Наверное тоже вручную лучше ядро написать (или скопипастить)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Использовать CUDA или подобные технологии нужно когда мощностей процессорных версий библиотек уже не достаточно.

Вот, для примера, из моей задачи. Приводить индусокод не буду (его много), на словах скажу - если считать двукратный интеграл по Монте-Карло с разбиением всего лишь в 100 000 случайных точек - время выполнения простого последовательного алгоритма: 13354052 миллисекунд (около 3.7 часов), я подсчитал.

Тот же алгоритм на CUDA выполняется за 695160.38 миллисекунд (12 минут). Почти в 19 раз быстрее! И это пока без оптимизации... я ею не занимался, не знаю, буду ли... итак достаточно.

(для справки, CUBLAS у меня не используется, тут он не нужен, это вообще для другой задачи)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

А оптимизация под несколько ядер центрального процессра и потоковые инструкции были использованы при расчетах без CUDA ? А их же в дополнении к CUDA? может еще время тестового примера сократить удастся.

Тестирование нагляднее будет если все что предоставляет имеющееся железо задействовать.

Deleted
()
Ответ на: комментарий от Deleted

Нет, не было. Было только одно ядро из четырёх задействовано. Как потоковые инструкции задействовать - я не знаю... Можно попробовать.

Моя задача не в том, чтобы код оптимизировать. а применить именно cuda :) это дипломка. вот.

BattleCoder ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.