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