大阵列的CBLAS分割故障

CBLAS segmenation fault with large array

本文关键字:分割 故障 CBLAS 阵列      更新时间:2023-10-16

这是我的第三篇文章,试图解决这个问题,这是第一次用numpy出现。点(A, A.T),其中A较大,150,000 x 265个元素。

用numpy,我得到了一个数组,里面有很多缺失的值,都是0。我试过通过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: %in", c[i], i );
        num_bad += 1;
        }
}
printf("Number of bad values found: %i nn", 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-dev . X86_64 .

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

#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)中。你可以在c++代码中通过将类型切换为size_t来解决这个问题,但是你将在BLAS库中遇到同样的问题。

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