функция устройства cuda, которая возвращает массив - PullRequest
0 голосов
/ 02 июля 2018

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

Я пытаюсь сделать это:

__device__ float *MatProd2dWxC(float *a2d, float  *b2d, int mGl, int nGl)
{
    int aRows = mGl; int aCols = nGl;
    int bRows = nGl; int bCols = 1;

    float *result;
    //result.resize(mGl*aRows);

    for (int i = 0; i < aRows; ++i) // each row of a
        for (int j = 0; j < bCols; ++j) // each col of b
            for (int k = 0; k < aCols; ++k) 
                result[i*mGl + j] += a2d[i*mGl + k] * b2d[k*mGl + j];

    return result;
}

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

1 Ответ

0 голосов
/ 02 июля 2018

Возвращение указателя из функции устройства в порядке и работает просто отлично.

Проблема в вашем коде заключается в том, что вы не присваиваете значение указателю result, которое затем разыменовываете, а затем возвращаете из функции позже. Вам нужно использовать float *result = malloc(mGl*aRows * sizeof(float)); для выделения памяти (и не забудьте free() позже!).

Однако лучше было бы передать уже выделенный указатель в функцию вашего устройства. Это устанавливает четкое владение распределением (т. Е. Проясняет в вашем коде, где следует вызывать free()), и может избежать ненужного выделения в некоторых случаях, например, например. выделение может быть извлечено из цикла.

Эта проблема не имеет ничего общего с CUDA, она также применима к стандарту C.

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