gpt4 book ai didi

c - 浮点大小、矩阵乘法、OpenCL、套接字。诡异的

转载 作者:太空宇宙 更新时间:2023-11-04 07:40:34 25 4
gpt4 key购买 nike

我使用以下函数生成两个矩阵(注意省略了一些代码):

srand(2007);
randomInit(h_A_data, size_A);

void randomInit(float* data, int size)
{
int i;
for (i = 0; i < size; ++i){
data[i] = rand() / (float)RAND_MAX;
}
}

这是为矩阵 A 和 B 调用的。这会用 0.something 值填充矩阵,例如0.748667。然后我使用 CPU 执行矩阵乘法。我将结果与通过 OpenCL 实现的 GPU 进行比较。结果矩阵的值在 20.something 范围内,例如23.472757。 CPU 和 GPU 给出相同的结果。 CPU 实现取自 nvidia 的 Cuda 工具包 distrib:

void computeGold(float* C, const float* A, const float* B, unsigned int hA, unsigned int wA, unsigned int wB)
{
unsigned int i;
unsigned int j;
unsigned int k;
for (i = 0; i < hA; ++i)
for (j = 0; j < wB; ++j) {
double sum = 0;
for (k = 0; k < wA; ++k) {
double a = A[i * wA + k];
double b = B[k * wB + j];
sum += a * b;
}
C[i * wB + j] = (float)sum;
}

奇怪的是,内存中的所有三个矩阵都具有相同的大小,即矩阵 B 的 sizeof(float)*size_A 或 *size_B 等。当我将它们转储到磁盘时,结果文件存储在矩阵 C(相乘矩阵)大于矩阵 A 和 B。

更重要的是,对于我的应用程序,我通过套接字在网络上传输它们。就原始字节数而言,所有矩阵都是相同的,但通过网络传输矩阵 C 需要更长的时间。该问题被外推到大矩阵尺寸。这是为什么?

更新/编辑:

fprintf(matrix_c_file,"\n\nMatrix C\n");
for(i = 0; i < size_C; i++)
{
fprintf(matrix_c_file,"%f ", h_C_data[i]);
}
fprintf(matrix_c_file,"\n");

当矩阵 A 和 B 仅包含零时,所有三个(矩阵 A、B 和 C)在磁盘上的大小相同。

最佳答案

我认为 lijie在评论中有正确(虽然简洁)的答案。 %f 格式说明符可以生成宽度可变的字符串。考虑以下 C 代码:

    printf("%f\n", 0.0);
printf("%f\n", 3.1415926535897932384626433);
printf("%f\n", 20.53);
printf("%f\n", 20.5e38);

产生:

0.000000
3.141593
20.530000
2050000000000000019963732141023730597888.000000

所有输出的小数点后位数相同(默认为 6),但小数点左侧的数字可变。如果您需要矩阵的文本表示具有一致的大小并且您不介意牺牲一些精度,则可以使用 %e 格式说明符来强制使用指数表示,例如 2.345 e12.

关于c - 浮点大小、矩阵乘法、OpenCL、套接字。诡异的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4473448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com