gpt4 book ai didi

c++ - 大数组的 CBLAS 段错误

转载 作者:行者123 更新时间:2023-11-30 02:47:52 27 4
gpt4 key购买 nike

这是我的第三篇文章,试图解决这个问题,首先使用 numpy.dot(A, A.T) 出现,其中 A 很大,有 150,000 x 265 个元素。

使用 numpy,我得到了一个包含许多缺失值的数组,这些值只是零。我试图通过 CBLAS 调用 BLAS。我收到段错误具有大型阵列。

我在一台有大约 250 GB 可用内存的机器上运行它。感谢阅读...

#include <stdio.h>              /* I/O lib         ISOC  */
#include <stdlib.h> /* Standard Lib ISOC */
#include <cblas.h> /* C BLAS BLAS */
#include "blaio.h"

int main(int argc, char **argv) {

int row = 100000;
int col = 265;

float *a, *b, *c;

a = (float *) malloc(row * col * sizeof(float));
b = (float *) malloc(row * col * sizeof(float));
c = (float *) malloc(row * row * sizeof(float));

int i, end;
end = row * col;
for(i=0; i<end; i++)
{
a[i] = 1.0;
b[i] = 1.0;
}

for(i=0; i<(row*row); i++)
c[i] = 2.0;

// row_order transform transform rowsA colsB K alpha a lda b ldb beta c ldc
cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, row, row, col, 1.0f, a, col, b, row, 0.0f, c, row);


int num_bad = 0;
for(i=0; i<(row*row); i++)
{
if (c[i] != col)
{
printf("Bad value found: %f, at index: %i\n", c[i], i );
num_bad += 1;
}
}

printf("Number of bad values found: %i \n\n", num_bad);


//printMatrix(CblasRowMajor, row, row, c, 8, 3, NULL, NULL, NULL, NULL, NULL, "c = ");

return 0;
} /* end func main */

更新:Ray 熟练地注意到我通过 cblas 使用的 blas 必须是 32 位的并且无法访问数组索引。因此,我安装了 blas64.x86_64 和 blas64-devel.x86_64。

然后,重写了上面的几行代码,以使用不带 cblas 的直接调用 sgemm。

#include <stdio.h>              /* I/O lib         ISOC  */
#include <stdlib.h> /* Standard Lib ISOC */

int main(int argc, char **argv) {

int row = 100000;
int col = 265;

float *a, *b, *c;

a = (float *) malloc(row * col * sizeof(float));
b = (float *) malloc(row * col * sizeof(float));
c = (float *) malloc(row * row * sizeof(float));

int i, end;
end = row * col;

for(i=0; i<end; i++)
{
a[i] = 1.0;
b[i] = 1.0;
}

for(i=0; i<(row*row); i++)
c[i] = 2.0;

float alpha = 1.0, beta = 1.0;
sgemm_('N','N', &row, &row, &col, &alpha, &a[0], &col, &b[0], &row, &beta, &c[0], &row);

我编译了:

gcc sgemm_test_fortran.c -o test  -L /usr/lib64 -lblas64

代码已编译,我认为它可能会运行.. :)

最佳答案

问题是输出矩阵的大小(100,000x100,000 = 1e10 个元素)无法存储在 int (2.14e9) 中。您可以通过将类型切换为 size_t 在 C++ 代码中修复此问题,但您将在 BLAS 库中遇到同样的问题。

您需要做的是使用编译为使用 8 字节整数的 BLAS 库;大多数 BLAS 库都是用 4 字节整数编译的。您没有提及要链接到的 BLAS 库,因此很难猜测系统上正确的库名称是什么(如果它甚至存在的话)。

关于c++ - 大数组的 CBLAS 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417126/

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