STD классы в ядре CUDA - PullRequest
       25

STD классы в ядре CUDA

3 голосов
/ 16 ноября 2011

Я знаю, что нет никакого способа использовать классы std, такие как string, vector, map или set в ядре CUDA.Однако без них очень неудобно.Я должен написать много кода в ядре CUDA, поэтому я хотел бы использовать как минимум строки и векторы.Я не говорю о чем-то вроде тяги.Я хочу иметь возможность написать что-то вроде этого:

__global__ void kernel()
{
    cuda_vector<int> a;
    for(int i=0;i<10;i++)
        a.push_back(i);
}

int main()
{
    kernel<<<1,512>>>();
    return 0;
}

Это должно создать 512 потоков, и в каждом потоке я хочу создать класс cuda_vector и использовать его как std :: vector.Я не нашел никакого решения в Интернете, и я начал писать свой собственный класс.Каждая функция этого класса определена как функция "__ host __" и "__ device __", так что я могу использовать ее как на CPU, так и на GPU.Теоретически, это может быть реализовано, но только на архитектуре Fermi.Потому что нам нужно динамически распределять память.У меня GTX 580 и я начал писать свой собственный вектор.Но это утомительно и требует много времени.Есть ли какая-либо реализация, которую я могу использовать?Я не могу поверить, что их нет.Многие ли разработчики программного обеспечения пишут на CUDA без него?И никто не пытался написать свою версию?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Причиной, по которой вы не можете найти что-то вроде std :: vector для cuda, является производительность.Ваш традиционный векторный объект не очень подходит для модели CUDA.Если вы планируете использовать только 512 потоков, и каждый из них будет управлять объектом, подобным std :: vector, ваша производительность будет хуже, чем выполнение одного и того же кода в ЦП.

Потоки GPU не похожи на потоки CPU, они должны быть максимально легкими.Используйте блоки потоков и разделяемую память для взаимодействия потоков.Если вы манипулируете строкой, каждый поток должен работать с одним символом, если вы используете векторы в CPU, передайте массив этого в GPU, и каждый поток будет работать с одним элементом.В общем, подумайте о том, как решить проблему с моделью программирования CUDA, в отличие от решения с использованием подхода ЦП, а затем перевести ее на CUDA.

0 голосов
/ 16 ноября 2011

Я не использовал его, но платформа CuPP может вас заинтересовать, особенно реализация vector<T>Похоже, он может делать то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...