CUDA заполняет меньшие массивы в зависимости от условий - PullRequest
0 голосов
/ 04 марта 2019

Предположим, у меня есть массив

X = [1,2,3,4,5,6,7,8,9,10]

Можно ли создавать меньшие массивы и заполнять их в зависимости от некоторых условий.Например, если я хочу разделить числа из X в массивы, такие как

divisibleByTwo = [2,4,6,8,10]
divisibleByThree = [3,6,9]
divisibleByFour = [4,8]

Если у меня непараллельный код, это будет что-то вроде

std::vector<int> divisibleByTwo;
for (int i=0; i<sizeof(x); i++)
{
    if (X[i]/2 == 0)
    {
        divisibleByTwo.emplace_back(X[i]);
    }
}

Но я не могу сделать то же самоев CUDA, потому что это было бы условием гонки

Что я действительно хочу сделать, так это сравнение двух массивов и сохранение индексов в новом массиве, где выполняется условие.

Например,

A = [1,2,3]
B = [3,3,2]

и мне нужно сравнить все элементы A с B и найти индексы B, где элементы равны.Таким образом, результатом будет массив массивов, такой что

C[0] = [ ]  // indexes of B matching element at index 0 of A (1)
c[1] = [2] // indexes of B matching element at index 1 of A (2)
c[2] = [0, 1] // indexes of B matching element at index 2 of A (3)

1 Ответ

0 голосов
/ 05 марта 2019

Например, divisibleByTwo, вы можете запустить 10 потоков cuda и сделать что-то вроде:

__global__ void decimate(const float *x, float *y) {
   if(threadIdx.x<10 && threadIdx.x%2==0)
      y[threadIdx.x/2] = x[threadIdx.x];
}

В приведенном выше примере половина потоков ничего не делает.Или вы можете запустить ядро ​​с 5 нитями,

__global__ void decimate(const float *x, float *y) {
   if(threadIdx.x<5)
      y[threadIdx.x] = x[threadIdx.x*2];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...