在CUDA和cuBLAS中进行类型转换

时间:2012-02-05 22:55:22

标签: casting cuda cublas

我正在用cuda编写程序,我正在努力减少数据传输的开销。我使用cuBLAS库进行矩阵乘法,我必须发送30.000.000个数字,其值范围为0-255。

现在我将它们作为花车发送,因为我希望我的最终产品是一个漂浮物,考虑到它们可以放入一个字节,最终会非常省钱。

有没有办法在使用cuBLAS库或任何其他快速数学库时将它们作为字节发送并将它们强制转换为浮点数?或者告诉gpu以某种方式将它们作为花车对齐?

1 个答案:

答案 0 :(得分:3)

您可以cudaMemcpy从主机到设备的unsigned char数组,并使用float在设备上分配cudaMalloc数组。然后编写一个从字节数组复制到float数组的自定义内核:

__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类型,那么无论如何您都需要在某处进行此转换,因此上述内容可能非常有效。

为了获得最佳性能,请尽可能尝试重复复制和计算(但这不在问题范围内:有关cudaMemcpyAsync的信息,请参阅CUDA最佳做法指南和编程指南。)