我正在用cuda编写程序,我正在努力减少数据传输的开销。我使用cuBLAS库进行矩阵乘法,我必须发送30.000.000个数字,其值范围为0-255。
现在我将它们作为花车发送,因为我希望我的最终产品是一个漂浮物,考虑到它们可以放入一个字节,最终会非常省钱。
有没有办法在使用cuBLAS库或任何其他快速数学库时将它们作为字节发送并将它们强制转换为浮点数?或者告诉gpu以某种方式将它们作为花车对齐?
答案 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最佳做法指南和编程指南。)