这是我的第三篇文章,试图解决这个问题,
使用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库中遇到相同的问题。
您需要做的是使用BLAS库,该库已编译为使用8字节整数。大多数BLAS库都是使用4字节整数编译的。您没有提及要链接到的BLAS库,因此很难猜测系统上正确的库名称(如果存在)。
关于c++ - 大阵列CBLAS分割故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22417126/