void WUploadThread::DoUpload() { PRINT("WUploadThread::DoUpload\n"); if (fShutdownFlag && *fShutdownFlag) // Do we need to interrupt? { ConnectTimer(); return; } // Still connected? if (!IsInternalThreadRunning()) { ConnectTimer(); return; } // Small files get to bypass queue if (IsLocallyQueued()) { if ( (fFile && (fFileSize >= gWin->fSettings->GetMinQueuedSize())) || IsManuallyQueued() ) { // not yet fForced = false; WUploadEvent *lq = new WUploadEvent(WUploadEvent::FileQueued); if (lq) { SendReply(lq); } return; } fForced = true; // Set this here to avoid duplicate call to DoUpload() } // Recheck if IP is ignored or not // if (gWin->IsIgnoredIP(fStrRemoteIP) && !IsBlocked()) { SetBlocked(true); } if (IsBlocked()) { WUploadEvent *wue = new WUploadEvent(WUploadEvent::FileBlocked); if (wue) { if (fTimeLeft != -1) wue->SetTime(fTimeLeft); SendReply(wue); } return; } if (fStartTime == 0) fStartTime = GetRunTime64(); if (fFile) { MessageRef uref(GetMessageFromPool(WTransfer::TransferFileData)); if (uref()) { // think about doing this in a dynamic way (depending on connection) double dpps = GetPacketSize() * 1024.0; uint32 bufferSize = lrint(dpps); ByteBufferRef buf = GetByteBufferFromPool(bufferSize); uint8 * scratchBuffer = buf()->GetBuffer(); if (scratchBuffer == NULL) { _nobuffer(); return; } int32 numBytes = 0; numBytes = fFile->ReadBlock32(scratchBuffer, bufferSize); if (numBytes > 0) { buf()->SetNumBytes(numBytes, true); // munge mode switch (fMungeMode) { case WTransfer::MungeModeNone: { uref()->AddInt32("mm", WTransfer::MungeModeNone); break; } case WTransfer::MungeModeXOR: { for (int32 x = 0; x < numBytes; x++) scratchBuffer[x] ^= 0xFF; uref()->AddInt32("mm", WTransfer::MungeModeXOR); break; } default: { break; } } if (uref()->AddFlat("data", buf) == B_OK) { // possibly do checksums here uref()->AddInt32("chk", CalculateFileChecksum(buf)); // a little paranoia, due to file-resumes not working.... (TCP should handle this BUT...) SendMessageToSessions(uref); // NOTE: RequestOutputQueuesDrainedNotification() can recurse, so we need to update the offset before // calling it! fCurrentOffset += numBytes; if (fTunneled) { SignalUpload(); } else { MessageRef drain(GetMessageFromPool()); if (drain()) qmtt->RequestOutputQueuesDrainedNotification(drain); } WUploadEvent *update = new WUploadEvent(WUploadEvent::FileDataSent); if (update) { update->SetOffset(fCurrentOffset); update->SetSize(fFileSize); update->SetSent(numBytes); if (fCurrentOffset >= fFileSize) { update->SetDone(true); // file done! update->SetFile(SimplifyPath(fFileUl)); if (gWin->fSettings->GetUploads()) { SystemEvent( gWin, tr("%1 has finished downloading %2.").arg( GetRemoteUser() ).arg( SimplifyPath(fFileUl) ) ); } } SendReply(update); } return; } else { _nobuffer(); return; } } if (numBytes <= 0) { NextFile(); SignalUpload(); return; } } } else { while (!fFile) { if (fUploads.GetNumItems() != 0) { // grab the ref and remove it from the list fUploads.RemoveHead(fCurrentRef); fFileUl = MakeUploadPath(fCurrentRef); #ifdef _DEBUG // <*****@*****.**> 20021023, 20030702 -- Add additional debug message WString wul(fFileUl); PRINT("WUploadThread::DoUpload: filePath = %S\n", wul.getBuffer()); #endif fFile = new WFile(); Q_CHECK_PTR(fFile); if (!fFile->Open(fFileUl, QIODevice::ReadOnly)) // probably doesn't exist { delete fFile; fFile = NULL; fCurFile++; continue; // onward } // got our file! fFileSize = fFile->Size(); fCurrentOffset = 0; // from the start if (fCurrentRef()->FindInt64("secret:offset", fCurrentOffset) == B_OK) { if (!fFile->Seek(fCurrentOffset)) // <*****@*****.**> 20021026 { fFile->Seek(0); // this can't fail :) (I hope) fCurrentOffset = 0; } } // copy the message in our current file ref MessageRef headRef = fCurrentRef.Clone(); if (headRef()) { headRef()->what = WTransfer::TransferFileHeader; headRef()->AddInt64("beshare:StartOffset", fCurrentOffset); SendMessageToSessions(headRef); } fCurFile++; // Reset statistics InitTransferRate(); InitTransferETA(); WUploadEvent *started = new WUploadEvent(WUploadEvent::FileStarted); if (started) { started->SetFile(SimplifyPath(fFileUl)); started->SetStart(fCurrentOffset); started->SetSize(fFileSize); #ifdef _DEBUG started->SetSession(fRemoteSessionID); #endif SendReply(started); } if (gWin->fSettings->GetUploads()) { SystemEvent( gWin, tr("%1 is downloading %2.").arg( GetRemoteUser() ).arg( SimplifyPath(fFileUl) ) ); } // nested call SignalUpload(); return; } else { PRINT("No more files!\n"); fWaitingForUploadToFinish = true; SetFinished(true); if (fTunneled) { _OutputQueuesDrained(); } else { MessageRef drain(GetMessageFromPool()); if (drain()) qmtt->RequestOutputQueuesDrainedNotification(drain); } break; } } } }
int main(int argc, char **argv) { char testName[32]; /* Initialise storage for test results & parse input arguements. */ init(argc, argv); /* Ensure device is awake. */ wul(); /* Level 0 Tests - Speeds and Feeds */ sprintf(testName, "ContigH2D"); benchmark(testName, &contig_htod); sprintf(testName, "ContigD2H"); benchmark(testName, &contig_dtoh); sprintf(testName, "SlicedD2H"); benchmark(testName, &sliced_dtoh); sprintf(testName, "SlicedH2D"); benchmark(testName, &sliced_htod); sprintf(testName, "Kernels_If"); benchmark(testName, &kernels_if); sprintf(testName, "Parallel_If"); benchmark(testName, ¶llel_if); sprintf(testName, "Parallel_private"); benchmark(testName, ¶llel_private); sprintf(testName, "Parallel_1stprivate"); benchmark(testName, ¶llel_firstprivate); sprintf(testName, "Kernels_combined"); benchmark(testName, &kernels_combined); sprintf(testName, "Parallel_combined"); benchmark(testName, ¶llel_combined); sprintf(testName, "Update_Host"); benchmark(testName, &update); sprintf(testName, "Kernels_Invocation"); benchmark(testName, &kernels_invoc); sprintf(testName, "Parallel_Invocation"); benchmark(testName, ¶llel_invoc); sprintf(testName, "Parallel_Reduction"); benchmark(testName, ¶llel_reduction); sprintf(testName, "Kernels_Reduction"); benchmark(testName, &kernels_reduction); /* Level 1 Tests - BLAS-esque kernels */ sprintf(testName, "2MM"); benchmark(testName, &twomm); sprintf(testName, "3MM"); benchmark(testName, &threemm); sprintf(testName, "ATAX"); benchmark(testName, &atax); sprintf(testName, "BICG"); benchmark(testName, &bicg); sprintf(testName, "MVT"); benchmark(testName, &mvt); sprintf(testName, "SYRK"); benchmark(testName, &syrk); sprintf(testName, "COV"); benchmark(testName, &covariance); sprintf(testName, "COR"); benchmark(testName, &correlation); sprintf(testName, "SYR2K"); benchmark(testName, &syr2k); sprintf(testName, "GESUMMV"); benchmark(testName, &gesummv); sprintf(testName, "GEMM"); benchmark(testName, &gemm); sprintf(testName, "2DCONV"); benchmark(testName, &twodconv); sprintf(testName, "3DCONV"); benchmark(testName, &threedconv); /* Level 2 Tests - small applications */ sprintf(testName, "27S"); benchmark(testName, &stencil); sprintf(testName, "LE2D"); benchmark(testName, &le_main); sprintf(testName, "HIMENO"); benchmark(testName, &himeno_main); /* Print results & free results storage */ finalise(); return EXIT_SUCCESS; }
int main ( int argc, char *argv[] ) { //printf("Starting..\n"); int matrix_dim = 32; /* default size */ int opt, option_index=0; func_ret_t ret; const char *input_file = NULL; float *m, *mm; stopwatch sw; int grid_x=0; int grid_y=0; while ((opt = getopt_long(argc, argv, "::vs:i:x:y:", long_options, &option_index)) != -1 ) { switch(opt){ case 'i': input_file = optarg; break; case 'v': do_verify = 1; break; case 's': matrix_dim = atoi(optarg); //printf("Generate input matrix internally, size =%d\n", matrix_dim); // fprintf(stderr, "Currently not supported, use -i instead\n"); // fprintf(stderr, "Usage: %s [-v] [-s matrix_size|-i input_file]\n", argv[0]); // exit(EXIT_FAILURE); break; case 'x': grid_x = atoi(optarg); break; case 'y': grid_y = atoi(optarg); break; case '?': fprintf(stderr, "invalid option\n"); break; case ':': fprintf(stderr, "missing argument\n"); break; default: fprintf(stderr, "1Usage: %s [-v] [-s matrix_size|-i input_file]\n", argv[0]); exit(EXIT_FAILURE); } } /* if ( (optind < argc) || (optind == 1)) { fprintf(stderr, "2Usage: %s [-v] [-n no. of threads] [-s matrix_size|-i input_file]\n", argv[0]); exit(EXIT_FAILURE); } */ if (input_file) { //printf("Reading matrix from file %s\n", input_file); ret = create_matrix_from_file(&m, input_file, &matrix_dim); if (ret != RET_SUCCESS) { m = NULL; fprintf(stderr, "error create matrix from file %s\n", input_file); exit(EXIT_FAILURE); } } else if (matrix_dim) { //printf("Creating matrix internally size=%d\n", matrix_dim); ret = create_matrix(&m, matrix_dim); if (ret != RET_SUCCESS) { m = NULL; fprintf(stderr, "error create matrix internally size=%d\n", matrix_dim); exit(EXIT_FAILURE); } } else { printf("No input file specified!\n"); exit(EXIT_FAILURE); } if (do_verify){ /* print_matrix(m, matrix_dim); */ matrix_duplicate(m, &mm, matrix_dim); } wul(); //printf("Starting. . . \n"); //lud_oacc(m, matrix_dim,grid_x,grid_y); stopwatch_start(&sw); // lud_omp(m, matrix_dim); lud_oacc(m, matrix_dim,grid_x,grid_y); stopwatch_stop(&sw); printf("Time consumed(ms): %lf\n", 1000*get_interval_by_sec(&sw)); if (do_verify){ printf("After LUD\n"); /* print_matrix(m, matrix_dim); */ printf(">>>Verify<<<<\n"); lud_verify(mm, m, matrix_dim); free(mm); } free(m); return EXIT_SUCCESS; } /* ---------- end of function main ---------- */