Всем привет!
Короче воюю сейчас тут с одним багом для Прямоугольных Матриц (с Квадратными типа все ОК)
В принципе из-за чего баг возникает в как бы вроде разобрался - проблема в том либа
Arrayfire uses (a modified) CSR format
А про который ( CSR format ) вики пишет что
To extract a row, we first define:
row_start = ROW_INDEX[row]
row_end = ROW_INDEX[row + 1]
А прога в использует вроде традиционную запись (вроде как) - ибо в матрицах я честно говоря не шибко разбираюсь.
Одним словом сейчас у меня вылетает вот здесь
- Код: Выделить всё
inline FOOVec FOO<T>::colContributions(void)
{
do_factors_();
return (sumOfSquares_(Fr_, 0, Fr_.dims(1) - 1 ) * colWeights()) / af::sum<T>(allEigenValues()); // t800 first Crash on non-square is here
}
C такой вот ошибкой
- Код: Выделить всё
Exception - ArrayFire Exception (Invalid i
nput size:203):
In function class af::dim4 __cdecl getOutDims(const class af::dim4 &,const class
af::dim4 &,bool)
In file src\backend\common\ArrayInfo.cpp:134
Invalid dimension for argument 1
Expected: ldims == rdims
0# af::operator>> in afcuda
1# af::operator>> in afcuda
2# af::operator>> in afcuda
3# af::operator>> in afcuda
4# af_is_real in af
5# af_is_real in af
In function class af::array __cdecl af::operator *(const class af::array &,const
class af::array &)
In file src\api\cpp\array.cpp:948
File src\backend\common\ArrayInfo.cpp:134
Cм.
https://github.com/arrayfire/arrayfire/ ... ayInfo.cppFile src\api\cpp\array.cpp:948
См.
https://github.com/arrayfire/arrayfire/ ... /array.cppА вопрос у меня как бы следующий, а че это вообще такое colContributions
И че за действие оно такое с матрицей делает в строчке где вылетает.
ЗЫ И кстати если изменить ее вот так
- Код: Выделить всё
(sumOfSquares_(Fr_, 0, Fr_.dims(1)) * colWeights()) / af::sum<T>(allEigenValues());
Или вот так
- Код: Выделить всё
(sumOfSquares_(Fr_, 0, Fr_.dims(1)) * colWeights() +1 ) / af::sum<T>(allEigenValues());
То данную строчку проскакивает и вылетает уже в другом месте.
- Код: Выделить всё
inline FOOVec FOO<T>::sumOfSquares_(FOOGenMat& F, unsigned lbound, unsigned ubound)
{
af::seq bounds(lbound, ubound);
af::array sumOfSquares = af::sum(F(af::span, bounds) * F(af::span, bounds), 1); //t800 Second crash is here
return sumOfSquares;
}
C такой вот ошибкой
- Код: Выделить всё
Exception - ArrayFire Exception (Invalid i
nput size:203):
In function __int64 __cdecl af::calcDim(const struct af_seq &,const __int64 &)
In file src\backend\common\dim4.cpp:134
Invalid dimension for argument 1
Expected: seq.end < parentDim
0# af::operator>> in afcuda
1# af::operator>> in afcuda
2# af::operator>> in afcuda
3# af::operator>> in afcuda
4# af::operator>> in afcuda
5# af::operator>> in afcuda
6# af::operator>> in afcuda
7# af_is_real in af
8# af_is_real in af
9# __scrt_common_main_seh at d:\agent\_work\63\s\src\vctools\crt\vcstartup\src\
startup\exe_common.inl:288
10# BaseThreadInitThunk in kernel32
11# RtlUserThreadStart in ntdll
In function __cdecl af::array::array_proxy::operator class af::array(void)
In file src\api\cpp\array.cpp:748
См.
https://github.com/arrayfire/arrayfire/ ... n/dim4.cppСм.
https://github.com/arrayfire/arrayfire/ ... /array.cppСоответственно хотелось бы понять, а чего оно вообще считает в этих строчках где вылетает.
Потому что я конечно могу +1 -1 наугад везде понараставлять чтоб не вылетало но как бы хотелось бы все же расставлять правильно а не просто наугад... :)
Заранее благодарен за помощь