{"id":22204159,"url":"https://github.com/wlellington/parallel_fft","last_synced_at":"2025-03-25T02:43:23.923Z","repository":{"id":221888059,"uuid":"91611609","full_name":"wlellington/parallel_FFT","owner":"wlellington","description":"A set of Fast Fourier Transform programs written in serial, using OpenMP, and MPI","archived":false,"fork":false,"pushed_at":"2017-05-17T20:07:25.000Z","size":1446,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-01-30T03:44:16.604Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wlellington.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2017-05-17T19:12:54.000Z","updated_at":"2017-05-17T19:23:26.000Z","dependencies_parsed_at":"2024-02-10T20:48:56.928Z","dependency_job_id":null,"html_url":"https://github.com/wlellington/parallel_FFT","commit_stats":null,"previous_names":["wlellington/parallel_fft"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlellington%2Fparallel_FFT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlellington%2Fparallel_FFT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlellington%2Fparallel_FFT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlellington%2Fparallel_FFT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wlellington","download_url":"https://codeload.github.com/wlellington/parallel_FFT/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245388750,"owners_count":20607163,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-02T17:16:17.620Z","updated_at":"2025-03-25T02:43:23.901Z","avatar_url":"https://github.com/wlellington.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Parallel FFT\nA set of Fast Fourier Transform programs written in serial, using OpenMP, and MPI\n\nWesley Ellington\n\nDaniel Reynolds\n\nMath 4370\n\n## Overview\nThis set of tools implements a simple FFT tool using various parallelization tools. It was designed mostly with MPI in mind,\nso most performace benefits will be seen in that version on a large scale. It uses an iterative solution rather than the\nmore common recursive method, in an attempt to deal with larger problems that may lead to memory issues.\n\nIt is important to note that there is a specific format each program is expecting its input data to be in. Each folder \ncontains a simple Python script to create input of this type and to serve as an example. In its current state, it must \nread in a text file (either all real, or complex will work) as input. Future plans include adding image filetypes.\n\nEach different build will require special dependancies to construct. A Makefile exists in each version for easy compilation,\nbut may require a module loaded, or some minor tweaks.\n\nAll versions were tested and run on Southern Methodist University's ManeFrame supercomputer\n\n## Serial\nThis version relies heavily on the use of a complex vector \"class\" for operation. All functions are written for this type of\nobject and must be supplied with the proper input format to run properly. In this stage, both 1D and 2D signals can be \nprocessed, but do assume problems sizes of 2^n nodes or 2^n by 2^n for 1D and 2D respectivly. \n\nThis complex vector struct can handle most of its own I/O, meaning that it can be printed to console, read from a file, or \ndumped into a file at command.\n\n## OpenMP\nIn order to build this version, it must be compiled on a machine that is OpenMP compatable. Otherwise, it will be no different\nfrom the serial implementation, but should still compile.\n\nSince very little can be done to parallelize the inner loops of a 1D FFT (at least it was of very little benefit), so most of\nthe performance benefit will be seen in the 2D version of the tool. Here, the whole signal was decomposed into strips and\nprocessed individually by each thread.\n\n## MPI\nIn terms of large scale computing, this is by far the most effective choice. It should be noted that this version requires a\npower of two MPI tasks to run, but can scale to any square, power of two signal.\n\nUnlike previous implementations, the vector structs have been removed in calculation stages\n\tThis is to ensure that no index issues arise during data reordering from all to all\n\nThe overall proccess occurs as follows:\n\n1. MPI is initialized, spawning N processes\n\n2. All processes get their Id and number of procs in rank\n\tThey will also know the problem size at this point\n\n3. Process 0 loads all data for transform from file\n\tThis will be done without a struct, dealing out data in read time as complex values\n\t0 will read in 1/N data as several rows, concatonate as a long array\n\tand push to respective procs\n\n\n\tEach process will receive 1/N the work for the comm group\n\tThis includes proc 0, all processes will know total problem size\n\n4. Processes will compute 1D transforms for each of their rows\n\tFor example, if 4 procs exist in a 16 X 16 problem, each will do 4 rows\n\n5. Each proc will \"weave\" data together to create correct distribution pattern for data\n\tEX: The first N values in the send buffer must be the first item in each resultant array,\n\tso the receving process must collect information and read it as the first value of the array\n\tthen do so with each subsiquent value from the chunked data (each prox does more than one row)\n\n6. Data is sent to new threads, decoded into proper indecies for iteration\n\n7. FFTs are run over each chunk\n\n8. All processes call back to 0, returning calculated values to base process\n\n9. Information is stored in mother array\n\n10. Data is output to file.\n\nAs of now, the MPI version cannot be called from outside programs, but must be run with input throught its driver.\nFuture versions will not have this limitation.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwlellington%2Fparallel_fft","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwlellington%2Fparallel_fft","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwlellington%2Fparallel_fft/lists"}