void EigenSolver(const Matrix3x3& mtx, float* eigenValues, Vector3* eigenVecs) { double roots[3] = {0.0}; ComputeRoots(mtx, roots); eigenValues[0] = static_cast<float>(roots[0]); eigenValues[1] = static_cast<float>(roots[1]); eigenValues[2] = static_cast<float>(roots[2]); Matrix3x3 m0 = mtx - (Matrix3x3::IDENTITY * eigenValues[0]); int m0rank = ::ComputeRank(m0); if (m0rank == 0) { eigenVecs[0] = Vector3(1.0f, 0.0f, 0.0f); eigenVecs[1] = Vector3(0.0f, 1.0f, 0.0f); eigenVecs[2] = Vector3(0.0f, 0.0f, 1.0f); return; } else if (m0rank == 1) { GetComplement2(m0.GetRow(0), eigenVecs[0], eigenVecs[1]); eigenVecs[2] = eigenVecs[0].Cross(eigenVecs[1]); return; } // m0rank == 2 eigenVecs[0] = GetComplement1(m0.GetRow(0), m0.GetRow(1)); Matrix3x3 diag( eigenValues[1], 0.0f, 0.0f, 0.0f, eigenValues[1], 0.0f, 0.0f, 0.0f, eigenValues[1]); Matrix3x3 m1 = mtx - diag;//(Matrix3x3::IDENTITY * eigenValues[1]); int m1rank = ComputeRank(m1); if (m1rank == 1) { GetComplement2(eigenVecs[0], eigenVecs[1], eigenVecs[2]); return; } // m1rank == 2 GetComplement2(eigenVecs[0], eigenVecs[1], eigenVecs[2]); //eigenVecs[1] = GetComplement1(m1.GetRow(0), m1.GetRow(1)); //eigenVecs[2] = eigenVecs[0].Cross(eigenVecs[1]); }
void Consumer::Execute(void* arg) { // Your code goes here ThreadParam* threadParam = (ThreadParam*)arg; StaticRankHead headStaticRank; // 为了更大的并行计算,输出文件采用一个线程一个文件的方式 char fname[256]; sprintf(fname, "/data/xce/friendranknew/data/friend_rank/static_rank/static_rank.dat_%ld", pthread_self()); FILE* fpRank = fopen(fname, "wb"); assert(fpRank!=NULL); int span = 0; int slotpos = 0; while (true) { slotpos = threadParam->GetFullSlot(); if (slotpos==-1) { //threadParam->Print(); //pthread_testcancel(); // 取消点, sem_wait也是取消点 if (threadParam->GetDone()) // 自定义取消点机制,系统取消点实现原理也是如此 { MCE_INFO("\tConsumer "<<pthread_self()<<" receive exit signal"); break; } if (++span % 10000 == 0) { waitTime += span / 100; span = 0; MCE_INFO("\t\t\t\t\t\tConsumer "<<pthread_self()<<" wait "<<waitTime<<"s"); } usleep(10000); // microseconds } else { ComputeRank(threadParam->dataUserModels[slotpos], headStaticRank, buffStaticRank); threadParam->FreeSlot(slotpos); SaveFriendRank(fpRank, headStaticRank, buffStaticRank); } } fclose(fpRank); MCE_INFO("\tConsumer "<<pthread_self()<<" exit"); }