首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大阵列CBLAS分段故障

大阵列CBLAS分段故障
EN

Stack Overflow用户
提问于 2014-03-14 22:47:20
回答 1查看 250关注 0票数 1

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

对于numpy,我得到了一个包含许多缺失值的数组,这些值只是零。我试过通过CBLAS给布拉斯打电话。我得到了一个大数组的分割错误。

我是在一台有大约250 GB空闲内存的机器上运行的。谢谢你的阅读。

代码语言:javascript
复制
#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。

代码语言:javascript
复制
#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);

我编制的资料如下:

代码语言:javascript
复制
gcc sgemm_test_fortran.c -o test  -L /usr/lib64 -lblas64

编译的代码,我想它可能会运行..:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-14 23:13:55

问题是输出矩阵的大小(100000x100,000= 1e10元素)不能存储在int (2.14e9)中。您可以在C++代码中通过将类型转换为size_t来解决这个问题,但是在BLAS库中也会遇到同样的问题。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22417126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档