Как я могу постоянно хранить матрицу в памяти графического процессора и использовать ее при необходимости?

Я пытаюсь распараллелить некоторую функцию через CUDA, которая вызывается много раз. Каждый раз он имеет дело с одной и той же матрицей. Я хочу сохранить эту матрицу в памяти графического процессора, и при вызове функции я хочу загрузить вектор в графический процессор, умножить его на матрицу и вернуть результат. Я предпочитаю шаблонный стиль C++, поэтому у тяги более высокий приоритет.

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


person sbeliakov    schedule 18.03.2013    source источник
comment
Итак, вы хотите вычислить скалярное произведение матрицы с вектором? Насколько они велики? И когда вы говорите много раз, хотите ли вы вычислить эти многие продукты одновременно на графическом процессоре, или это часть какой-то итерационной схемы, такой как решатель, где вектор меняется от итерации к итерации?   -  person talonmies    schedule 18.03.2013
comment
матрица примерно 3000x100, а вектор, отличающийся от вызова к вызову, равен примерно 100. Скалярное произведение — это не совсем то, что должна делать функция, но мы можем предположить, что это так, потому что реальные вычисления имеют ту же сложность. Я не хочу вычислять все эти продукты одновременно, я многократно подчеркиваю, что мы должны хранить эту огромную матрицу на GPU. На самом деле мы должны проделать ту же операцию с заданным вектором и каждым из 3000 рядов матрицы, и я хочу распараллелить эти 3000 вычислений.   -  person sbeliakov    schedule 18.03.2013
comment
Я хочу использовать что-то вроде тяги:: преобразование, которое будет принимать каждый из 3000 векторов и преобразовывать его в число по правилу, определяемому заданным вектором, который меняется от вызова к вызову.   -  person sbeliakov    schedule 18.03.2013


Ответы (1)


Для тяги вам нужны device_vector, device_ptr и т. д.

От тяги::device_vector к необработанному указателю и обратно?

Но чтобы эффективно программировать GPU, я предлагаю также ознакомиться с типами памяти CUDA:

http://www.cvg.ethz.ch/teaching/2011spring/gpgpu/cuda_memory.pdf (предупреждение в формате PDF)

Тип памяти, который вы ищете, - это «глобальная память». Помните, что вся эта память хранится на карте GPU, а не на карте CPU, поэтому она будет доступна только для ядер и вызовов функций устройства.

Все указатели функторов на устройства просто должны быть скомпилированы с тегом device (пример унарной операции):

template <typename T>
struct square
{   
__host__ __device__
    T operator()(const T& x) const {
        return x * x;
}
}; 
person IdeaHat    schedule 18.03.2013
comment
И можно ли работать с глобальной памятью из какого-то функтора, который затем передается в качестве аргумента для traffic::transform? - person sbeliakov; 18.03.2013
comment
При условии, что все ваши итераторы, переданные функции, являются указателями устройств, а функтор помечен тегом device. Я добавлю пример к ответу ... если вы этого не делали, тяга, вероятно, на самом деле работает на ЦП, поэтому вы, вероятно, увидите повышение производительности, перейдя к использованию устройств ptrs. - person IdeaHat; 18.03.2013
comment
@ maggot092 Похоже, вы действительно ищете какой-нибудь вводный материал по программированию CUDA и GPU. Конечно, thrust может многое сделать для вас, но если вы хотите реализовать свои собственные алгоритмы помимо стандартных, вам не обойтись без понимания основных принципов программирования GPU, которые лучше всего почерпнуть из хорошая книга или хотя бы учебник. - person Christian Rau; 18.03.2013