int main(int argc, char *argv[]) { initTracer(); scene *curscene = sceneLoad(); TGAFILE *tga = openTGA(curscene); clock_t start = clock(); int i, j; for (j = 0; j < (int)curscene->resolution; j++) { printf("Scanning horizontal line %d.\n", j); for (i = 0; i < (int)curscene->resolution; i++) { vector color = pixelraytrace(curscene, i, j); writeTGAColor(tga, curscene, i, j, color.x, color.y, color.z); } } clock_t end = clock(); printf("Entire process took %.4f seconds.\n", ((double)(end - start)) / CLOCKS_PER_SEC); sceneFree(curscene); closeTGA(tga); return 0; }
int main(int argc, char *argv[]) { initTracer(); int i; int rank, size; scene *curscene; int res; TGAFILE* tga = NULL; vector *scanline; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (rank == 0) { curscene = sceneLoad(); tga = openTGA(curscene); } else curscene = calloc(1, sizeof(scene)); MPI_Bcast((void*)curscene, sizeof(scene) / sizeof(float), MPI_FLOAT, 0, MPI_COMM_WORLD); res = sceneResolution(curscene); scanline = calloc(res, sizeof(vector)); int line = 0; float aaweight = 1.0f / size; for (line = 0; line < res; line++) { if (rank == size - 1) { printf("Starting scan of horizontal line %d.\n", line); } else { MPI_Recv(scanline, (sizeof(vector) / sizeof(float)) * res, MPI_FLOAT, rank + 1, MPI_ANY_TAG, MPI_COMM_WORLD, &status); } for (i = 0; i <res; i++) { if (rank == size - 1) scanline[i] = smul(pixelraytraceaa(curscene, line, i, rank), aaweight); else scanline[i] = add(scanline[i], smul(pixelraytraceaa(curscene, line, i, rank), aaweight)); } if (rank == 0) { for (i = 0; i < res; i++) writeTGAColor(tga, curscene, line, i, scanline[i].x, scanline[i].y, scanline[i].z); } else { MPI_Send(scanline, (sizeof(vector) / sizeof(float)) * res, MPI_FLOAT, rank - 1, 0, MPI_COMM_WORLD); } } free(curscene); MPI_Finalize(); return 0; }
void dumpTGA(const Common::UString &fileName, const ImageDecoder *image) { if (!image || (image->getLayerCount() < 1) || (image->getMipMapCount() < 1)) throw Common::Exception("No image"); int32 width = image->getMipMap(0, 0).width; int32 height = 0; for (size_t i = 0; i < image->getLayerCount(); i++) { const ImageDecoder::MipMap &mipMap = image->getMipMap(0, i); if (mipMap.width != width) throw Common::Exception("dumpTGA(): Unsupported image with variable layer width"); height += mipMap.height; } Common::ScopedPtr<Common::WriteStream> file(openTGA(fileName, width, height)); for (size_t i = 0; i < image->getLayerCount(); i++) writeMipMap(*file, image->getMipMap(0, i), image->getFormat()); file->flush(); }
int main(int argc, char *argv[]) { initTracer(); int i, p; int rank, size; scene *curscene; int res; TGAFILE* tga = NULL; vector *scanline; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (rank == 0) { curscene = sceneLoad(); tga = openTGA(curscene); } else curscene = calloc(1, sizeof(scene)); double start, end; start = MPI_Wtime(); MPI_Bcast((void*)curscene, sizeof(scene) / sizeof(float), MPI_FLOAT, 0, MPI_COMM_WORLD); res = sceneResolution(curscene); scanline = calloc(res, sizeof(vector)); if (rank == 0) { int lastline = 0; int waiting = res; for (lastline = 0; lastline < size - 1; lastline++) { MPI_Send(&lastline, 1, MPI_INT, lastline + 1, 0, MPI_COMM_WORLD); } int flag; while(1) { if (waiting == 0) break; MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status); if (flag) { MPI_Recv(scanline, (sizeof(vector) / sizeof(float)) * res, MPI_FLOAT, status.MPI_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, &status); if (lastline < res) { MPI_Send(&lastline, 1, MPI_INT, status.MPI_SOURCE, 0, MPI_COMM_WORLD); lastline++; } for (i = 0; i < res; i++) writeTGAColor(tga, curscene, status.MPI_TAG, i, scanline[i].x, scanline[i].y, scanline[i].z); waiting--; } } flag = -1; for (p = 1; p < size; p++) { MPI_Send(&flag, 1, MPI_INT, p, 0, MPI_COMM_WORLD); } } else { int line; while(1) { MPI_Recv(&line, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); if (line < 0) { break; } printf("Process %d scanning horizontal line %d.\n", rank, line); for (i = 0; i < res; i++) scanline[i] = pixelraytrace(curscene, line, i); MPI_Send(scanline, (sizeof(vector) / sizeof(float)) * res, MPI_FLOAT, 0, line, MPI_COMM_WORLD); } } free(curscene); end = MPI_Wtime(); if (rank == 0) printf("Entire process took %.4f seconds.\n", end - start); MPI_Finalize(); return 0; }