Написание ядра GPU с частичной суммой - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть следующий массив с разреженными единицами время от времени.Это массивный вектор, мегабайты размером

[0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 ..]

Мне нужно хранить эти 1 в индексе для обработки, поэтому мне нужно ядро, которое производит это:

[0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 ..]

Как я могураспараллелить такую ​​операцию?

1 Ответ

0 голосов
/ 14 декабря 2018

Вы ищете «параллельное инклюзивное сканирование», которое из библиотеки thrust (поставляется с набором инструментов cuda) включает в себя:

#include <thrust/scan.h>
#include <thrust/device_vector.h>
#include <iostream>

int main( int argc, char * argv[] )
{
    int data[17] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 };
    thrust::device_vector< int > in( data, data + 17 );
    thrust::device_vector< int > out( in.size() );

    thrust::inclusive_scan( in.begin(), in.end(), out.begin() );

    for ( int i = 0; i < out.size(); ++i )
        std::cout << out[i] << " ";
    std::cout << endl;
}

:

0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2

Или вы могли бы явно написать ядро ​​- которое будет просто вариацией алгоритма сумма параллельного префикса , который хорошо обобщает тягу.

...