많은 내용을 읽었습니다. documentation을 읽었습니다. 내가 놓친 부분을 발견하면 만족 스러울 것입니다. 배경으로, 3.2.7 고유 라이브러리를 사용하여 Visual Studio 2015에서 x86 Windows 10에서 컴파일 중입니다. 3.2.7 버전은 5 월부터 출시되었으며, 그 이후 릴리스가있는 동안 changelog에서 내 문제가 해결되었다는 것을 알지 못했습니다.큰 블록 계수 곱셈은 Eigen 라이브러리 C++에서 실패합니다
이 문제는 특정 크기를 초과하는 행렬에만 나타납니다. 이것이 내 시스템에 고유 한 무엇인가 또는 Eigen 고유의 것의 부산물인지 나는 모른다.
다음 코드는 디버그 모드와 릴리스 모드 모두에서 액세스 위반을 생성합니다.
int mx1Rows = 255, cols = 254;
{//this has an access violation at the assignment of mx2
Eigen::MatrixXd mx1(mx1Rows, cols);
Eigen::MatrixXd mx2(mx1Rows + 1, cols);
Eigen::Block<Eigen::MatrixXd, -1, -1, false> temp = mx2.topRows(mx1Rows);
mx2 = temp.array() * mx1.array();//error
}
나는 결과가 aliased을해야하기 때문에 계수 현명한 곱셈의 할당이 안전하다고 생각합니다.
이 문제는 mx1Rows가 값 254로 줄어들면 액세스 위반이 나타나지 않는 경우에 흥미로워집니다. 256x254의 mx2 크기로 문제가 발생하지만 255x254 크기는 문제가되지 않습니다. 열 크기를 늘리면 액세스 위반도 발생할 수 있으므로 문제는 총 항목 수와 관련이 있습니다. mx1 및 mx2에 값이 채워지더라도 문제가 재현 될 필요는 없습니다. 채워진 행렬을 사용하면 문제를 재현 할 필요가 없습니다.
temp에 topRows() 블록을 할당하지 않은 유사한 코드는 릴리스 모드에서 액세스 위반을 생성하지 않습니다. 원래 코드에서이 문제를 발견 한 이후로는 훨씬 복잡한 것이었고 특정 수의 루프 (행 크기가 행렬간에 일관성이 있음) 이후에만 나타 났기 때문에 더 많은 것이 있다고 생각합니다. 내 코드에서 너무 많이 진행되어 특정 수의 루프 이후에만 액세스 위반이 나타나는 조건을 격리 할 수 없었습니다. 내가 알고 궁금 무엇
는
1) 나는 몇 가지 분명히 잘못된 방법으로 아이겐를 사용하고있다?
2)이 문제를 재현 할 수 있습니까? (귀하의 환경에 대한 자세한 내용은 무엇입니까?)
3) Eigen 라이브러리의 버그입니까?
블록이 아닌 임시 매트릭스에 블록을 할당하면이 문제를 해결할 수 있습니다. 비효율적이라 할지라도이 문제에 대해서는 관심이 없습니다.
부정적인 1 개의 인덱스가 허용되는 것으로 가정하고 버그처럼 보입니다. 행렬을 초기화하면 작은 값의 mx1Rows 및 cols에서도 배열 mult에 가비지를 넣는 것을 볼 수 있습니다. 'temp.array(). eval(). array()'를 실행하면 문제가 없습니다. 데이터 외부에서 앨리어싱을하지 않습니다. x64로 실행되지만 잘못되었습니다. 그것은 단지 잘못이 아닙니다. – doug