gpt4 book ai didi

blas - 使用 100M 行转置 CSR 时出现 MKL 稀疏 BLAS 段错误

转载 作者:行者123 更新时间:2023-12-05 07:49:21 26 4
gpt4 key购买 nike

我正在尝试将 MKL 稀疏 BLAS 用于 CSR 矩阵,行数/列数约为 100M。当我将其增加到 100M 时,我的源代码似乎适用于 10M 行/列,但由于段错误而失败。

我将问题隔离到以下代码片段:

void TestSegfault1() {
float values[1] = { 1.0f };
int col_indx[1] = { 0 };
int rows_start[1] = { 0 };
int rows_end[1] = { 1 };

// Step 1. Create 1 x 100M matrix
// with single non-zero value at (0,0)
sparse_matrix_t A;
mkl_sparse_s_create_csr(
&A, SPARSE_INDEX_BASE_ZERO, 1, 100000000,
rows_start, rows_end, col_indx, values);

// Step 2. Transpose it to get 100M x 1 matrix
sparse_matrix_t B;
mkl_sparse_convert_csr(A, SPARSE_OPERATION_TRANSPOSE, &B);
}

这个函数在 mkl_sparse_convert_csr 中有回溯错误

#0  0x00000000004c0d03 in mkl_sparse_s_convert_csr_i4_avx ()
#1 0x0000000000434061 in TestSegfault1 ()

对于略有不同的代码(但本质上是相同的),它有更多的细节:

#0  0x00000000008fc09b in mkl_serv_free ()
#1 0x000000000099949e in mkl_sparse_s_export_csr_data_i4_avx ()
#2 0x0000000000999ee4 in mkl_sparse_s_convert_csr_i4_avx ()

显然内存分配出了问题。从外面看确实像是某种整数溢出。我使用的 MKL 构建使用 MKL_INT = int = int32。

是否确实如此,我在稀疏 BLAS CSR 矩阵中可以拥有的行数限制 < 100M(看起来更像是 ~65M)?还是我做错了?

编辑 1:MKL 版本字符串是“Intel(R) Math Kernel Library Version 11.3.1 Product Build 20151021 for Intel(R) 64 architecture applications”。

编辑 2:弄清楚了。在为每个线程的内部缓冲区分配内存时,确实存在一种微妙的整数溢出。在 mkl_sparse_s_export_csr_data_i4_avx 内部的某个点,它尝试分配 (omp_get_max_threads() + 1) * num_rows * 4 个字节;该数字不适合 32 位有符号整数。随后调用 mkl_serv_malloc 会导致内存损坏并最终导致段错误。一种可能的解决方案是通过 omp_set_num_threads 调用更改 OpenMP 线程的数量。

最佳答案

你能在最新版本的 MKL 上检查你的例子吗?我在 MKL 11.3.2 上运行它,它正确地通过了 100M 矩阵。但是,它可能取决于您机器上的线程数(矩阵的大小乘以线程数必须小于 max int)。为防止此类问题,我强烈建议使用 ilp64 版本的 MKL 库谢谢,亚历克斯

关于blas - 使用 100M 行转置 CSR 时出现 MKL 稀疏 BLAS 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37395541/

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