4

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

现在我将它们作为浮点数发送,因为我希望我的最终产品是一个浮点数,考虑到它们可以放入一个字节,最终会变得非常昂贵。

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

4

1 回答 1

3

您可以从主机到设备的数组,也可以cudaMemcpy在设备上使用. 然后编写一个从字节数组复制到浮点数组的自定义内核:unsigned charfloatcudaMalloc

__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。)

于 2012-02-06T00:32:18.433 回答