// Secondary Thread Function DWORD WINAPI WorkerThread(LPVOID *lpParam) { int ThreadNumber = (int)(long long int)lpParam; int Set1 = 2*ThreadNumber-(ThreadNumber&0x01); int Set2 = (Set1+2)%Sets; int Index = 0; Msg_t MsgBuffer; hMutex[1][ThreadNumber] = CreateMutex(NULL, TRUE, NULL); WaitForSingleObject(hMutexMsg[ThreadNumber], INFINITE); Msg[ThreadNumber] = READY; ReleaseMutex(hMutexMsg[ThreadNumber]); while (1) { // Wait until a message has been posted WaitForSingleObject(hMutex[Index][ThreadNumber], INFINITE); ++Index %= 3; // Retrieve the message MsgBuffer = Msg[ThreadNumber]; Msg[ThreadNumber] = NO_MSG; switch (MsgBuffer) { case NO_MSG: printf("Thread %d received error\n", ThreadNumber+1); Sleep(2000); exit(1); break; case SCATTER_1: Scatter(Set1); break; case SCATTER_2: Scatter(Set2); break; case CONNECT: CopyNodeAdditions(Set1); CopyNodeAdditions(Set2); Connect(Set1); Connect(Set2); break; case END: ExitThread(0); } ReleaseMutex(hMutex[Index][ThreadNumber]); ++Index %= 3; } }
MatrixXcf Circuit_Handler::get_Port_Scattering(){ MatrixXcf S(num_of_nodes,num_of_nodes); // int srowscols = ports.size(); MatrixXcf Scatter(num_of_ports,num_of_ports); S = calc_S(); int m = 0; for(vector<int>::iterator it = ports.begin(); it != ports.end(); ++it){ int port1 = *it; int matrow = port1-1; int n = 0; for(vector<int>::iterator et = ports.begin(); et != ports.end(); ++et){ int port2 = *et; int matcol = port2-1; //offset for matrix Scatter(m,n) = S(matrow,matcol); ++n; } ++m; } return Scatter; }
TEST(ResidualPlot, ResidualPlot2) { TestPlot< ResidualPlot >("ResidualPlot2", []() { vec x = 2 + randn(100); vec y = 2 + 3 * square(x) + 2 * randn(100); ResidualPlot f(x, y); f.SetOrder(1) .SetColour("g") .SetScatter(Scatter().SetSize(3.0)) .SetLine(Line().SetLineWidth(5)); return f; }); }
// Secondary Thread Function DWORD WINAPI WorkerThread(LPVOID *lpParam) { ThreadData_t *Data = (ThreadData_t*)lpParam; int x = Data->Index.X; int y = Data->Index.Y; int z = Data->Index.Z; HANDLE hEventArray[3]; DWORD EventBuffer; hEventArray[0] = hScatterEvent[x][y][z]; hEventArray[1] = hConnectEvent[x][y][z]; hEventArray[2] = hEndEvent[x][y][z]; // Tell the main thread the worker is ready SetEvent(hReadyEvent[x][y][z]); while (1) { // Wait until a message has been posted EventBuffer = WaitForMultipleObjects(3, hEventArray, false, INFINITE); switch (EventBuffer) { case SCATTER_EVENT: Scatter(Data); break; case CONNECT_EVENT: CopyNodeAdditions(Data); Connect(Data); break; case END_EVENT: ExitThread(0); break; default: printf("Thread %d received error",x); Sleep(2000); exit(1); } SetEvent(hReadyEvent[x][y][z]); } }
/* ========================================================================== */ int main(int argc, char* argv[]) { MPI_Comm comm; char generate_list_flag; int my_rank, global_list_size = 0, list_size = 0, p; int *my_list = NULL, *neighbors_list = NULL, *merge_list = NULL; Initialize_mpi(argc, argv, &comm, &p, &my_rank); Get_args(argc, argv, &global_list_size, &generate_list_flag, &list_size, p); Initializer(&my_list, &neighbors_list, &merge_list, list_size); Scatter(generate_list_flag, my_list, neighbors_list, merge_list, global_list_size, list_size, my_rank, comm); qsort(my_list, list_size, sizeof(int), Compare); Mpi_Bitonic_sort(my_rank, p, my_list, neighbors_list, list_size, comm); Finalizer(my_list, neighbors_list, merge_list); return 0; } /* main */