Hello,
I am using DGESVD function that resides in MKL for singular value decomposition computation.
Depending on the version of MKL (2019.3 and 2020.1 and more) it produces different results for the given input matrix which causes incorrect computation further.
Win10, Visual Studio 2019
int main()
{
const int M = 190;
const int N = 1;
vector<double> A(M * N);
A[0] = 14.027672183415461;
A[1] = 14.271506473085537;
A[2] = -13.729785060214454;
A[3] = 15.524688699645367;
A[4] = 15.445376113335442;
A[5] = -14.172529497344613;
A[6] = -5.7952594275545835;
A[7] = -8.1701419871944836;
A[8] = -2.3841752466646540;
A[9] = -19.803263347094571;
A[10] = 10.564733137325447;
A[11] = 13.898020550125466;
A[12] = 12.214638326445538;
A[13] = -16.201380689154576;
A[14] = 17.761747945155321;
A[15] = -14.947460698254645;
A[16] = -5.9930485055845111;
A[17] = -10.335093295624574;
A[18] = -12.019419226504624;
A[19] = 5.5044959242954974;
A[20] = 14.591021877005460;
A[21] = -14.468099494074522;
A[22] = -0.065979535384485644;
A[23] = -10.863177204174463;
A[24] = -17.974913503974676;
A[25] = 7.3548477988954346;
A[26] = -4.4859031785945263;
A[27] = 4.6534642513354356;
A[28] = 8.4441942835253485;
A[29] = 1.6973326801353323;
A[30] = -11.800251135954568;
A[31] = 3.0218253210355215;
A[32] = 2.8023521015954884;
A[33] = -0.46622980573465611;
A[34] = -10.456956370754597;
A[35] = -1.3750361327645351;
A[36] = 15.669548544415420;
A[37] = -20.068090382394530;
A[38] = -9.5402340528146397;
A[39] = 6.1431045100853225;
A[40] = 8.7318690852155214;
A[41] = -7.2271357923345931;
A[42] = 15.878826475285450;
A[43] = -7.7460188994245982;
A[44] = 8.0802273106153280;
A[45] = 5.8984453333255260;
A[46] = -14.340252252644632;
A[47] = -20.397261099474463;
A[48] = -7.8273963319045379;
A[49] = -13.559321187064597;
A[50] = -16.247039817044651;
A[51] = -13.057559628324498;
A[52] = 16.137574076135479;
A[53] = -19.286131854954647;
A[54] = 7.2416528336455031;
A[55] = -18.997882968504655;
A[56] = 0.67080271714553419;
A[57] = 6.4191788137354706;
A[58] = 16.958462428265420;
A[59] = -3.3700241977744554;
A[60] = 16.738328279705456;
A[61] = -15.053646459914489;
A[62] = 13.550732017995415;
A[63] = 7.1315089740053281;
A[64] = 13.106416775045545;
A[65] = -3.0954045641344692;
A[66] = 14.504717015695405;
A[67] = -8.4381157728846574;
A[68] = 5.7400097284353251;
A[69] = 10.637020197475522;
A[70] = -9.0674134036846681;
A[71] = 4.0124356437154347;
A[72] = -3.1482973981346731;
A[73] = 11.828897428955543;
A[74] = 10.410704379805338;
A[75] = 13.215585063135450;
A[76] = -11.945969998134615;
A[77] = -18.162408395824514;
A[78] = -6.1489618808645901;
A[79] = 12.365647089475488;
A[80] = -4.0706679815045845;
A[81] = -12.823539698904597;
A[82] = 2.5089323827753560;
A[83] = -7.4643823822445938;
A[84] = 0.38388295269533046;
A[85] = -6.8452413462446202;
A[86] = -12.530094161424586;
A[87] = -15.346752136264513;
A[88] = -5.3812197615145578;
A[89] = 11.925447003355430;
A[90] = -9.7687584717145910;
A[91] = 1.5536005304354603;
A[92] = 2.8570292152753609;
A[93] = 0.57107666045544647;
A[94] = -0.92655510671465890;
A[95] = -8.8461874964345952;
A[96] = 4.7679851468853940;
A[97] = 9.3278753607853560;
A[98] = 4.4119991498055242;
A[99] = 5.3620183775353780;
A[100] = 14.784732817705390;
A[101] = -19.056168295314592;
A[102] = 8.3988512835653637;
A[103] = 3.6719412236855078;
A[104] = 16.267481703765498;
A[105] = 10.263582418435362;
A[106] = -11.417571146044565;
A[107] = -6.5040854169344584;
A[108] = -5.1870211553346053;
A[109] = -2.2303128580845168;
A[110] = 8.2697809905355371;
A[111] = -3.5370261349046359;
A[112] = -10.635652520494659;
A[113] = -1.1150987096045810;
A[114] = 16.080802383075479;
A[115] = -17.609704147364482;
A[116] = 3.8520722664354707;
A[117] = -7.1155038881345263;
A[118] = 5.0992335982655277;
A[119] = 0.11057046029532103;
A[120] = -16.996283197734556;
A[121] = -2.8142611188445699;
A[122] = 1.3972514502254398;
A[123] = -5.6288263172245934;
A[124] = -8.0411324089345726;
A[125] = 4.3721951115353477;
A[126] = 13.281794683085536;
A[127] = 0.80339037801536506;
A[128] = 8.8392435102655327;
A[129] = -9.2784137934445425;
A[130] = 5.9920036958353649;
A[131] = 16.517919442315360;
A[132] = 15.185567550845462;
A[133] = -6.2802865990645387;
A[134] = 10.837377362575353;
A[135] = -18.837689358944544;
A[136] = -11.206747343964480;
A[137] = -6.6212829135445190;
A[138] = -14.022911338184485;
A[139] = -3.7686574583344736;
A[140] = 8.9123917797253398;
A[141] = 16.612753642085409;
A[142] = 7.8819161164153684;
A[143] = 0.25562784110547909;
A[144] = -8.6980048893544790;
A[145] = -6.9574707040644626;
A[146] = 10.117602745665408;
A[147] = 11.294667040675449;
A[148] = 1.7739188755654141;
A[149] = 7.7365305676853495;
A[150] = -0.26382349191453613;
A[151] = 11.221091171565376;
A[152] = -13.112256783064595;
A[153] = 1.2354644818553879;
A[154] = -8.9861684378445261;
A[155] = 15.004131388505357;
A[156] = 3.4457460135054134;
A[157] = 17.950488604925340;
A[158] = -8.2946981690145094;
A[159] = 18.096192080405444;
A[160] = -12.438535945684634;
A[161] = -1.7835740069745043;
A[162] = 11.457478779445410;
A[163] = 17.032609385085379;
A[164] = 17.355757650765327;
A[165] = -20.147741400644463;
A[166] = 4.1238928866753213;
A[167] = 17.527394913215403;
A[168] = 9.6365622387154417;
A[169] = -5.5453338553545564;
A[170] = 1.0512247617755293;
A[171] = -4.2047804091346279;
A[172] = -20.851080074404535;
A[173] = 3.3407996964854192;
A[174] = -10.000678896884665;
A[175] = 11.625892422995321;
A[176] = -2.1548938094945242;
A[177] = 2.4555019403853748;
A[178] = 7.6153756161154433;
A[179] = 12.636285923075320;
A[180] = -17.797677427524604;
A[181] = 6.6154713386154071;
A[182] = -18.407989765574484;
A[183] = 13.669161739755509;
A[184] = -15.145117448884548;
A[185] = -3.6193665255045744;
A[186] = -4.7283175172144638;
A[187] = 6.8457056196255053;
A[188] = 9.9167900620454930;
A[189] = 2.2885350802555422;
double* U = NULL; // U is NOT used, the U data is written to array A
auto* S = new double(1);
vector<double> VT(N * N);
const char jobu = 'O'; // the first min(m,n) columns of U (the left singular vectors) are overwritten on the array A;
const char jobVt = 'A'; // all N rows of V**T are returned in the array VT;
const int lda = M; // The leading dimension of the matrix a.
const int ldvt = N; // Right singular vector matrix
double worksize;
int info = 0;
int lwork = -1; // this triggers the required workspace calculation below
DGESVD(FORTSTRINGARG(&jobu), FORTSTRINGARG(&jobVt),
&M, &N, &A[0], &lda, &S[0], U, &lda, &VT[0], &ldvt, &worksize, &lwork, &info);
lwork = static_cast<int>(worksize);
vector<double> work(lwork); // allocate necessary workspace for subsequent SVD calculation
DGESVD(FORTSTRINGARG(&jobu), FORTSTRINGARG(&jobVt),
&M, &N, &A[0], &lda, &S[0], U, &lda, &VT[0], &ldvt, &work[0], &lwork, &info);
for (int i = 0; i < A.size(); ++i)
{
std::cout << "A[" << i << "] = " << A[i] << " \n"; /*For 2020.1 matrix contains all 0, except of first element which is 1. For 2019.3 - not 0 values*/
}
return 0;
}
Hello Yevhen,
The fix of the problem has been released in oneMKL v.2021.1 which available for download.
链接已复制
Do you expect to obtain bit to bit outputs?
I checked the 3 updates of the 2019 version and see the same results.
See, the outputs when this case has been linked against MKL 2019 update 0, 2, and 4 and MKL v.2020 u2 attached ( _2019u0.res _2019u2.res _2019u4.res _2020u2.res correspondingly).
Testing system: Linux, RH71, AVX2 based system, OpenMP threading, lp64 mode.
The output results are attached.
Hi Gennady,
Thank you very much for trying!
Is it possible if you try it on Win with 2020.1 version (not updated one)?
Maybe there is something wrong when running on windows.
Thank you!
Good day Gennady,
Thank you for your help once again.
I found out what caused the difference in my case. I installed the latest intel.mkl update, created VS 2019 console project from scratch and tried to play with MKL settings. When I selected Use Intel MKL: Parallel , I received correct results. While choosing Sequential gives me bunch of zeros.
While googling I found out that one other guys had similar problem and you responded to that
Though in my case I don't understand why there is a difference here and how to switch mode in production to run it in parallel.
Thank you!
Hello,
thanks for the update, The results you obtained looks very strangely. I will check the problem and get back asap.
yes, I reproduced the problem and we will check what's going wrong with this case. We will keep you updated on the status of the problem.
Regards,
Gennady
Hello Gennady!
Is there any information regarding this issue?
Thanks
Hello Yevhen,
the problem has been confirmed but I ( we) couldn't share which version/update of mkl would contain the fix of the problem.
my bad, sorry, please forget the previous message. The fix of the problem is planning to be available for the next ( nearest) release of MKL.
Regards,
Gennady
Hello Yevhen,
The fix of the problem has been released in oneMKL v.2021.1 which available for download.
Amazing news!
I can confirm it works on our side.
Thank you very much!
Yevhen, thanks for the update.
This issue has been resolved and we will no longer respond to this thread. If you require additional assistance from Intel, please start a new thread. Any further interaction in this thread will be considered community only.