Типирование в CUDA и CuBLAS - PullRequest
       17

Типирование в CUDA и CuBLAS

4 голосов
/ 06 февраля 2012

Я пишу программу на языке cuda и пытаюсь уменьшить накладные расходы при передаче данных.Я использую библиотеку cuBLAS для умножения матриц, и мне нужно отправить 30 000 000 чисел, значения которых находятся в диапазоне от 0 до 255.

Сейчас я отправляю их как числа с плавающей точкой, так как я хочу, чтобы мой конечный продукт былfloat, который оказывается довольно дорогостоящим, учитывая, что они могут помещаться в байт.

Есть ли способ отправить их в виде байтов и привести их к типу с плавающей точкой при использовании библиотеки cuBLAS или любой другой библиотеки fast-Math?Или скажите gpu выровнять их как-нибудь как поплавки?

1 Ответ

3 голосов
/ 06 февраля 2012

Вы можете cudaMemcpy массив unsigned char от хоста к устройству, а также выделить массив float на устройстве, используя cudaMalloc.затем напишите собственное ядро, которое копирует из байтового массива в массив с плавающей точкой:

__global__ void byteToFloat(float *out, unsigned char* in, int n)
{
    int i = threadIdx.x + blockIdx.x * blockDim.x;

    for (; i < n; i += gridDim.x * blockDim.x)
        out[i] = in[i];
}

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

Примечание. Для достижения наилучшей производительности, вероятно, следует попытаться совмещать копирование и вычисление, если это возможно (но это выходит за рамки вопроса: см. Руководство по наилучшим методам CUDA и руководство по программированию для получения информации по cudaMemcpyAsync.)

...