我正在使用以下函数生成两个矩阵(注意一些代码被省略):
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)在磁盘上的大小相同。
答案 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
。