浮点大小,矩阵乘法,OpenCL,套接字。奇怪的

时间:2010-12-17 18:02:56

标签: c sockets opencl

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

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的范围内的值,例如, 23.472757。 CPU和GPU都给出了相同的结果。 CPU实现取自nvidia的Cuda toolkit 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;
    }

}

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

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

UPDATE /编辑:

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)在磁盘上的大小相同。

1 个答案:

答案 0 :(得分:3)

我认为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.345e12