- Als neu kennzeichnen
- Lesezeichen
- Abonnieren
- Stummschalten
- RSS-Feed abonnieren
- Kennzeichnen
- Anstößigen Inhalt melden
Hi,
Executing the following FEAST interop code (taken from the C examples) results in a crash on dotnet 10 (no exception is thrown, the program just exits with error code 0xC0000409 STATUS_STACK_BUFFER_OVERRUN). The same code runs fine on .NET framework 4.8.
Can someone confirm this or maybe has an idea, if something is wrong with the interop code?
Regards,
Chris
OS: Windows 11 25H2
Runtime/SDK: dotnet 10 (latest)
MKL version: 2026.1.0.226 (intelmkl.redist.win-x64 from nuget)
dotnet run -c Debug -f net48 --> OK
dotnet run -c Debug -f net10.0 --> 0xc0000409csproj file:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net10.0;net48</TargetFrameworks>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion>
</PropertyGroup>
</Project>C# source:
using System;
using System.Runtime.InteropServices;
using MKL_INT = System.Int32;
unsafe class Program
{
public static void Main()
{
dfeast_sparse();
}
public const string DLL = "mkl_rt.3.dll";
[DllImport(DLL, EntryPoint = "feastinit", CallingConvention = CallingConvention.Cdecl)]
public static extern void feastinit(MKL_INT* fpm);
[DllImport(DLL, EntryPoint = "dfeast_scsrev", CallingConvention = CallingConvention.Cdecl)]
public static extern void dfeast_scsrev(/*const*/ byte* uplo, /*const*/ MKL_INT* n, /*const*/ double* a, /*const*/ MKL_INT* ia, /*const*/ MKL_INT* ja, MKL_INT* fpm, double* epsout, MKL_INT* loop, /*const*/ double* emin, /*const*/ double* emax, MKL_INT* m0, double* e, double* x, MKL_INT* m, double* res, MKL_INT* info);
public static void dfeast_sparse()
{
byte UPLO = (byte)'F'; /* Type of matrix: (F means full matrix, L/U - lower/upper triangular part of matrix) */
/* Matrix A of size N in CSR format. Size N and 3 arrays are used to store matrix in CSR format */
const MKL_INT N = 11;
MKL_INT[] rows/*[12]*/ = { 1, 5, 10, 16, 23, 30, 37, 44, 51, 57, 62, 66 };
MKL_INT[] cols/*[65]*/ = { 1, 2, 3, 4,
1, 2, 3, 4, 5,
1, 2, 3, 4, 5, 6,
1, 2, 3, 4, 5, 6, 7,
2, 3, 4, 5, 6, 7, 8,
3, 4, 5, 6, 7, 8, 9,
4, 5, 6, 7, 8, 9, 10,
5, 6, 7, 8, 9, 10, 11,
6, 7, 8, 9, 10, 11,
7, 8, 9, 10, 11,
8, 9, 10, 11
};
double[] val/*[65]*/ = { 5.0, 2.0, 1.0, 1.0,
2.0, 6.0, 3.0, 1.0, 1.0,
1.0, 3.0, 6.0, 3.0, 1.0, 1.0,
1.0, 1.0, 3.0, 6.0, 3.0, 1.0, 1.0,
1.0, 1.0, 3.0, 6.0, 3.0, 1.0, 1.0,
1.0, 1.0, 3.0, 6.0, 3.0, 1.0, 1.0,
1.0, 1.0, 3.0, 6.0, 3.0, 1.0, 1.0,
1.0, 1.0, 3.0, 6.0, 3.0, 1.0, 1.0,
1.0, 1.0, 3.0, 6.0, 3.0, 1.0,
1.0, 1.0, 3.0, 6.0, 2.0,
1.0, 1.0, 2.0, 5.0
};
/* Matrix B of size N in CSR format. Size N and 3 arrays are used to store matrix in CSR format */
MKL_INT[] rowsb/*[12]*/ = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
MKL_INT[] colsb/*[11]*/ = { 1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11
};
double[] valb/*[11]*/ = { 1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
};
/* Declaration of FEAST variables */
MKL_INT[] fpm = new MKL_INT[128]; /* Array to pass parameters to Intel oneMKL Extended Eigensolvers */
MKL_INT M_expected = 6; /* Exact number of eigenvalues in the interval [Emin, Emax] */
double Emin, Emax; /* Lower/upper bound of search interval [Emin,Emax] */
double epsout; /* Relative error on the trace */
MKL_INT loop; /* Number of refinement loop */
MKL_INT L = 8;
MKL_INT M0; /* Initial guess for subspace dimension to be used */
MKL_INT M; /* Total number of eigenvalues found in the interval */
double[] E = new double[11]; /* Eigenvalues */
double[] X = new double[121]; /* Eigenvectors */
double[] res = new double[11]; /* Residual */
/* Declaration of local variables */
MKL_INT info; /* Errors */
double[] Eig = new double[6]; /* Eig - array for storing exact eigenvalues */
double[] R = new double[6]; /* R = |E-Eig| */
double[] Y = new double[36]; /* Y=(X')*X-I */
MKL_INT i;
double eigabs;
/* Exact eigenvalues in range (3.0, 7.0) */
Eig[0] = 3.1715728752538100;
Eig[1] = 4.0000000000000000;
Eig[2] = 4.0000000000000000;
Eig[3] = 4.1292484841890931;
Eig[4] = 4.4066499006731521;
Eig[5] = 6.0000000000000000;
Console.WriteLine("\n FEAST DFEAST_SCSREV AND DFEAST_SCSRGV EXAMPLE");
Console.WriteLine("Sparse matrix size " + N);
/* Search interval [Emin,Emax] */
Emin = 3.0;
Emax = 7.0;
Console.WriteLine("Search interval [ {0}, {1} ] ", Emin, Emax);
M0 = L;
M = L;
loop = 0;
info = 0;
epsout = 0.0;
/* Step 1. Call FEASTINIT to define the default values for the input FEAST parameters */
fixed (MKL_INT* _fpm = fpm)
{
feastinit(
_fpm /* OUT: Array is used to pass parameters to Intel oneMKL Extended Eigensolvers */
);
}
fpm[0] = 1; /* Extended Eigensolver routines print runtime status to the screen. */
int _N = N;
/* Step 2. Solve the standard Ax = ex eigenvalue problem. */
Console.WriteLine("Testing dfeast_scsrev routine:");
fixed (double* _val = val)
fixed (MKL_INT* _rows = rows)
fixed (MKL_INT* _cols = cols)
fixed (MKL_INT* _fpm = fpm)
fixed (double* _E = E)
fixed (double* _X = X)
fixed (double* _res = res)
{
dfeast_scsrev(
&UPLO, /* IN: UPLO = 'F', stores the full matrix */
&_N, /* IN: Size of the problem */
_val, /* IN: CSR matrix A, values of non-zero elements */
_rows, /* IN: CSR matrix A, index of the first non-zero element in row */
_cols, /* IN: CSR matrix A, columns indices for each non-zero element */
_fpm, /* IN/OUT: Array is used to pass parameters to Intel oneMKL Extended Eigensolvers */
&epsout, /* OUT: Relative error of on the trace */
&loop, /* OUT: Contains the number of refinement loop executed */
&Emin, /* IN: Lower bound of search interval */
&Emax, /* IN: Upper bound of search interval */
&M0, /* IN: The initial guess for subspace dimension to be used. */
_E, /* OUT: The first M entries of Eigenvalues */
_X, /* IN/OUT: The first M entries of Eigenvectors */
&M, /* OUT: The total number of eigenvalues found in the interval */
_res, /* OUT: The first M components contain the relative residual vector */
&info /* OUT: Error code */
);
}
Console.WriteLine("FEAST OUTPUT INFO " + info);
if (info != 0)
{
Console.WriteLine(" dfeast_scsrev returns code of ERROR: " + info);
return;
}
else if (M != M_expected)
{
Console.WriteLine(" dfeast_scsrev returns wrong number of eigenvalues ");
return;
}
/* Step 3. Compute the residual R(i) = | E(i) - Eig(i) | where Eig(i)
* are the expected eigenvalues and E(i) are eigenvalues computed by DFEAST_SCSREV(). */
Console.WriteLine("Number of eigenvalues found " + M);
Console.WriteLine("Computed | Expected ");
Console.WriteLine("Eigenvalues | Eigenvalues ");
eigabs = 0.0;
for (i = 0; i < M; i++)
{
R[i] = Math.Abs(E[i] - Eig[i]);
eigabs = Math.Max(eigabs, R[i]);
Console.WriteLine("{0} {1} ", E[i], Eig[i]);
}
Console.WriteLine("Max value of | computed eigenvalue - expected eigenvalues | " + eigabs);
}
}
Link kopiert
0 Antworten
Antworten
Themen-Optionen
- RSS-Feed abonnieren
- Thema als neu kennzeichnen
- Thema als gelesen kennzeichnen
- Diesen Thema für aktuellen Benutzer floaten
- Lesezeichen
- Abonnieren
- Drucker-Anzeigeseite