2012-02-05 62 views
4

我正在编写一个cuda程序,我试图减少数据传输的开销。我使用cuBLAS库进行矩阵乘法运算,我必须发送30.000.000个数字,其值在0-255之间。在CUDA和cuBLAS中类型转换

现在我正在将它们发送为浮点数,因为我希望我的最终产品是一个浮点数,考虑到它们可以放入一个字节中,所以最终成本很高。

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

回答

3

你可以cudaMemcpyunsigned char从主机到设备的阵列,并且还分配使用cudaMalloc在设备上的float阵列。然后写从字节数组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最佳实践指南和编程指南信息。)