【问题标题】:Float size, matrix multiplication, OpenCL, sockets. Weird浮点大小、矩阵乘法、OpenCL、套接字。诡异的
【发布时间】:2011-05-27 06:49:53
【问题描述】:

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

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 工具包发行版:

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;
    }

}

奇怪的是,内存中所有三个矩阵的大小都相同,即 sizeof(float)*size_A 或矩阵 B 的 *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)在磁盘上的大小相同。

【问题讨论】:

  • 更新:对网络传输时间的观察不正确。事实上,通过套接字传递缓冲区所花费的时间是相同的。但我仍然很难理解为什么它在磁盘上更大?
  • 我们需要知道您是如何将这些矩阵写入磁盘的,因为肯定存在错误。
  • 您使用的是文本,因此您应该期望文件大小不同[??]

标签: c sockets opencl


【解决方案1】:

我认为lijie 在 cmets 中有正确的(尽管很简洁)答案。 %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.345e12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多