Вы можете 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
.)