我需要在大型實對稱二維矩陣上使用該dsyev函式。LAPACK我可以從 使用它scipy.linalg.lapack,但它沒有在合理的時間內完成計算。
我可以從具有intel 2020套件作為模塊的 HPC 集群上的 > 20 個內核中受益。由于原因,我不能只使用與集群內部筆記本電腦中的相同的 python 代碼并設定環境變數MKL_NUM_THREADS=32。我唯一的出路是使用 C 和 Intel MKL for C。
我研究了有關如何dsyev在 C 中使用該函式的 intel MKL 示例。
我在 python 中的二維陣列(20160, 20160)是np.float64. 20160 = 252 * 80. 我只是寫T = np.zeros((20160, 20160), dtype=np.float64),然后根據我的任務繼續填寫。最后,我使用 對其進行整形,然后以 a或 a格式np.flatten(order='C')將其保存到磁盤。.npy.txt
在這里我請求您的幫助:
我正在嘗試使用 C 從記憶體中讀取它。我的基本程式適用于小的一維陣列大小,例如(20000,)C double,但在實際嘗試讀取整個一維陣列時失敗,然后與dsyev. 根據谷歌:250 * 80 * 250 * (64 bytes) = 0.32 gigabytes例如,我不知道為什么我不能在我的 C 程式中使用這種大小的一維陣列。
我在 C 中的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
double arrayy[252*80*250];
// double *arrayy = (double*) malloc(250*80*100*sizeof(double));
printf("Hehe");
FILE *fp;
fp = fopen("1D_array.txt", "rb");
for ( int i = 0; i < 250*80 ; i ) {
// fread(&(array[i]), sizeof(array[i]), 1, fp);
fscanf(fp, "%lf", &arrayy[i]);
}
// fread(&(arrayy[0]), sizeof(double), 252*80*3, fp);
fclose(fp);
for ( int i = 0 ; i < 252*80 ; i ) {
if (i % 1000 == 0)
printf("Value at index %d is %f\n", i, arrayy[i]);
}
}
我在gcc 9.3.0.17具有 16 GB RAM 的 Windows 11 上的 Windows 子系統中使用 Linux 1 (WSL1)。
謝謝!
更新:
這個,當編譯$ gcc -Wall test.c然后$./a.out回傳時$ Segmentation fault (core dumped),沒有其他任何東西被列印出來!
uj5u.com熱心網友回復:
在 C 中,陣列像任何其他區域變數一樣在堆疊上分配,與堆相比,它在記憶體中是一個相對較小的區域。
此行double arrayy[252*80*250];可能導致堆疊溢位,顯示為分段錯誤。為了與您的 Python 代碼保持一致,您應該動態分配您的陣列,如下所示:
double *arrayy = malloc(250*80*100*sizeof(*arrayy));
請注意,您不需要演員表,并且可以sizeof(*arrayy)代替sizeof(double).
另請注意,在您的代碼中,您似乎無緣無故地在 252 和 250 之間交替。您可能應該將陣列的大小命名為變數,如下所示:
const unsigned long arrayy_size = 252 * 80 * 252 * 80;
double *arrayy = malloc(arrayy_size * sizeof(*arrayy));
// [...]
for (unsigned long i = 0; i < arrayy_size; i) {
// use arrayy[i]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516066.html
標籤:Intel Collective Python数组C麻木的英特尔
