Repository: NLeSC/litstudy
Branch: master
Commit: 391d3afb8830
Files: 102
Total size: 3.5 MB
Directory structure:
gitextract_v2zn9pxr/
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── cffconvert.yml
│ ├── docs.yml
│ ├── python-action.yml
│ ├── python-app.yml
│ └── python-format.yml
├── .gitignore
├── .zenodo.json
├── CHANGELOG.md
├── CITATION.cff
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MANIFEST.in
├── NOTICE
├── README.md
├── docs/
│ ├── Makefile
│ ├── _static/
│ │ ├── citation.html
│ │ └── css/
│ │ └── style.css
│ ├── api/
│ │ ├── index.rst
│ │ ├── network.rst
│ │ ├── nlp.rst
│ │ ├── plot.rst
│ │ ├── sources.rst
│ │ ├── stats.rst
│ │ └── types.rst
│ ├── citation.html
│ ├── conf.py
│ ├── faq.rst
│ ├── index.rst
│ ├── installation.rst
│ ├── license.rst
│ └── make.bat
├── litstudy/
│ ├── __init__.py
│ ├── clean.py
│ ├── common.py
│ ├── continent.py
│ ├── network.py
│ ├── nlp.py
│ ├── plot.py
│ ├── sources/
│ │ ├── __init__.py
│ │ ├── arxiv.py
│ │ ├── bibtex.py
│ │ ├── crossref.py
│ │ ├── csv.py
│ │ ├── dblp.py
│ │ ├── ieee.py
│ │ ├── ris.py
│ │ ├── scopus.py
│ │ ├── scopus_csv.py
│ │ ├── semanticscholar.py
│ │ └── springer.py
│ ├── stats.py
│ ├── stopwords.py
│ └── types.py
├── notebooks/
│ ├── citation.html
│ ├── data/
│ │ ├── exclude.ris
│ │ ├── ieee_1.csv
│ │ ├── ieee_2.csv
│ │ ├── ieee_3.csv
│ │ ├── ieee_4.csv
│ │ ├── ieee_5.csv
│ │ └── springer.csv
│ └── example.ipynb
├── pyproject.toml
├── requirements.txt
├── setup.cfg
├── setup.py
├── sonar-project.properties
└── tests/
├── __init__.py
├── common.py
├── requests/
│ ├── 245f82b3fdc09eaed6a726cd4bddaa2f1565ba90.pickle
│ ├── 4d39f93aa1c9ff4afee9f210b14ade9e5ccf3a58.pickle
│ ├── 4eea59c658fa3076445495dea5554977b85511ff.pickle
│ ├── 5122a6fa38e030c8876096317e7e19aa6534e70a.pickle
│ ├── 54f7b47eb9ceb574f63ec43e8b717364b75b3fa7.pickle
│ ├── 5dec8d884e7221dc8cad8d779c23884c91fde749.pickle
│ ├── 6028198cfd0c1f6c2e2b995ed4802d1c42fb07b2.pickle
│ ├── 6a9fff6a7064528fd44202e78690da248afa23b7.pickle
│ ├── 78a2bca757d42aced207b202458dfd3bf17f0c3d.pickle
│ ├── 7c4b7301a9ccb48f60f360dd28ec6f0dfec9613f.pickle
│ ├── 9b4fc567a80b12bae747c517a4890ce044307aa5.pickle
│ ├── c3c2090c3a0293d71314d226b24f9da74633e092.pickle
│ ├── cfca0170ac37869891777418ee9cf20f17faa581.pickle
│ ├── d1acbf3602743e93bf70589acb072ba87ef3b72b.pickle
│ ├── eeb9079866515efbc22fb670e78f14d11c099a9f.pickle
│ └── ff2a790d6047bbc6bf3ee8d5cc73c47237b95bf8.pickle
├── resources/
│ ├── example.ris
│ ├── ieee.csv
│ ├── retraction_watch.csv
│ ├── scopus.csv
│ └── springer.csv
├── test_common.py
├── test_nlp_corpus.py
├── test_sources_arxiv.py
├── test_sources_crossref.py
├── test_sources_csv.py
├── test_sources_ieee.py
├── test_sources_ris.py
├── test_sources_scopus_csv.py
├── test_sources_semanticscholar.py
└── test_sources_springer.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
*.ipynb linguist-documentation
================================================
FILE: .github/workflows/cffconvert.yml
================================================
name: cffconvert
on:
push:
paths:
- CITATION.cff
jobs:
validate:
name: "validate"
runs-on: ubuntu-latest
steps:
- name: Check out a copy of the repository
uses: actions/checkout@v2
- name: Check whether the citation metadata from CITATION.cff is valid
uses: citation-file-format/cffconvert-github-action@2.0.0
with:
args: "--validate"
================================================
FILE: .github/workflows/docs.yml
================================================
# This is a basic workflow to help you get started with Actions
name: Build documentation
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
steps:
- name: Setup python
uses: actions/setup-python@v2
with:
python-version: '3.8'
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0 # otherwise, you will failed to push refs to dest repo
- name: Setup dependencies
run: |
sudo apt-get update
sudo apt-get install python3-sphinx pandoc
python -m pip install --upgrade pip
python -m pip install sphinx_rtd_theme unidecode nbsphinx wheel sphinx_mdinclude myst-parser
python -m pip install .[doc]
- name: Build and commit
uses: sphinx-notes/pages@v2
with:
documentation_path: './docs'
requirements_path: 'requirements.txt'
- name: Push documentation
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: gh-pages
================================================
FILE: .github/workflows/python-action.yml
================================================
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Build and Test
on:
workflow_call:
inputs:
python-version:
required: true
type: string
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ inputs.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ inputs.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 pytest
pip install .
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=20 --max-line-length=127 --statistics
- name: Test with pytest
run: |
pytest
================================================
FILE: .github/workflows/python-app.yml
================================================
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Build and Test
on:
[push, pull_request]
jobs:
# Check for Python 3.8 first. If this one fails,
# there is no need to check other versions of Python
build-python-38:
uses: ./.github/workflows/python-action.yml
with:
python-version: "3.8"
build-python-39:
needs: build-python-38
uses: ./.github/workflows/python-action.yml
with:
python-version: "3.9"
build-python-310:
needs: build-python-38
uses: ./.github/workflows/python-action.yml
with:
python-version: "3.10"
build-python-311:
needs: build-python-38
uses: ./.github/workflows/python-action.yml
with:
python-version: "3.11"
# build-python-311:
# needs: build-python-38
# uses: ./.github/workflows/python-action.yml
# with:
# python-version: "3.11"
================================================
FILE: .github/workflows/python-format.yml
================================================
name: Lint with black
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: psf/black@stable
with:
options: "--check --verbose"
src: "./litstudy"
jupyter: true
version: "23.1.0"
================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
doc/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
# notebooks
notebooks/*.eps
notebooks/.*
# bibliometrix
.crossref*
.semantis*
================================================
FILE: .zenodo.json
================================================
{
"creators": [
{
"name": "Heldens, S",
"orcid": "0000-0001-8792-6305"
}
],
"license": {
"id": "Apache-2.0"
},
"title": "automated-literature-analysis"
}
================================================
FILE: CHANGELOG.md
================================================
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
### Changed
- Fix unclear documentation of `search_semanticscholar` function, see PR #86 (thanks danibene!).
### Removed
### Fixed
## [1.0.6] 2023-10-05
### Added
- Add support for loading CSV files exported from Scopus (see PR #45, Thanks tleedepriest!)
### Changed
### Removed
### Fixed
- Fix incorrect return type of `load_ris_file` (fixes #34)
- Fix passing session as non-positional argument in `refine_semanticscholar`, see PR #35. (Thanks martinuray!)
- Fix incorrect filtering in `Corpus` when building corpus from docs (fixes #38)
- Fix error when calling `fetch_crossref` and `refine_crossref` with `session=None` as argument (fixes #40)
- Fix KeyError when loading CSV files from IEEE that have an incorrect format (fixed #55)
- Fix bug in nlp.py due to argument `square_distances` being removed in newer versions of sklearn, see PR #58 (Thanks rjavierch!)
## [1.0.5] - 2023-03-28
### Fixed
- Fix wrong argument in call to `matplotlib.pyplot.grid(...)` due to change in their API
- Fix semanticscholar backend not retrieving papers correctly
## [1.0.4] - 2023-03-02
### Added
- Add `load_csv` function
- Add `search_crossref` function
### Fixed
- Fix issue where CSV files could not be parsed due to BOM marker
## [1.0.3] - 2022-09-21
### Fixed
- Fix bug in the semantic scholar backend that did not fetch papers correctly
- Fix bug in `fetch_crossref` where document title was not extracted correctly
## [1.0.2] - 2022-05-25
### Changed
- Remove dependency on fa2. The version of fa2 on pip is broken under Python 3.9+.
### Fixed
- `litstudy` now works under Python 3.9+.
## [1.0.1] - 2022-05-16
### Added
- Support for the arXiv API (Thanks ksilo!)
### Changed
- Made project compatible with Python 3.6
## [1.0.0] - 2022-02-17
### Changed
- Complete rewrite of litstudy project for 1.0 release.
- Rename from "automated-literature-analysis" to "litstudy".
## [0.0.1] - 2019-09-04
### Added
Initial release of litstudy
================================================
FILE: CITATION.cff
================================================
# This CITATION.cff file was generated with cffinit.
# Visit https://bit.ly/cffinit to generate yours today!
cff-version: 1.2.0
title: litstudy
message: >-
If you use this software, please cite it using the
metadata from this file.
type: software
authors:
- given-names: Stijn
family-names: Heldens
email: s.heldens@esciencecenter.nl
affiliation: Netherlands eScience Center
orcid: 'https://orcid.org/0000-0001-8792-6305'
- given-names: Alessio
family-names: Sclocco
email: a.sclocco@esciencecenter.nl
affiliation: Netherlands eScience Center
orcid: 'https://orcid.org/0000-0003-3278-0518'
- given-names: Henk
family-names: Dreuning
email: h.h.h.dreuning@vu.nl
affiliation: University of Amsterdam
identifiers:
- type: doi
value: 10.5281/zenodo.3386071
doi: 10.5281/zenodo.3386071
repository-code: 'https://github.com/NLeSC/litstudy/'
url: 'https://nlesc.github.io/litstudy/'
keywords:
- python
- jupyter
- literature-review
license: Apache-2.0
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance, race,
religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at s.heldens@esciencecenter.nl. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing guidelines
We welcome any kind of contribution to our software, from simple comment or question to a full fledged [pull request](https://help.github.com/articles/about-pull-requests/). Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md).
A contribution can be one of the following cases:
1. you have a question;
1. you think you may have found a bug (including unexpected behavior);
1. you want to make some kind of change to the code base (e.g. to fix a bug, to add a new feature, to update documentation);
1. you want to make a new release of the code base.
The sections below outline the steps in each case.
## You have a question
1. use the search functionality [here](https://github.com/nlesc/litstudy/issues) to see if someone already filed the same issue;
2. if your issue search did not yield any relevant results, make a new issue;
3. apply the "Question" label; apply other labels when relevant.
## You think you may have found a bug
1. use the search functionality [here](https://github.com/nlesc/litstudy/issues) to see if someone already filed the same issue;
1. if your issue search did not yield any relevant results, make a new issue, making sure to provide enough information to the rest of the community to understand the cause and context of the problem. Depending on the issue, you may want to include:
- the [SHA hashcode](https://help.github.com/articles/autolinked-references-and-urls/#commit-shas) of the commit that is causing your problem;
- some identifying information (name and version number) for dependencies you're using;
- information about the operating system;
1. apply relevant labels to the newly created issue.
## You want to make some kind of change to the code base
1. (**important**) announce your plan to the rest of the community *before you start working*. This announcement should be in the form of a (new) issue;
1. (**important**) wait until some kind of consensus is reached about your idea being a good idea;
1. if needed, fork the repository to your own Github profile and create your own feature branch off of the latest master commit. While working on your feature branch, make sure to stay up to date with the master branch by pulling in changes, possibly from the 'upstream' repository (follow the instructions [here](https://help.github.com/articles/configuring-a-remote-for-a-fork/) and [here](https://help.github.com/articles/syncing-a-fork/));
1. make sure the existing tests still work by running ``pytest``;
1. add your own tests (if necessary);
1. update or expand the documentation;
1. update the `CHANGELOG.md` file with change;
1. push your feature branch to (your fork of) the litstudy repository on GitHub;
1. create the pull request, e.g. following the instructions [here](https://help.github.com/articles/creating-a-pull-request/).
In case you feel like you've made a valuable contribution, but you don't know how to write or run tests for it, or how to generate the documentation: don't let this discourage you from making the pull request; we can help you! Just go ahead and submit the pull request, but keep in mind that you might be asked to append additional commits to your pull request.
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: MANIFEST.in
================================================
include CITATION.cff
include LICENSE
include NOTICE
include README.md
================================================
FILE: NOTICE
================================================
This product includes litstudy, software developed by
Netherlands eScience Center.
================================================
FILE: README.md
================================================
# LitStudy

[](https://github.com/NLeSC/litstudy/)
[](https://zenodo.org/badge/latestdoi/206312286)
[](https://github.com/NLeSC/litstudy/blob/master/LICENSE)
[](https://pypi.org/project/litstudy/)
[](https://github.com/NLeSC/litstudy/actions/)
**LitStudy** is a Python package for analyzing scientific literature right from the comfort of a Jupyter Notebook. It lets you gather publications and explore their metadata through visualizations, network analysis, and natural-language processing.
The package offers five main features:
* **Extract** metadata from scientific documents sourced from various locations. A uniform interface allows combining different data sources.
* **Filter**, **select**, **deduplicate**, and **annotate** document collections.
* Compute and plot general **statistics** for document sets (authors, venues, publication years, and more).
* Generate and plot various **bibliographic networks** as interactive visualizations.
* Discover topics using **natural-language processing** (NLP) to automatically identify popular themes.
## Frequently Asked Questions
If you have any questions or run into an error, see the [_Frequently Asked Questions_](https://nlesc.github.io/litstudy/faq.html) section of the [documentation](https://nlesc.github.io/litstudy/).
If your question or error is not on the list, please check the [GitHub issue tracker](https://github.com/NLeSC/litstudy/issues) for a similar issue or
create a [new issue](https://github.com/NLeSC/litstudy/issues/new).
## Supported Source
LitStudy supports the following data sources. The table below lists which metadata is fully (✓) or partially (*) provided by each source.
| Name | Title | Authors | Venue | Abstract | Citations | References |
|-----------------|-------|---------|-------|----------|----------------|------------|
| [Scopus] | ✓ | ✓ | ✓ | ✓ | ✓ | ✓
| [SemanticScholar] | ✓ | ✓ | ✓ | ✓ | * (count only) | ✓
| [CrossRef] | ✓ | ✓ | ✓ | ✓ | * (count only) | ✓
| [DBLP] | ✓ | ✓ | ✓ | | |
| [arXiv] | ✓ | ✓ | | ✓ | |
| [IEEE Xplore] | ✓ | ✓ | ✓ | ✓ | * (count only) |
| [Springer Link] | ✓ | ✓ | ✓ | ✓ | * (count only) |
| CSV file | ✓ | ✓ | ✓ | ✓ | |
| bibtex file | ✓ | ✓ | ✓ | ✓ | |
| RIS file | ✓ | ✓ | ✓ | ✓ | |
[Scopus]: http://scopus.com/
[SemanticScholar]: https://www.semanticscholar.org/
[CrossRef]: https://www.crossref.org/
[DBLP]: https://dblp.org/
[arXiv]: https://arxiv.org/
[IEEE Xplore]: https://ieeexplore.ieee.org/
[Springer Link]: https://link.springer.com/
## Example
An example notebook is available in `notebooks/example.ipynb` and [here](https://nlesc.github.io/litstudy/example.html).
[](https://github.com/NLeSC/litstudy/blob/master/notebooks/example.ipynb)
## Installation Guide
LitStudy is available on PyPI!
Full installation guide is available [here](https://nlesc.github.io/litstudy/installation.html).
```bash
pip install litstudy
```
Or install the latest development version directly from GitHub:
```bash
pip install git+https://github.com/NLeSC/litstudy
```
## Documentation
Documentation is available [here](https://nlesc.github.io/litstudy/).
## Requirements
The package has been tested for Python 3.7. Required packages are available in `requirements.txt`.
`litstudy` supports several data sources.
Some of these sources (such as semantic Scholar, CrossRef, and arXiv) are openly available.
However to access the Scopus API, you (or your institute) requires a Scopus subscription and you need to request an Elsevier Developer API key (see [Elsevier Developers](https://dev.elsevier.com/index.jsp)).
For more information, see the [guide](https://pybliometrics.readthedocs.io/en/stable/access.html) by `pybliometrics`.
## License
Apache 2.0. See [LICENSE](https://github.com/NLeSC/litstudy/blob/master/LICENSE).
## Change log
See [CHANGELOG.md](https://github.com/NLeSC/litstudy/blob/master/CHANGELOG.md).
## Contributing
See [CONTRIBUTING.md](https://github.com/NLeSC/litstudy/blob/master/CONTRIBUTING.md).
## Citation
If you use LitStudy in your work, please cite the following publication:
> S. Heldens, A. Sclocco, H. Dreuning, B. van Werkhoven, P. Hijma, J. Maassen & R.V. van Nieuwpoort (2022), "litstudy: A Python package for literature reviews", SoftwareX 20
As BibTeX:
```Latex
@article{litstudy,
title = {litstudy: A Python package for literature reviews},
journal = {SoftwareX},
volume = {20},
pages = {101207},
year = {2022},
issn = {2352-7110},
doi = {https://doi.org/10.1016/j.softx.2022.101207},
url = {https://www.sciencedirect.com/science/article/pii/S235271102200125X},
author = {S. Heldens and A. Sclocco and H. Dreuning and B. {van Werkhoven} and P. Hijma and J. Maassen and R. V. {van Nieuwpoort}},
}
```
## Related work
Don't forget to check out these other amazing software packages!
* [ScientoPy](https://www.scientopy.com/): Open-source Python based scientometric analysis tool.
* [pybliometrics](https://github.com/pybliometrics-dev/pybliometrics): API-Wrapper to access Scopus.
* [ASReview](https://asreview.nl/): Active learning for systematic reviews.
* [metaknowledge](https://github.com/UWNETLAB/metaknowledge): Python library for doing bibliometric and network analysis in science.
* [tethne](https://github.com/diging/tethne): Python module for bibliographic network analysis.
* [VOSviewer](https://www.vosviewer.com/): Software tool for constructing and visualizing bibliometric networks.
================================================
FILE: docs/Makefile
================================================
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
================================================
FILE: docs/_static/citation.html
================================================
0%
================================================
FILE: docs/_static/css/style.css
================================================
@import 'theme.css';
html.writer-html4 .rst-content dl:not(.docutils) .property,
html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property {
/* Fixes strange layout of class properties. */
display: inline;
}
================================================
FILE: docs/api/index.rst
================================================
API reference
====================================
This page provides the API documentation of litstudy.
All public functions are re-exported under the global `litstudy` namespace for convenience.
However, the code is structured hierachical meaning the documentation shows the hierarchical names.
For example:
.. code-block:: python
docs = litstudy.sources.scopus.search_scopus("example")
litstudy.plot.plot_author_histogram(docs)
# Is equivalent to
docs = litstudy.search_scopus("example")
litstudy.plot_author_histogram(docs)
The package is divided into 6 modules:
* Core data types such as `Document` and `DocumentSet`.
* Functions to retrieve or load scientific citations.
* Compute general statistics.
* Generate bibliographic networks.
* Automatic topic detection using natural language processing (NLP).
* Plot results. These functions are mostly useful inside a notebook.
.. toctree::
:maxdepth: 2
:caption: Contents
types
sources
stats
network
nlp
plot
================================================
FILE: docs/api/network.rst
================================================
Network Analysis
------------------------------------------
.. automodule:: litstudy.network
:members:
================================================
FILE: docs/api/nlp.rst
================================================
Language Processing
------------------------------------------
.. automodule:: litstudy.nlp
:members:
================================================
FILE: docs/api/plot.rst
================================================
Plotting Statistics
------------------------------------------
.. automodule:: litstudy.plot
:members:
================================================
FILE: docs/api/sources.rst
================================================
Literature Databases
====================
Scopus
------
.. automodule:: litstudy
:members: search_scopus, refine_scopus, load_scopus_csv
SemanticScholar
---------------
.. automodule:: litstudy
:members: fetch_semanticscholar, refine_semanticscholar, search_semanticscholar
CrossRef
---------------
.. automodule:: litstudy
:members: fetch_crossref, refine_crossref, search_crossref
CSV
---------------
.. automodule:: litstudy
:members: load_csv
IEEE Xplore
---------------
.. automodule:: litstudy
:members: load_ieee_csv
Springer Link
---------------
.. automodule:: litstudy
:members: load_springer_csv
bibtex
---------------
.. automodule:: litstudy
:members: load_bibtex
RIS
---------------
.. automodule:: litstudy
:members: load_ris_file
dblp
---------------
.. automodule:: litstudy
:members: search_dblp
arXiv
---------------
.. automodule:: litstudy
:members: search_arxiv
================================================
FILE: docs/api/stats.rst
================================================
Calculating Statistics
------------------------------------------
.. automodule:: litstudy.stats
:members:
================================================
FILE: docs/api/types.rst
================================================
Data Types
------------------------------------------
There are two core datatypes in litstudy: `Document` and `DocumentSet`.
`Document` is an abstract base class (ABC) that provides access to the metadata of documents in a unified way.
Different backends provide their own implements of this class (for example, `ScopusDocument`, `BibTexDocument`, etc.)
`DocumentSet` is set of `Document` objects.
All set operations are supported, making it possible to create a new set from existing sets.
For instance, it is possible to load documents from two sources (obtaining two `DocumentSets`) and merge them (obtaining one large `DocumentSet`).
.. automodule:: litstudy.types
:members:
================================================
FILE: docs/citation.html
================================================
0%
================================================
FILE: docs/conf.py
================================================
# -*- coding: utf-8 -*-
#
# Configuration file for the Sphinx documentation builder.
#
# This file does only contain a selection of the most common options. For a
# full list see the documentation:
# http://www.sphinx-doc.org/en/master/config
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
# -- Project information -----------------------------------------------------
project = 'litstudy'
copyright = '2022, S. Heldens, H. Dreuning, A. Sclocco'
author = 'S. Heldens, H. Dreuning, A. Sclocco'
# The short X.Y version
version = ''
# The full version, including alpha/beta/rc tags
release = '0.1'
# -- General configuration ---------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'nbsphinx',
'sphinx.ext.autodoc',
'sphinx.ext.githubpages',
'sphinx_mdinclude',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = "english"
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = None
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
html_extra_path = ['citation.html']
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# The default sidebars (for documents that don't match any pattern) are
# defined by theme itself. Builtin themes are using these templates by
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
# 'searchbox.html']``.
#
# html_sidebars = {}
html_style = "css/style.css"
# -- Options for HTMLHelp output ---------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'litstudydoc'
# -- Options for LaTeX output ------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'litstudy.tex', 'litstudy Documentation',
'S. Heldens, H. Dreuning, A. Sclocco', 'manual'),
]
# -- Options for manual page output ------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'litstudy', 'litstudy Documentation',
[author], 1)
]
# -- Options for Texinfo output ----------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'litstudy', 'litstudy Documentation',
author, 'litstudy', 'One line description of project.',
'Miscellaneous'),
]
# -- Options for Epub output -------------------------------------------------
# Bibliographic Dublin Core info.
epub_title = project
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#
# epub_identifier = ''
# A unique identification for the text.
#
# epub_uid = ''
# A list of files that should not be packed into the epub file.
epub_exclude_files = ['search.html']
# -- Extension configuration -------------------------------------------------
autodoc_member_order = 'bysource'
================================================
FILE: docs/faq.rst
================================================
Frequently Asked Questions
==========================
This pages lists answers to several common issues that can occur when working with LitStudy.
If your question is not in this list, please create an issue on the `GitHub issue tracker `_.
How to use Scopus?
---------------------
To use the Scopus API, you will need two things:
* An Elsevier API key obtainable through the `Elsevier Developer Portal `_. You or (your institute) must require a Scopus subscription.
* Be connected to the network of your University or Research Institute for which you obtained the API key.
LitStudy will ask for the API key on the first time that it launches.
For more information, see the [guide](https://pybliometrics.readthedocs.io/en/stable/access.html) by pybliometrics.
I'm having trouble connecting to Scopus!
----------------------------------------
LitStudy internally uses the Python package `pybliometrics `_ to communicate with the Scopus API.
See the page on `pybliometrics configuration `_ for more information.
Alternatively, you can use one of the free alternatives to Scopus (see :doc:`api/sources`) such as, for example, SemanticScholar (``litstudy.search_semanticscholar``) or CrossRef (``litstudy.search_crossref``).
Scopus400Error: ``Exceeds the maximum number allowed for the service level``
----------------------------------------------------------------------------
You Scopus query returns too many results. Please limit your query, for example, by restricting the publication year using ``... AND PUBYEAR > 2020``.
It could also be the case that your Scopus API key is invalid, in which case see `How to use Scopus?`
Scopus401Error: ``The requestor is not authorized to access the requested view or fields of the resource``
----------------------------------------------------------------------------------------------------------
It is likely that your Scopus API key is invalid, in which case see `How to use Scopus?`
My question is not in this list?
--------------------------------
If your question is not in this list, please create a new issue on `GitHub `_.
================================================
FILE: docs/index.rst
================================================
.. litstudy documentation master file, created by
sphinx-quickstart on Tue Jan 4 13:31:10 2022.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
The LitStudy documentation
====================================
.. mdinclude:: ../README.md
.. toctree::
:maxdepth: 2
:hidden:
:caption: Contents:
Introduction
installation
example
faq
api/index
license
Github repository
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
================================================
FILE: docs/installation.rst
================================================
Installation Guide
==================
litStudy is available on pip! If you have Python installed (version 3.6 or greater), just use the following command to install litstudy.
.. code-block:: bash
pip install litstudy
Jupyter
-------
To use LitStudy from a Jupyter notebook, use the following command:
.. code-block:: bash
pip install notebook
jupyter notebook
Virtual environment
-------------------
It is recommended to use a virtual environment for Python.
We suggest to use `miniconda `_.
================================================
FILE: docs/license.rst
================================================
License
=======
.. include:: ../LICENSE
================================================
FILE: docs/make.bat
================================================
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=.
set BUILDDIR=_build
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
:end
popd
================================================
FILE: litstudy/__init__.py
================================================
from .sources import (
fetch_crossref,
fetch_scopus,
fetch_semanticscholar,
load_bibtex,
load_csv,
load_ieee_csv,
load_ris_file,
load_scopus_csv,
load_springer_csv,
refine_crossref,
refine_scopus,
refine_semanticscholar,
search_arxiv,
search_crossref,
search_dblp,
search_scopus,
search_semanticscholar,
)
from .stats import (
compute_year_histogram,
compute_author_histogram,
compute_author_affiliation_histogram,
compute_language_histogram,
compute_number_authors_histogram,
compute_source_histogram,
compute_source_type_histogram,
compute_affiliation_histogram,
compute_country_histogram,
compute_groups_histogram,
) # noqa: F401
from .plot import (
plot_year_histogram,
plot_author_histogram,
plot_number_authors_histogram,
plot_author_affiliation_histogram,
plot_language_histogram,
plot_source_histogram,
plot_source_type_histogram,
plot_affiliation_histogram,
plot_country_histogram,
plot_continent_histogram,
plot_groups_histogram,
plot_word_distribution,
plot_topic_clouds,
plot_document_topics,
plot_embedding,
) # noqa: F401
from .network import (
build_citation_network,
build_coauthor_network,
build_cocitation_network,
build_coupling_network,
plot_citation_network,
plot_coauthor_network,
plot_cocitation_network,
plot_coupling_network,
plot_network,
) # noqa: F401
from .nlp import (
build_corpus,
train_nmf_model,
train_lda_model,
train_elda_model,
compute_word_distribution,
calculate_embedding,
) # noqa: F401
from .types import (
Document,
DocumentSet,
DocumentIdentifier,
Affiliation,
Author,
) # noqa: F401
__all__ = [
"compute_year_histogram",
"compute_author_histogram",
"compute_author_affiliation_histogram",
"compute_language_histogram",
"compute_number_authors_histogram",
"compute_source_histogram",
"compute_source_type_histogram",
"compute_affiliation_histogram",
"compute_country_histogram",
"compute_groups_histogram",
"plot_year_histogram",
"plot_author_histogram",
"plot_number_authors_histogram",
"plot_author_affiliation_histogram",
"plot_language_histogram",
"plot_source_histogram",
"plot_source_type_histogram",
"plot_affiliation_histogram",
"plot_country_histogram",
"plot_continent_histogram",
"plot_groups_histogram",
"plot_word_distribution",
"plot_topic_clouds",
"plot_document_topics",
"plot_embedding",
"build_citation_network",
"build_coauthor_network",
"build_cocitation_network",
"build_coupling_network",
"plot_citation_network",
"plot_coauthor_network",
"plot_cocitation_network",
"plot_coupling_network",
"plot_network",
"build_corpus",
"train_nmf_model",
"train_lda_model",
"compute_word_distribution",
"calculate_embedding",
"fetch_crossref",
"fetch_scopus",
"fetch_semanticscholar",
"load_bibtex",
"load_csv",
"load_ieee_csv",
"load_ris_file",
"load_springer_csv",
"refine_crossref",
"refine_scopus",
"refine_semanticscholar",
"search_arxiv",
"search_crossref",
"search_dblp",
"search_scopus",
"search_semanticscholar",
"Affiliation",
"Author",
"Document",
"DocumentIdentifier",
"DocumentSet",
]
================================================
FILE: litstudy/clean.py
================================================
from collections import Counter
from .common import canonical
def generate_mapping(tokens, stopwords):
stopwords = set(stopwords)
mapping = dict()
result = dict()
for token, _count in Counter(tokens).most_common():
key = canonical(token, aggresive=True, stopwords=stopwords)
if key not in mapping:
mapping[key] = token
else:
result[token] = mapping[key]
return result
================================================
FILE: litstudy/common.py
================================================
import re
import io
import locale
from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE
from unidecode import unidecode
try:
from tqdm import tqdm
def progress_bar(it):
return tqdm(it)
except ImportError:
def progress_bar(it):
return it
STOPWORDS = set(
[
"",
"and",
"at",
"for",
"in",
"into",
"of",
"on",
"onto",
"over",
"the",
"to",
"ltd",
"corporation",
"corp",
]
)
def canonical(key, aggresive=True, stopwords=None):
if stopwords is None:
stopwords = STOPWORDS
if aggresive:
key = unidecode(key).lower()
tokens = re.split(r"[\W]+", key)
new_tokens = []
for token in tokens:
if not token or token[0].isdigit():
continue
if aggresive and (token in stopwords or len(token) <= 1):
continue
new_tokens.append(token)
return " ".join(new_tokens)
def fuzzy_match(lhs, rhs):
if lhs is None or rhs is None:
return False
return canonical(lhs) == canonical(rhs)
class FuzzyMatcher:
def __init__(self, initial=None):
mapping = dict()
unmapping = dict()
if initial is not None:
for src, dst in initial.items():
key = canonical(src)
dst_key = canonical(dst)
mapping[dst_key] = key
mapping[key] = key
unmapping[key] = dst
self.mapping = mapping
self.unmapping = unmapping
def get(self, name):
key = canonical(name)
if key in self.mapping:
return self.unmapping[self.mapping[key]]
nice_name = canonical(name, False)
self.mapping[key] = key
self.unmapping[key] = nice_name
return nice_name
def robust_open(path, errors="replace"):
"""This function can be used as a drop-in replacement when using
`with open(path) as f:` to read a file. However, the normal `open` function
is fragile since it attempts to open the file using the default system
character encoding and fails immediately when a character cannot be
decoded. This function is more robust in that it attempts to figure out
the encoding of the given file and ignores decoding errors.
"""
if hasattr(path, "read"):
return path
elif isinstance(path, bytes):
content = path
else:
with open(path, "rb") as f:
content = f.read()
# use the following options:
# - UTF-8 BOM: decode as UTF-8
# - UTF-16 BE BOM: decode as UTF-16-BE
# - UTF-16 LE BOM: decode as UTF-16-LE
# - otherwise, decode as utf-8 with strict errors
# - if that fails, decode using default charset
# - if that fails, decode using utf-8 but ignore errors
if content.startswith(BOM_UTF8):
n = len(BOM_UTF8)
result = content[n:].decode(errors=errors)
elif content.startswith(BOM_UTF16_BE):
n = len(BOM_UTF16_BE)
result = content[n:].decode("utf_16_be", errors=errors)
elif content.startswith(BOM_UTF16_LE):
n = len(BOM_UTF16_LE)
result = content[n:].decode("utf_16_le", errors=errors)
else:
try:
result = content.decode("utf-8", errors="strict")
except UnicodeError:
try:
default_charset = locale.getpreferredencoding()
result = content.decode(default_charset, errors=errors)
except UnicodeError:
result = content.decode("utf-8", errors=errors)
return io.StringIO(result)
================================================
FILE: litstudy/continent.py
================================================
COUNTRY_TO_CONTINENT = {
"afghanistan": "Asia",
"albania": "Europe",
"algeria": "Africa",
"american samoa": "Oceania",
"andorra": "Europe",
"angola": "Africa",
"anguilla": "North America",
"antigua and barbuda": "North America",
"argentina": "South America",
"armenia": "Asia",
"aruba": "North America",
"australia": "Oceania",
"austria": "Europe",
"azerbaijan": "Asia",
"bahamas": "North America",
"bahrain": "Asia",
"bangladesh": "Asia",
"barbados": "North America",
"belarus": "Europe",
"belgium": "Europe",
"belize": "North America",
"benin": "Africa",
"bermuda": "North America",
"bhutan": "Asia",
"bolivia, plurinational state of": "South America",
"bolivia": "South America",
"bonaire, sint eustatius and saba": "North America",
"bonaire": "North America",
"sint eustatius": "North America",
"saba": "North America",
"bosnia and herzegovina": "Europe",
"botswana": "Africa",
"brazil": "South America",
"british indian ocean territory": "Asia",
"brunei darussalam": "Asia",
"bulgaria": "Europe",
"burkina faso": "Africa",
"burundi": "Africa",
"cabo verde": "Africa",
"cambodia": "Asia",
"cameroon": "Africa",
"canada": "North America",
"cayman islands": "North America",
"cayman island": "North America",
"central african republic": "Africa",
"chad": "Africa",
"chile": "South America",
"china": "Asia",
"christmas island": "Asia",
"cocos (keeling) islands": "Asia",
"cocos keeling islands": "Asia",
"cocos islands": "Asia",
"colombia": "South America",
"comoros": "Africa",
"congo": "Africa",
"cook islands": "Oceania",
"costa rica": "North America",
"croatia": "Europe",
"cuba": "North America",
"curaçao": "North America",
"curacao": "North America",
"cyprus": "Asia",
"czechia": "Europe",
"côte d'ivoire": "Africa",
"denmark": "Europe",
"djibouti": "Africa",
"dominica": "North America",
"dominican republic": "North America",
"ecuador": "South America",
"egypt": "Africa",
"el salvador": "North America",
"equatorial guinea": "Africa",
"eritrea": "Africa",
"estonia": "Europe",
"eswatini": "Africa",
"ethiopia": "Africa",
"falkland islands (malvinas)": "South America",
"faroe islands": "Europe",
"fiji": "Oceania",
"finland": "Europe",
"france": "Europe",
"french guiana": "South America",
"french polynesia": "Oceania",
"gabon": "Africa",
"gambia": "Africa",
"georgia": "Asia",
"germany": "Europe",
"ghana": "Africa",
"gibraltar": "Europe",
"greece": "Europe",
"greenland": "North America",
"grenada": "North America",
"guadeloupe": "North America",
"guam": "Oceania",
"guatemala": "North America",
"guernsey": "Europe",
"guinea": "Africa",
"guinea-bissau": "Africa",
"guyana": "South America",
"haiti": "North America",
"honduras": "North America",
"hong kong": "Asia",
"hungary": "Europe",
"iceland": "Europe",
"india": "Asia",
"indonesia": "Asia",
"iran, islamic republic of": "Asia",
"iran": "Asia",
"repulic of iran": "Asia",
"iraq": "Asia",
"ireland": "Europe",
"isle of man": "Europe",
"israel": "Asia",
"italy": "Europe",
"jamaica": "North America",
"japan": "Asia",
"jersey": "Europe",
"jordan": "Asia",
"kazakhstan": "Asia",
"kenya": "Africa",
"kiribati": "Oceania",
"korea, democratic people's republic of": "Asia",
"democratic people's republic of korea": "Asia",
"korea, republic of": "Asia",
"korea": "Asia",
"republic of korea": "Asia",
"kuwait": "Asia",
"kyrgyzstan": "Asia",
"lao people's democratic republic": "Asia",
"latvia": "Europe",
"lebanon": "Asia",
"lesotho": "Africa",
"liberia": "Africa",
"libya": "Africa",
"liechtenstein": "Europe",
"lithuania": "Europe",
"luxembourg": "Europe",
"macao": "Asia",
"madagascar": "Africa",
"malawi": "Africa",
"malaysia": "Asia",
"maldives": "Asia",
"mali": "Africa",
"malta": "Europe",
"marshall islands": "Oceania",
"martinique": "North America",
"mauritania": "Africa",
"mauritius": "Africa",
"mayotte": "Africa",
"mexico": "North America",
"micronesia, federated states of": "Oceania",
"micronesia": "Oceania",
"moldova, republic of": "Europe",
"moldova": "Europe",
"monaco": "Europe",
"mongolia": "Asia",
"montenegro": "Europe",
"montserrat": "North America",
"morocco": "Africa",
"mozambique": "Africa",
"myanmar": "Asia",
"namibia": "Africa",
"nauru": "Oceania",
"nepal": "Asia",
"netherlands": "Europe",
"new caledonia": "Oceania",
"new zealand": "Oceania",
"nicaragua": "North America",
"niger": "Africa",
"nigeria": "Africa",
"niue": "Oceania",
"norfolk island": "Oceania",
"north macedonia": "Europe",
"northern mariana islands": "Oceania",
"norway": "Europe",
"oman": "Asia",
"pakistan": "Asia",
"palau": "Oceania",
"palestine, state of": "Asia",
"palestine": "Asia",
"panama": "North America",
"papua new guinea": "Oceania",
"paraguay": "South America",
"peru": "South America",
"philippines": "Asia",
"poland": "Europe",
"portugal": "Europe",
"puerto rico": "North America",
"qatar": "Asia",
"romania": "Europe",
"russian federation": "Europe",
"rwanda": "Africa",
"réunion": "Africa",
"saint barthélemy": "North America",
"saint helena, ascension and tristan da cunha": "Africa",
"saint kitts and nevis": "North America",
"saint lucia": "North America",
"saint martin (french part)": "North America",
"saint pierre and miquelon": "North America",
"saint vincent and the grenadines": "North America",
"samoa": "Oceania",
"san marino": "Europe",
"sao tome and principe": "Africa",
"saudi arabia": "Asia",
"senegal": "Africa",
"serbia": "Europe",
"seychelles": "Africa",
"sierra leone": "Africa",
"singapore": "Asia",
"slovakia": "Europe",
"slovenia": "Europe",
"solomon islands": "Oceania",
"somalia": "Africa",
"south africa": "Africa",
"south georgia and the south sandwich islands": "South America",
"south sudan": "Africa",
"spain": "Europe",
"sri lanka": "Asia",
"sudan": "Africa",
"suriname": "South America",
"svalbard and jan mayen": "Europe",
"sweden": "Europe",
"switzerland": "Europe",
"syrian arab republic": "Asia",
"taiwan, province of china": "Asia",
"taiwan": "Asia",
"tajikistan": "Asia",
"tanzania, united republic of": "Africa",
"tanzania": "Africa",
"thailand": "Asia",
"togo": "Africa",
"tokelau": "Oceania",
"tonga": "Oceania",
"trinidad and tobago": "North America",
"tunisia": "Africa",
"turkey": "Asia",
"turkmenistan": "Asia",
"turks and caicos islands": "North America",
"tuvalu": "Oceania",
"uganda": "Africa",
"ukraine": "Europe",
"united arab emirates": "Asia",
"united kingdom": "Europe",
"united states": "North America",
"uruguay": "South America",
"uzbekistan": "Asia",
"vanuatu": "Oceania",
"venezuela, bolivarian republic of": "South America",
"venezuela": "South America",
"viet nam": "Asia",
"vietnam": "Asia",
"virgin islands, british": "North America",
"virgin islands, u.s.": "North America",
"wallis and futuna": "Oceania",
"yemen": "Asia",
"zambia": "Africa",
"zimbabwe": "Africa",
"åland islands": "Europe",
"aland islands": "Europe",
}
================================================
FILE: litstudy/network.py
================================================
from .types import DocumentMapping, DocumentSet
from collections import defaultdict
from matplotlib.colors import to_hex
import seaborn as sns
import json
import numpy as np
import networkx as nx
import pyvis
import textwrap
def calculate_layout(g, iterations=1000, gravity=1):
try:
from fa2 import ForceAtlas2
model = ForceAtlas2(
verbose=True,
scalingRatio=1,
gravity=gravity,
)
matrix = nx.to_scipy_sparse_matrix(g, dtype="f", format="lil", weight="weight")
pos = model.forceatlas2(matrix, iterations=iterations)
return dict(zip(g.nodes(), pos))
except ImportError:
return nx.drawing.layout.spring_layout(g)
def plot_network(
g: nx.Graph,
*,
height="1000px",
smooth_edges=None,
max_node_size=100,
min_node_size=5,
largest_component=True,
interactive=True,
controls=False,
scale=1,
iterations=1000,
gravity=1,
file_name="network.html"
):
"""Plot a `networkx.Graph` generated by one of the `build_X_graph`
functions in this module. Plotting is done using the `pyvis` library.
:param height: Height of the plot.
:param smooth_edges: Enables curved ('smooth') edges. Looks nice but is
heavy on performance.
:param min_node_size: The radius of the smallest node.
:param max_node_size: The radius of the largest node.
:param largest_component: Only plot the largest connected component of
the graph.
:param file_name: The name of the file where the plot will be saved.
"""
isolates = list(nx.isolates(g))
if isolates:
g = g.copy()
g.remove_nodes_from(isolates)
if len(g.edges) == 0:
print("no edges given")
return
directed = nx.is_directed(g)
if largest_component:
if directed:
cc = nx.weakly_connected_components(g)
else:
cc = nx.connected_components(g)
cc = sorted(cc, key=len, reverse=True)
g = g.subgraph(cc[0])
v = pyvis.network.Network(notebook=True, width="100%", height=height, directed=directed)
sizes = [attr.get("size") or attr.get("weight") for (_, attr) in g.nodes.items()]
if all(s is not None for s in sizes):
sizes = np.array(sizes)
elif directed:
sizes = [g for (_, g) in g.in_degree]
else:
sizes = [g for (_, g) in g.degree]
layout = calculate_layout(g, gravity=gravity, iterations=iterations)
sizes = np.array(sizes, dtype=np.float32)
ratio = (max_node_size - min_node_size) / np.amax(sizes)
sizes = ratio * sizes + min_node_size
for id, size in zip(g, sizes):
attr = g.nodes[id]
kwargs = dict(labelHighlightBold=True)
kwargs["shape"] = attr.get("shape", "dot")
kwargs["title"] = attr["title"]
kwargs["label"] = textwrap.fill(attr["title"], width=20)
kwargs["size"] = float(size)
if layout is not None:
pos = layout[id]
kwargs["x"] = pos[0] * scale
kwargs["y"] = pos[1] * scale
color = attr.get("color")
if color is not None:
kwargs["color"] = to_hex(color)
v.add_node(id, **kwargs)
for src, dst in g.edges():
weight = g[src][dst].get("weight")
if weight is not None:
width = weight
label = str(weight)
else:
width = None
label = ""
v.add_edge(src, dst, width=width, title=label)
if smooth_edges is None:
smooth_edges = len(g.edges()) < 1000
v.set_options(
json.dumps(
{
"configure": {
"enabled": controls,
},
"nodes": {
"font": {
"size": 7,
},
},
"edges": {
"smooth": smooth_edges,
"color": {
"opacity": 0.25,
},
},
"physics": {
"enabled": interactive,
"forceAtlas2Based": {
"springLength": 100,
},
"solver": "forceAtlas2Based",
},
}
)
)
return v.show(file_name)
def build_base_network(
docs, directed, colors=None, cmap=None, shapes=None, sizes=None, node_props=None
):
def extract_column(docs, expr):
if not docs:
result = []
elif not isinstance(expr, str):
result = list(expr)
elif expr in docs.data:
result = docs.data[expr]
else:
result = docs.data.eval(expr)
assert len(result) == len(docs)
return result
g = nx.DiGraph() if directed else nx.Graph()
mapping = DocumentMapping()
if node_props is None:
node_props = docs.data.columns
for i, doc in enumerate(docs):
attr = dict()
for prop in node_props:
attr[prop] = docs.data[prop][i]
g.add_node(i, title=doc.title, doc=doc, **attr)
mapping.add(doc.id, i)
# Custom colors
if colors is not None:
colors = extract_column(docs, colors)
if all(isinstance(c, float) for c in colors):
begin, end = min(colors), max(colors)
cmap = sns.color_palette(cmap, as_cmap=True)
colors = [cmap(float(c - begin) / (end - begin)) for c in colors]
# if all(isinstance(c, int) for c in colors):
else:
groups = dict((c, i) for i, c in enumerate(sorted(set(colors))))
cmap = sns.color_palette(cmap, n_colors=len(groups))
colors = [cmap[groups[c]] for c in colors]
for i, c in enumerate(colors):
g.nodes[i]["color"] = c
# Custom sizes
if sizes is not None:
sizes = extract_column(docs, sizes)
for i, size in enumerate(sizes):
g.nodes[i]["size"] = size
if shapes is not None:
shapes = extract_column(docs, shapes)
for i, shape in enumerate(sizes):
g.nodes[i]["shape"] = shape
return g, mapping
def split_kwargs(*names, **kwargs):
names = list(names) + ["colors", "cmap"]
left, right = dict(), dict()
for k, v in kwargs.items():
if k in names:
left[k] = v
else:
right[k] = v
return left, right
def build_citation_network(docs: DocumentSet, **kwargs) -> nx.Graph:
"""Builds a citation network: a directed graph where each node
corresponds to a document and each directed edge indicates that
one document cites the other."""
g, mapping = build_base_network(docs, True, **kwargs)
for i, doc in enumerate(docs):
for ref in doc.references or []:
j = mapping.get(ref)
if j is not None:
g.add_edge(i, j)
return g
def plot_citation_network(docs: DocumentSet, **kwargs):
"""Plot a citation network.
This is a shorthand for `plot_network(build_citation_network(docs))`."""
b, p = split_kwargs(**kwargs)
return plot_network(build_citation_network(docs, **b), **p)
def build_cocitation_network(docs: DocumentSet, *, max_edges=None, **kwargs) -> nx.Graph:
"""Builds a co-citation network: a undirected graph where each node
corresponds to a document and the edge weights stores the cocitation
strengths (i.e., the number of times two documents have been cited
together).
:param max_edges: Select only the top edges. This is useful since
cocitation networks are often dense and only the strongest edges
are usually important.
"""
max_edges = max_edges or len(docs) * 2
g, mapping = build_base_network(docs, False, **kwargs)
strength = defaultdict(int)
for doc in docs:
refs = []
for ref in doc.references or []:
j = mapping.get(ref)
if j is not None:
refs.append(j)
for i in refs:
for j in refs:
if i < j:
strength[i, j] += 1
edges = list(strength.items())
if len(edges) > max_edges:
edges.sort(key=lambda p: p[1], reverse=True)
edges = edges[:max_edges]
for (i, j), weight in edges:
g.add_edge(i, j, weight=weight)
return g
def plot_cocitation_network(docs: DocumentSet, *, max_edges=None, node_size=10, **kwargs):
"""Plot a citation network.
This is a shorthand for `plot_network(build_cocitation_network(docs))`."""
b, p = split_kwargs(**kwargs)
return plot_network(
build_cocitation_network(docs, max_edges=max_edges, **b),
# min_node_size=node_size,
# max_node_size=node_size,
**p
)
def build_coupling_network(docs: DocumentSet, max_edges=1000, **kwargs) -> nx.Graph:
"""Builds a bibligraphic coupling network: an undirected graph where
nodes indicate documents and edge weights store the bibliographic
coupling strength. This strength measures how similar two documents
view related work. It is measured as the number of shared references
between two documents.
:param max_edges: Select only the top edges. This is useful since these
networks are often dense and only the strongest edges are usually
important.
"""
g, mapping = build_base_network(docs, False, **kwargs)
n = len(g)
doc_refs = []
for doc in docs:
refs = []
for ref in doc.references or []:
i = mapping.get(ref)
if i is None:
mapping.add(ref, n)
n += 1
i = n
if i is not None:
refs.append(i)
doc_refs.append(set(refs))
strength = defaultdict(int)
for i, a in enumerate(doc_refs):
for j, b in enumerate(doc_refs[:i]):
common = a & b
if common:
strength[i, j] = len(common)
edges = list(strength.items())
if len(edges) > max_edges:
edges.sort(key=lambda p: p[1], reverse=True)
edges = edges[:max_edges]
for (i, j), weight in edges:
g.add_edge(i, j, weight=weight, score=weight)
return g
def plot_coupling_network(docs: DocumentSet, *, max_edges=None, node_size=10, **kwargs):
"""Plot a bibliographic coupling network.
This is a shorthand for `plot_network(build_coupling_network(docs))`."""
b, p = split_kwargs(**kwargs)
return plot_network(
build_coupling_network(docs, max_edges, **b),
min_node_size=node_size,
max_node_size=node_size,
**p
)
def build_coauthor_network(docs: DocumentSet, *, max_authors=None) -> nx.Graph:
"""Builds a co-author network: an undirected graph where nodes indicate
authors and edge weight indicate the number of shared publications
between two authors.
:param max_authors: Select only the top X authors.
"""
g = nx.DiGraph()
count = defaultdict(int)
for doc in docs:
authors = []
for author in doc.authors or []:
name = author.name
if name:
count[name] += 1
authors = list(count.keys())
if max_authors is not None and len(authors) > max_authors:
authors.sort(key=lambda name: count[name], reverse=True)
authors = authors[:max_authors]
mapping = dict()
for i, author in enumerate(authors):
g.add_node(i, title=author)
mapping[author] = i
edges = defaultdict(int)
for doc in docs:
authors = [a.name for a in doc.authors or [] if a.name]
for i, left in enumerate(authors):
for right in authors[:i]:
if left in mapping and right in mapping:
edges[mapping[left], mapping[right]] += 1
for (left, right), weight in edges.items():
g.add_edge(left, right, weight=weight)
return g
def plot_coauthor_network(docs: DocumentSet, *, max_authors=None, **kwargs):
"""Plot a co-author network.
This is a shorthand for `plot_network(build_coauthor_network(docs))`."""
b, p = split_kwargs(**kwargs)
return plot_network(build_coauthor_network(docs, max_authors=max_authors, **b), **p)
================================================
FILE: litstudy/nlp.py
================================================
from collections import defaultdict
from gensim.matutils import corpus2dense
from typing import List
import gensim
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import wordcloud
from .stopwords import STOPWORDS
from .types import DocumentSet
def filter_tokens(texts, predicate):
for text in texts:
yield [token for token in text if predicate(token)]
def preprocess_remove_short(texts, min_length=3):
yield from filter_tokens(texts, lambda token: len(token) >= min_length)
def preprocess_remove_words(texts, remove_words):
remove_words = set(w.strip() for w in remove_words)
yield from filter_tokens(texts, lambda token: token not in remove_words)
def preprocess_stopwords(texts):
yield from preprocess_remove_words(texts, STOPWORDS)
def preprocess_replace_words(texts, replace_words):
for text in texts:
yield [replace_words.get(token, token) for token in text]
def preprocess_merge_bigrams(texts, bigrams):
for text in texts:
prev = None
new_text = []
for current in text:
replacement = bigrams.get((prev, current))
if replacement is not None:
new_text.append(replacement)
prev = None
else:
if prev is not None:
new_text.append(prev)
prev = current
yield new_text
def preprocess_merge_ngrams(texts, threshold):
texts = list(texts)
phrases = gensim.models.phrases.Phrases(texts, threshold=threshold, scoring="npmi")
for text in texts:
for word, score in phrases.analyze_sentence(text):
if score is not None:
text.append(word)
yield text
def preprocess_outliers(texts, min_docs, max_docs):
texts = list(texts)
count = defaultdict(int)
for text in texts:
for token in set(text):
count[token] += 1
unwanted = set()
for token, num_docs in count.items():
if num_docs < min_docs or num_docs > max_docs:
unwanted.add(token)
yield from preprocess_remove_words(texts, unwanted)
def preprocess_smart_stemming(texts):
texts = list(texts)
stemmer = gensim.parsing.PorterStemmer()
count = defaultdict(int)
for text in texts:
for token in text:
count[token] += 1
sorted_count = sorted(count.items(), key=lambda p: p[1], reverse=True)
unstemming = dict()
mapping = dict()
for token, _ in sorted_count:
stem = stemmer.stem(token)
if stem in unstemming:
mapping[token] = unstemming[stem]
else:
unstemming[stem] = token
mapping[token] = token
for text in texts:
yield [mapping[token] for token in text]
class Corpus:
"""Contains the word-frequency vectors for a set of documents. See
`build_corpus` for more information.
"""
def __init__(self, docs, filters, max_tokens):
corpus = []
for doc in docs:
text = (doc.title or "") + " " + (doc.abstract or " ")
tokens = gensim.utils.tokenize(text, lowercase=True, deacc=True)
corpus.append(list(tokens))
for f in filters:
corpus = f(corpus)
corpus = list(corpus)
dic = gensim.corpora.Dictionary(corpus)
dic.filter_extremes(keep_n=max_tokens)
self.dictionary = dic
""" The dictionary that maps indices to words
(`gensim.corpora.Dictionary`).
"""
self.frequencies = [dic.doc2bow(x) for x in corpus]
""" List of word frequency vectors. Each vector corresponds to one
document and consists of `(word_index, frequency)` tuples.
"""
def build_corpus(
docs: DocumentSet,
*,
remove_words=None,
min_word_length=3,
min_docs=5,
max_docs_ratio=0.75,
max_tokens=5000,
replace_words=None,
custom_bigrams=None,
ngram_threshold=None
) -> Corpus:
"""Build a `Corpus` object.
This function takes the words from the title/abstract of the given
documents, preprocesses the tokens, and returns a corpus consisting of a
word frequency vector for each document. This preprocessing stage is
highly customizable, thus it is advised to experiment with the many
parameters.
Please notice that a small document set with no Abstracts available, might
not yield a Corpus, since there is a higher chance of words not achieving
a ocorrency in more than one document.
:param remove_words: list of words that should be ignored while building
the word frequency vectors.
:param min_word_length: Words shorter than this are ignored.
:param min_docs: Words that occur in fewer than this many documents are
ignored.
:param max_docs_ratio: Words that occur in more than this document are
ignored. Should be ratio between 0 and 1.
:param max_tokens: Only the top most common tokens are preserved.
:param replace_words: Replace words by other words. Must be a `dict`
containing *original word* to *replacement word*
pairs.
:param custom_bigrams: Add custom bigrams. Must be a `dict` where keys
are `(first, second)` tuples and values are
replacements. For example, the key can be
`("Big", "Data")` and the value `"BigData"`.
:param ngram_threshold: Threshold used for n-gram detection. Is passed
to `gensim.models.phrases.Phrases` to detect
common n-grams.
:returns: a `Corpus object`.
"""
filters = []
if custom_bigrams:
filters.append(lambda w: preprocess_merge_bigrams(w, custom_bigrams))
if remove_words:
filters.append(lambda w: preprocess_remove_words(w, remove_words))
if replace_words:
filters.append(lambda w: preprocess_replace_words(w, replace_words))
if min_word_length:
filters.append(lambda w: preprocess_remove_short(w, min_length=min_word_length))
filters.append(preprocess_stopwords)
if ngram_threshold is not None:
filters.append(lambda w: preprocess_merge_ngrams(w, ngram_threshold))
filters.append(preprocess_smart_stemming)
if min_docs > 1 or max_docs_ratio < 1.0:
max_docs = int(len(docs) * max_docs_ratio)
filters.append(lambda w: preprocess_outliers(w, min_docs, max_docs))
return Corpus(docs, filters, max_tokens)
class TopicModel:
"""Topic model trained by one of the `train_*_model` functions."""
def __init__(self, dictionary, doc2topic, topic2token):
self.dictionary = dictionary
self.doc2topic = doc2topic
""" `N x T` matrix that stores the weights towards each of the T
topics for the N documents.
"""
self.topic2token = topic2token
""" `T x M` matrix that stores the weights towards each of the M
tokens for each of the T topics
"""
self.num_topics = len(topic2token)
def best_documents_for_topic(self, topic_id: int, limit=5) -> List[int]:
"""Returns the documents that most strongly belong to the given
topic.
"""
return np.argsort(self.doc2topic[:, topic_id])[::-1][:limit]
def document_topics(self, doc_id: int):
"""Returns a numpy array indicating the weights towards the different
topic for the given document. These weight sum up to one.
"""
return self.doc2topic[doc_id]
def best_token_weights_for_topic(self, topic_id: int, limit=5):
"""Returns a list of `(token, weight)` tuples for the tokens that
most strongly belong to the given topic.
"""
dic = self.dictionary
weights = self.topic2token[topic_id]
indices = np.argsort(self.topic2token[topic_id])[::-1][:limit]
return [(dic[i], weights[i]) for i in indices]
def best_tokens_for_topic(self, topic_id: int, limit=5):
"""Returns the top tokens that most strongly belong to the given
topic."""
results = self.best_token_weights_for_topic(topic_id, limit=limit)
return [w for w, _ in results]
def best_token_for_topic(self, topic_id: int) -> str:
"""Returns the token that most strongly belongs to the given
topic."""
return self.best_tokens_for_topic(topic_id, limit=1)[0]
def best_topic_for_token(self, token) -> int:
"""Returns the topic index that most strongly belongs to the given
token."""
index = self.dictionary.token2id[token]
return np.argmax(self.topic2token[:, index])
def best_topic_for_documents(self) -> List[int]:
"""Returns the topic for each document that most strongly belongs
to that document.
"""
return np.argmax(self.doc2topic, axis=1)
def train_nmf_model(corpus: Corpus, num_topics: int, seed=0, max_iter=500) -> TopicModel:
"""Train a topic model using NMF.
:param num_topics: The number of topics to train.
:param seed: The seed used for random number generation.
:param max_iter: The maximum number of iterations to use for training.
More iterations mean better results, but longer training
times.
"""
import gensim.models.nmf
dic = corpus.dictionary
freqs = corpus.frequencies
tfidf = gensim.models.tfidfmodel.TfidfModel(dictionary=dic)
model = gensim.models.nmf.Nmf(
list(tfidf[freqs]),
num_topics=num_topics,
passes=max_iter,
random_state=seed,
w_stop_condition=1e-9,
h_stop_condition=1e-9,
w_max_iter=50,
h_max_iter=50,
)
doc2topic = corpus2dense(model[freqs], num_topics).T
topic2token = model.get_topics()
return TopicModel(dic, doc2topic, topic2token)
def train_lda_model(corpus: Corpus, num_topics, seed=0, **kwargs) -> TopicModel:
"""Train a topic model using LDA.
:param num_topics: The number of topics to train.
:param seed: The seed used for random number generation.
:param kwargs: Arguments passed to `gensim.models.lda.LdaModel` (gensim3)
or `gensim.models.ldamodel.LdaModel` (gensim4).
"""
dic = corpus.dictionary
freqs = corpus.frequencies
from importlib.metadata import version
gensim_mayor = int(version("gensim").split(".")[0])
if gensim_mayor == 3:
from gensim.models.lda import LdaModel
model = LdaModel(list(corpus), **kwargs)
elif gensim_mayor == 4:
from gensim.models.ldamodel import LdaModel
model = LdaModel(freqs, id2word=dic, num_topics=num_topics, **kwargs)
else:
from sys import exit
exit("LdaModel could not be imported from gensim 3 or 4.")
doc2topic = corpus2dense(model[freqs], num_topics).T
topic2token = model.get_topics()
return TopicModel(dic, doc2topic, topic2token)
def train_elda_model(corpus: Corpus, num_topics, num_models=4, seed=0, **kwargs) -> TopicModel:
"""Train a topic model using ensemble LDA.
:param num_topics: The number of topics to train.
:param num_models: The number of models to train.
:param seed: The seed used for random number generation.
:param kwargs: Arguments passed to `gensim.models.ensemblelda.EnsembleLda` (gensim4).
"""
from importlib.metadata import version
gensim_mayor = int(version("gensim").split(".")[0])
if gensim_mayor <= 3:
from sys import exit
exit("EnsembleLda requires at least gensim 4.")
dic = corpus.dictionary
freqs = corpus.frequencies
from gensim.models.ensemblelda import EnsembleLda
model = EnsembleLda(
topic_model_class="ldamulticore",
corpus=freqs,
id2word=dic,
num_topics=num_topics,
num_models=num_models,
**kwargs
)
doc2topic = corpus2dense(model[freqs], num_topics).T
topic2token = model.get_topics()
return TopicModel(dic, doc2topic, topic2token)
def compute_word_distribution(corpus: Corpus, *, limit=None) -> pd.DataFrame:
"""Returns dataframe that indicates, for each word, the number of
documents that mention that word.
"""
counter = defaultdict(int)
dic = corpus.dictionary
for vector in corpus.frequencies:
for i, _ in vector:
counter[i] += 1
keys = sorted(counter, key=lambda k: counter[k], reverse=True)[:limit]
if limit is not None:
keys = keys[:limit]
return pd.DataFrame(index=[dic[i] for i in keys], data=dict(count=[counter[i] for i in keys]))
def generate_topic_cloud(
model: TopicModel, topic_id: int, cmap=None, max_font_size=75, background_color="white"
) -> wordcloud.WordCloud:
"""Generate a word cloud for the given topic from the given topic model.
:param cmap: The color map used to color the words.
:param max_font_size: Size of the word which most strongly belongs to the
topic. The other words are scaled accordingly.
:param background_color: Background color.
"""
if cmap is None:
cmap = "Blues"
cmap = plt.get_cmap(cmap)
dic = model.dictionary
vec = model.topic2token[topic_id]
maximum = np.amax(vec)
words = dict()
for i in np.argsort(vec)[-100:]:
if vec[i] > 0:
words[dic[i]] = vec[i] / maximum
def get_color(word, **kwargs):
weight = kwargs["font_size"] / 75.0 * 0.7 + 0.3
r, g, b = np.array(cmap(weight)[:3]) * 255
return "rgb({}, {}, {})".format(int(r), int(g), int(b))
wc = wordcloud.WordCloud(
prefer_horizontal=True,
max_font_size=max_font_size,
background_color=background_color,
color_func=get_color,
scale=2,
relative_scaling=0.5,
)
wc.fit_words(words)
return wc
def calculate_embedding(corpus: Corpus, *, rank=2, svd_dims=50, perplexity=30, seed=0):
"""Calculate a document embedding that assigns each document in the
corpus a N-d position based on the word usage.
:returns: A list of N-d tuples for the documents in the corpus.
"""
from gensim.models.tfidfmodel import TfidfModel
from sklearn.decomposition import TruncatedSVD
from sklearn.manifold import TSNE
dic = corpus.dictionary
freqs = corpus.frequencies
tfidf = corpus2dense(TfidfModel(dictionary=dic)[freqs], len(dic)).T
if svd_dims is not None:
svd = TruncatedSVD(n_components=svd_dims, random_state=seed)
components = svd.fit_transform(tfidf)
else:
components = tfidf
model = TSNE(rank, metric="cosine", perplexity=perplexity, random_state=seed)
return model.fit_transform(components)
================================================
FILE: litstudy/plot.py
================================================
from .stats import (
compute_year_histogram,
compute_author_histogram,
compute_author_affiliation_histogram,
compute_language_histogram,
compute_number_authors_histogram,
compute_source_histogram,
compute_source_type_histogram,
compute_affiliation_histogram,
compute_country_histogram,
compute_continent_histogram,
compute_groups_histogram,
)
from .nlp import (
generate_topic_cloud,
calculate_embedding,
compute_word_distribution,
TopicModel,
Corpus,
)
from .types import DocumentSet
import inspect
import math
import matplotlib.pyplot as plt
import numpy as np
import seaborn
import pandas as pd
def plot_histogram(
data: pd.DataFrame,
keys=None,
title="",
xlabel="",
ylabel="",
label_rotation=None,
vertical=False,
bar_width=0.8,
max_label_length=100,
stacked=False,
legend=True,
relative_to=None,
ax=None,
):
"""
This is the general function to plot a histogram (bar plot). All other
`plot_*_histogram` functions in this module will call this function.
This function takes a pandas `DataFrame`. Each column represents one
group and a sequence of bars that will be plotted. The names in the index
are placed as labels on the axis.
For instance, a possible input could be
data frame where the columns are different authors, rows are different
years, and values are the number of publications per year per author.
:param ax: The `matplotlib` `Axes` instance the plot will be drawn on. If
`None`, the current `Axes` instance is used (`plt.gca()`).
:param vertical: Default bars are horizontal (left to right). Set
`vertical=True` for vertical bars (bottom to top).
:param bar_width: Width of bars. Should be at most `1.0` for 100%.
:param label_rotation: Rotates the xlabels. This is useful if
`vertical=True` since it can be used to place the
labels horziontal (`label_rotation=0`), vertical
(`label_rotation=90`), or diagonal
(`label_rotation=45`).
:param max_label_length: Labels longer than this length are shortened.
:param stacked: By default, different groups are drawn next to each other.
If `True`, the different groups are stacked on top of each
other instead.
:param legend: Show legend.
:param relative_to: If not `None`, all bars will be plotted as a
percentage relative to this value.
:param title: Title of plot (set using `ax.set_title`).
:param xlabel: Title on the X axis (or Y axis if `vertical=True`).
:param ylabel: Title on the Y axis (or X axis if `vertical=True`).
"""
if ax is None:
ax = plt.gca()
if label_rotation is None:
if vertical:
label_rotation = 90
else:
label_rotation = 0
if not ylabel:
if relative_to is not None:
ylabel = "% of documents"
else:
ylabel = "No. of documents"
if not vertical:
ax.grid(visible=False, which="both", axis="y")
xlabel, ylabel = ylabel, xlabel
else:
ax.grid(visible=False, which="both", axis="x")
if title:
ax.set_title(title)
if xlabel:
ax.set_xlabel(xlabel)
if ylabel:
ax.set_ylabel(ylabel)
if keys is None:
keys = list(data.index)
n = len(keys)
groups = list(data)
if not groups or not keys:
return
bar_bottom = np.array([0] * len(keys))
for i, group in enumerate(groups):
ys = data[group]
bottom = bar_bottom
if relative_to is not None:
ys = ys / relative_to * 100
if stacked:
bar_bottom = bar_bottom + ys
xs = np.arange(n) - 0.5 * bar_width
bin_width = bar_width
else:
bin_width = bar_width / len(groups)
xs = np.arange(n) + i * bin_width - 0.5 * bar_width
if not vertical:
ax.barh(xs, ys, label=group, height=bin_width, left=bottom, align="edge")
else:
ax.bar(xs, ys, label=group, width=bin_width, bottom=bottom, align="edge")
if legend and len(groups) > 1:
ax.legend()
def shorten(label):
label = str(label)
n = max_label_length
return label[:n] + "..." if len(label) > n else label
labels = list(map(shorten, keys))
if not vertical:
ax.set_ylim((n - 0.5, -0.5))
ax.set_yticks(range(n))
ax.set_yticklabels(labels, rotation=label_rotation)
else:
ax.set_xlim((-0.5, n - 0.5))
ax.set_xticks(range(n))
ax.set_xticklabels(labels, rotation=label_rotation, ha="right")
return ax
def wrapper(docs, fun, default, **kwargs):
for key, value in default.items():
kwargs.setdefault(key, value)
plot_kwargs = dict()
params = inspect.signature(plot_histogram).parameters
for key in list(kwargs):
if key in params:
plot_kwargs[key] = kwargs.pop(key)
if kwargs.pop("relative", False):
plot_kwargs["relative_to"] = len(docs)
data = fun(docs, **kwargs)
return plot_histogram(data, **plot_kwargs)
def plot_groups_histogram(docs, **kwargs):
""" """
def fun(docs, **kwargs):
return compute_groups_histogram(docs, **kwargs).T
default = dict(title="Categories")
return wrapper(docs, fun, default, **kwargs)
def plot_year_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of documents published in each year.
:param kwargs: Passed to `plot_histogram`.
"""
default = dict(title="Year of publications")
return wrapper(docs, compute_year_histogram, default, **kwargs)
def plot_author_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of documents published per author.
:param kwargs: Passed to `plot_histogram`.
"""
default = dict(title="Authors", limit=25)
return wrapper(docs, compute_author_histogram, default, **kwargs)
def plot_number_authors_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of authors per document.
:param kwargs: Passed to `plot_histogram`.
"""
default = dict(title="No. of authors")
return wrapper(docs, compute_number_authors_histogram, default, **kwargs)
def plot_author_affiliation_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of documents published per author
affiliation.
:param kwargs: Passed to `plot_histogram`.
"""
default = dict(title="Author + Affiliation", limit=25)
return wrapper(docs, compute_author_affiliation_histogram, default, **kwargs)
def plot_language_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of documents by language."""
default = dict(title="Language")
return wrapper(docs, compute_language_histogram, default, **kwargs)
def plot_source_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of documents by publication source."""
default = dict(title="Publication source", limit=25)
return wrapper(docs, compute_source_histogram, default, **kwargs)
def plot_source_type_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of documents by publication source
type.
:param kwargs: Passed to `plot_histogram`.
"""
default = dict(title="Publication source type", limit=25)
return wrapper(docs, compute_source_type_histogram, default, **kwargs)
def plot_affiliation_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of documents by author affiliation.
:param kwargs: Passed to `plot_histogram`.
"""
default = dict(title="Affiliations", limit=25)
return wrapper(docs, compute_affiliation_histogram, default, **kwargs)
def plot_country_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of documents by country of author
affiliation
:param kwargs: Passed to `plot_histogram`.
"""
default = dict(title="Countries", limit=25)
return wrapper(docs, compute_country_histogram, default, **kwargs)
def plot_continent_histogram(docs: DocumentSet, **kwargs):
"""Plot histogram of the number of documents by continent of author
affiliation.
:param kwargs: Passed to `plot_histogram`.
"""
default = dict(title="Continents", limit=25)
return wrapper(docs, compute_continent_histogram, default, **kwargs)
def plot_word_distribution(corpus: Corpus, *, limit=25, **kwargs):
"""Plot the frequency of the top words in the given corpus.
:param kwargs: Passed to `plot_histogram`.
"""
n = len(corpus.frequencies)
data = compute_word_distribution(corpus, limit=limit)
return plot_histogram(data, relative_to=n, **kwargs)
def plot_embedding(corpus: Corpus, model: TopicModel, layout=None, ax=None):
"""TODO"""
if ax is None:
ax = plt.gca()
if layout is None:
layout = calculate_embedding(corpus)
num_topics = len(model.topic2token)
best_topic = np.argmax(model.doc2topic.T, axis=0)
colors = seaborn.color_palette("hls", num_topics)
colors = np.array(colors)[:, :3] * 0.9 # Mute colors a bit
for i in range(num_topics):
indices = best_topic == i
# label = 'ABCDEFGHIJLMNOPQRSTUVWXYZ'[i]
label = i + 1
for j in np.argwhere(indices)[:, 0]:
x, y = layout[j]
ax.scatter(
x,
y,
marker="o",
s=150,
linewidth=0.5,
color=colors[i],
zorder=2 * j,
)
ax.text(
x,
y,
label,
fontsize=6,
color="1",
va="center",
ha="center",
fontweight="bold",
zorder=2 * j + 1,
)
top_items = model.best_tokens_for_topic(i, limit=3)
label = f"Topic {label}:" + ", ".join(top_items)
center = np.median(layout[indices], axis=0)
ax.text(
center[0],
center[1],
label,
va="center",
ha="center",
color="1",
backgroundcolor=(0, 0, 0, 0.75),
zorder=10 * len(best_topic),
)
ax.set_aspect("equal")
ax.set_xticks([])
ax.set_yticks([])
def plot_topic_clouds(model: TopicModel, *, fig=None, ncols=3, **kwargs):
"""Plot word clouds for each of the topics from the given topic model."""
if fig is None:
plt.clf()
fig = plt.gcf()
nrows = math.ceil(model.num_topics / float(ncols))
for i in range(model.num_topics):
ax = fig.add_subplot(nrows, ncols, i + 1)
plot_topic_cloud(model, i, ax=ax, **kwargs)
def plot_topic_cloud(model: TopicModel, topic_id: int, *, ax=None, **kwargs):
"""Plot a word cloud for the given topic from the given topic model."""
if ax is None:
ax = plt.gca()
ax.set_xticks([])
ax.set_yticks([])
im = generate_topic_cloud(model, topic_id, **kwargs).to_array()
ax.set_title(f"Topic {topic_id + 1}")
ax.imshow(im, interpolation="bilinear")
def plot_document_topics(model: TopicModel, document_id: int, *, ax=None):
if ax is None:
ax = plt.gca()
weights = model.document_topics(document_id)
ax.bar(np.arange(model.num_topics), model.document_topics(document_id))
ax.set_ylim(0, 1)
ax.set_ylabel("Relevance")
ax.set_ylabel("Topics")
for i, w in enumerate(weights):
if w > 0.01:
plt.text(i, w, str(i + 1), ha="center", va="bottom")
================================================
FILE: litstudy/sources/__init__.py
================================================
from .scopus import search_scopus, refine_scopus, fetch_scopus
from .bibtex import load_bibtex
from .semanticscholar import fetch_semanticscholar, search_semanticscholar, refine_semanticscholar
from .crossref import fetch_crossref, refine_crossref, search_crossref
from .ieee import load_ieee_csv
from .springer import load_springer_csv
from .dblp import search_dblp
from .ris import load_ris_file
from .arxiv import search_arxiv
from .csv import load_csv
from .scopus_csv import load_scopus_csv
__all__ = [
"fetch_crossref",
"fetch_scopus",
"fetch_semanticscholar",
"load_bibtex",
"load_csv",
"load_ieee_csv",
"load_ris_file",
"load_scopus_csv",
"load_springer_csv",
"refine_crossref",
"refine_scopus",
"refine_semanticscholar",
"search_arxiv",
"search_crossref",
"search_dblp",
"search_scopus",
"search_semanticscholar",
]
================================================
FILE: litstudy/sources/arxiv.py
================================================
from litstudy.types import Document, DocumentSet, DocumentIdentifier, Author
from typing import Optional, List
import feedparser # type: ignore
from datetime import datetime
from urllib.parse import urlencode
import time
class ArXivAuthor(Author):
def __init__(self, entry):
self.entry = entry
@property
def name(self):
return self.entry
class ArXivDocument(Document):
def __init__(self, entry):
identifier = DocumentIdentifier(
entry.title,
)
super().__init__(identifier)
self.entry = entry
@property
def doi(self) -> Optional[str]:
return self.entry.get("arxiv_doi", None)
@property
def title(self) -> str:
return self.entry.get("title")
@property
def authors(self) -> List:
return [ArXivAuthor(name.get("name")) for name in self.entry.get("authors")]
@property
def journal_ref(self) -> Optional[str]:
return self.entry.get("arxiv_journal_ref", None)
@property
def publication_date(self):
publication_date = datetime.strptime(self.entry.get("published"), "%Y-%m-%dT%H:%M:%SZ")
return publication_date.date()
@property
def abstract(self) -> Optional[str]:
return self.entry.get("summary", None)
@property
def language(self) -> Optional[str]:
return self.entry.get("language", None)
@property
def category(self) -> Optional[List[str]]:
"""returns arxiv category for article"""
return self.entry.get("tags", None)[0].get("term", None)
# Base api query url
ARXIV_SEARCH_URL = "http://export.arxiv.org/api/query"
def search_arxiv(
query,
start=0,
max_results=2000,
batch_size=100,
sort_order="descending",
sort_by="submittedDate",
sleep_time=3,
) -> DocumentSet:
"""Search `arXiv `_.
Each returned document contains the following attributes:
title, authors, doi, journal_ref, publication_date, abstract, language, and category
:param query: The query as described in the
`arXiv API use manual `_.
:param max_results: The maximum number of results to return.
:param start: Skip the first ``start`` documents from the results.
:param batch_size: The number documents to fetch per request.
:param sleep_time: The time to wait in seconds between each HTTP requests.
"""
docs = list()
start = int(start)
max_results = int(max_results)
batch_size = int(batch_size)
while len(docs) < max_results:
url_query = urlencode(
dict(
search_query=query,
start=start,
max_results=min(max_results - len(docs), batch_size),
sortOrder=sort_order,
sortBy=sort_by,
)
)
url = f"{ARXIV_SEARCH_URL}?{url_query}"
data = feedparser.parse(url)
if not data.entries:
break
start += len(data.entries)
for entry in data.entries:
docs.append(ArXivDocument(entry))
time.sleep(sleep_time)
return DocumentSet(docs)
================================================
FILE: litstudy/sources/bibtex.py
================================================
from ..types import Document, DocumentSet, DocumentIdentifier, Author
from ..common import robust_open
# from bibtexparser.customization import convert_to_unicode
from bibtexparser.latexenc import latex_to_unicode
import bibtexparser
from datetime import date
import re
MONTHS = dict(
jan=1,
january=1,
feb=2,
feburary=2,
mar=3,
march=3,
apr=4,
april=4,
may=5,
jun=6,
june=6,
jul=7,
july=7,
aug=8,
august=8,
sep=9,
september=9,
oct=10,
october=10,
nov=11,
november=11,
dec=12,
december=12,
)
def find_doi(entry):
def extract(val):
if isinstance(val, str):
# The following regex is recommended by crossref to detect DOIs
# http://crossref.org/blog/dois-and-matching-regular-expressions/
# /^10.\d{4,9}/[-._;()/:A-Z0-9]+$/i
pattern = "10[.][0-9]{4,9}/[-._;()/:a-zA-Z0-9]{5,}"
match = re.search(pattern, val)
if match:
return match[0]
return None
result = entry.get("doi", "").strip()
if result:
doi = result
else:
doi = None
for key in ["doi", "link", "url", "howpublished"]:
if key in entry:
doi = extract(entry[key])
if doi:
break
if not doi:
return None
# Remove URL prefix
prefix = "https://doi.org/"
if doi.startswith(prefix):
n = len(prefix)
doi = doi[n:]
return doi
class BibDocument(Document):
def __init__(self, entry):
title = entry["title"]
attr = dict(
doi=find_doi(entry),
pubmed=entry.get("pmid"),
)
super().__init__(DocumentIdentifier(title, **attr))
self.entry = entry
@property
def key(self) -> str:
return self.entry["ID"]
@property
def title(self) -> str:
return self.entry.get("title").strip("{}")
@property
def authors(self):
content = self.entry.get("author")
if not content:
return None
content = re.sub("[ \r\n\t]+", " ", content)
names = re.split(" (?:and|And|AND) ", content)
if not names:
return None
# remove "other" from the list
if names[-1] == "others":
names = names[:-1]
return [BibAuthor(name) for name in names]
@property
def publisher(self):
return self.entry.get("publisher")
@property
def language(self):
return self.entry.get("language")
@property
def publication_date(self):
year = self.publication_year
month = self.publication_month or 1
if year is None:
return None
return date(year, month, 1)
@property
def publication_year(self):
try:
year = int(self.entry["year"])
except Exception:
return None
# Sometimes year is in 19xx format.
if year < 100:
year += 1900
return year
@property
def publication_month(self):
key = self.entry.get("month", "").lower()
return MONTHS.get(key) # name -> number
@property
def publication_source(self):
result = self.entry.get("journal")
if result:
return result
result = self.entry.get("booktitle")
if result:
return result
return None
@property
def keywords(self):
content = self.entry.get("keywords")
if not content:
return None
return [w.strip().lower() for w in re.split("[;,\n\r]+", content) if w]
@property
def abstract(self):
return self.entry.get("abstract")
class BibAuthor(Author):
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
def __repr__(self):
return f"<{self._name}>"
def load_bibtex(path: str) -> DocumentSet:
"""Load the bibtex file at the given `path` as a `DocumentSet`."""
def decode(entry):
if isinstance(entry, list):
return [decode(e) for e in entry]
elif isinstance(entry, dict):
return dict((k, decode(v)) for k, v in entry.items())
else:
# TODO: latex_to_unicode sometimes fails with exception. I do
# not understand why, but let's just sweep it under the rug
# for now ok? Great.
try:
return latex_to_unicode(entry)
except Exception:
return entry
parser = bibtexparser.bparser.BibTexParser(common_strings=True)
parser.customization = decode
with robust_open(path) as f:
data = bibtexparser.load(f, parser=parser)
docs = [BibDocument(e) for e in data.entries if e.get("title")]
return DocumentSet(docs)
================================================
FILE: litstudy/sources/crossref.py
================================================
from ..common import progress_bar
from datetime import date
from time import sleep
from typing import Tuple, Optional
from urllib.parse import quote_plus, urlencode
import logging
import re
import requests
import shelve
from ..types import Document, Author, DocumentSet, DocumentIdentifier, Affiliation
class CrossRefAuthor(Author):
def __init__(self, entry):
self.entry = entry
@property
def name(self):
given = self.entry.get("given", "")
family = self.entry.get("family", "")
if not given and not family:
return None
return f"{given} {family}".strip()
@property
def orcid(self):
return self.entry.get("ORCID")
@property
def affiliations(self):
entries = self.entry.get("affiliation")
if entries:
return [CrossRefAffiliation(e) for e in entries]
else:
return None
class CrossRefAffiliation(Affiliation):
def __init__(self, entry):
self.entry = entry
@property
def name(self) -> str:
return self.entry["name"]
def _extract_title(entry):
# CrossRef returns list of titles from some reason?
titles = entry.get("title")
if titles:
return re.sub(r"[\s]+", " ", " ".join(titles))
else:
return None
class CrossRefDocument(Document):
def __init__(self, entry):
self.entry = entry
title = _extract_title(entry)
doi = entry.get("DOI")
super().__init__(DocumentIdentifier(title, doi=doi))
@property
def title(self) -> str:
return _extract_title(self.entry)
@property
def authors(self):
authors = self.entry.get("author", [])
return [CrossRefAuthor(a) for a in authors]
@property
def publisher(self):
return self.entry.get("publisher")
@property
def language(self):
return self.get("language")
@property
def publication_date(self):
try:
parts = self.entry["published-print"]["date-parts"]
year = int(parts[0])
month = int(parts[1])
return date(year, month, 1)
except Exception:
return None
@property
def publication_year(self):
try:
return int(self.entry["published-print"]["date-parts"][0])
except Exception:
return None
@property
def publication_source(self):
source = self.entry.get("container-title")
if source:
return source[0]
else:
return None
@property
def abstract(self):
return self.entry.get("abstract")
@property
def citation_count(self):
try:
return int(self.entry["is-referenced-by-count"])
except Exception:
return None
@property
def references(self):
output = []
for ref in self.entry.get("reference", []):
title = ref.get("unstructured")
doi = ref.get("DOI")
if title or doi:
output.append(DocumentIdentifier(title, doi=doi))
return output
def __repr__(self):
return f"<{self.title}>"
@staticmethod
def load(doi):
return fetch_crossref(doi)
CACHE_FILE = ".crossref"
CROSSREF_URL = "https://api.crossref.org/works/"
def fetch_crossref(doi: str, *, timeout=0.5, session=None) -> Optional[Document]:
"""Fetch the metadata for the given DOI from CrossRef.
:param timeout: The timeout between each HTTP request in seconds.
:param session: The `requests.Session` to use for HTTP requests.
:returns: The `Document` or `None` if the DOI was not available.
"""
if session is None:
session = requests.Session()
def request():
if not doi:
return None
with shelve.open(CACHE_FILE) as cache:
if doi in cache:
return cache[doi]
url = CROSSREF_URL + quote_plus(doi)
try:
response = session.get(url)
except Exception as e:
logging.warn(f"failed to retrieve {doi}: {e}")
return None
sleep(timeout)
code = response.status_code
if code == 200:
try:
data = response.json()["message"]
except Exception as e:
logging.warn(f"invalid output from {url}: {e}")
return None
elif code == 404:
logging.warn(f"failed to retrieve {doi}: resource not found")
data = None
else:
logging.warn(f"failed to retrieve {doi} ({code}): {response.text}")
return None
cache[doi] = data
return data
data = request()
return CrossRefDocument(data) if data else None
def refine_crossref(
docs: DocumentSet, *, timeout=0.5, session=None
) -> Tuple[DocumentSet, DocumentSet]:
"""Attempts to fetch metadata from CrossRef for each document in the given
set. Returns a tuple of two sets: the documents retrieved from CrossRef
and the remaining documents (i.e., without DOI or not found).
:param timeout: Timeout in seconds between each request to throttle server communication.
:param session: The `requests.Session` to use for HTTP requests.
"""
if session is None:
session = requests.Session()
def callback(doc):
if isinstance(doc, CrossRefDocument):
return doc
return fetch_crossref(doc.id.doi, timeout=timeout, session=session)
return docs._refine_docs(callback)
def _fetch_dois(params: dict, timeout: float, limit: int, session):
dois = []
params = dict(params)
params["cursor"] = "*" # The cursor should be * on first request
params["rows"] = 100 # Fetch 100 results per request
while True:
query_string = urlencode(params)
url = CROSSREF_URL + "?" + query_string
response = session.get(url).json()
# Status should be "ok"
if response["status"] != "ok":
raise ValueError(f"failed to retrieve {url}: {response}")
sleep(timeout)
data = response["message"]
items = data["items"]
params["cursor"] = data["next-cursor"]
# If no more items are found, break from loop
if not items:
break
# Append to dois
for item in items:
doi = item["DOI"]
dois.append(doi)
# If hit limit, break from loop
if limit and len(dois) > limit:
dois = dois[:limit]
break
return dois
def search_crossref(
query: str, *, limit: int = None, timeout: float = 0.5, options: dict = dict(), session=None
) -> DocumentSet:
"""Submit the query to the CrossRef API.
:param query: The search query.
:param limit: Maximum number of results to retrieve. ``None`` is unlimited.
:param timeout: Timeout in seconds between each request to throttle
server communication
:param options: Additional parameters that are passed to the ``/works``
endpoint of CrossRef (see `CrossRef API`
`_). Options are `sort` and
`filter`.
:param session: The `requests.Session` to use for HTTP requests.
"""
if not query:
return DocumentSet()
if session is None:
session = requests.Session()
params = dict()
params["query"] = query
params["select"] = "DOI"
for key, value in options.items():
params[key] = value
cache_params = dict(params)
cache_params["limit"] = limit
cache_key = urlencode(cache_params)
with shelve.open(CACHE_FILE) as cache:
if cache_key not in cache:
dois = _fetch_dois(params, timeout, limit, session)
cache[cache_key] = dois
else:
dois = cache[cache_key]
docs = []
for doi in progress_bar(dois):
docs.append(fetch_crossref(doi, session=session, timeout=timeout))
return DocumentSet(docs)
================================================
FILE: litstudy/sources/csv.py
================================================
import csv
import datetime
from ..types import Author, Document, DocumentSet, DocumentIdentifier
from ..common import robust_open, fuzzy_match
class CsvAuthor(Author):
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
class CsvDocument(Document):
def __init__(self, record, fields):
self.fields = fields
self.record = record
id = DocumentIdentifier(self.title, doi=self._field("doi"), pubmed=self._field("pubmed"))
super().__init__(id)
def __getitem__(self, key):
return self.record[key]
def __setitem__(self, key, value):
self.record[key] = value
def __iter__(self):
return iter(self.record)
def _field(self, field_name):
key = self.fields[field_name]
return self.record.get(key) or None
@property
def title(self):
return self._field("title")
@property
def abstract(self):
return self._field("abstract")
@property
def publication_source(self):
return self._field("source")
@property
def language(self):
return self._field("language")
@property
def publisher(self):
return self._field("publisher")
@property
def citation_count(self):
try:
return int(self._field("citation"))
except Exception:
return None
@property
def keywords(self):
text = self._field("keywords")
if not text:
return None
# Try to split on something
for delim in ";|\t, ":
if delim in text:
return [t.strip() for t in text.split(delim)]
return [text]
@property
def publication_date(self):
text = self._field("date")
if not text:
return None
# Is it a year?
try:
year = int(text)
if year > 1500 and year < 2500:
return datetime.date(year, 1, 1)
else:
return None
except Exception:
pass
# Is it an iso date?
try:
return datetime.date.fromisoformat(text)
except Exception:
pass
# Is it one of these formats?
formats = [
"%c",
"%x",
"%d/%m/%y",
"%d/%m/%Y",
"%m/%d/%y",
"%m/%d/%Y",
"%d.%m.%y",
"%d.%m.%Y",
"%Y-%m-%d",
"%y-%m-%d",
"%Y-%d",
"%d-%Y",
"%y-%d",
]
for fmt in formats:
try:
return datetime.datetime.strptime(text, fmt)
except Exception:
pass
# I give up, failed to parse date
return None
@property
def publication_year(self):
date = self.publication_date
if not date:
return None
return date.year
@property
def authors(self):
text = self._field("authors")
if not text:
return None
for delim in [";", "|", " and ", ","]:
if delim in text:
names = text.split(delim)
names = [name.strip() for name in names]
names = [name for name in names if name]
return [CsvAuthor(name) for name in names]
# Just one author?
return [CsvAuthor(text)]
def find_field(columns, possible_names):
PREFIXES = ["", "document", "article", "paper", "item", "publication"]
for a in possible_names:
for b in columns:
for prefix in PREFIXES:
if fuzzy_match(f"{prefix} {a}", b):
return b
def load_csv(
path: str,
dialect: "csv.Dialect" = None,
title_field: str = None,
authors_field: str = None,
abstract_field: str = None,
citation_field: str = None,
date_field: str = None,
source_field: str = None,
doi_field: str = None,
filter=None,
) -> DocumentSet:
"""Load an abitrary CSV file and parse its contents as a ``DocumentSet``
on a best effort basis.
An attempt is made to guess the purpose of the fields of the CSV file
based on their names. For example, the date of publication is likely
given by a field named something like "Publication Date",
"Year of Publication", or "Published Year". In case the field name
cannot be determined, it is possible to explicitly set the purpose of
field names by passing additional parameters. For example, ``date_field``
explicit sets name of the date field.
The CSV is parsed using the given ``dialect``. If not dialect is given, an
attempt is made to guess the dialect based on the file's content.
:param path: Name of CSV file.
:param dialect: Used to read the CSV file.
:param title_field: Field name for ``title``.
:param authors_field: Field name for ``authors``.
:param abstract_field: Field name for ``abstract``.
:param citation_field: Field name for ``citation_count``.
:param date_field: Field name for ``publication_date`` or
:param source_field: Field name for ``source``.
:param doi_field: Field name for ``doi``.
:param filter: Optional function applied to each loaded record. This
function can be used to, for example, add or delete fields.
Example::
docs = litstudy.load_csv("my_data.csv",
title_field="Document Title",
date_field="Pub Date")
"""
with robust_open(path) as f:
text = f.read()
# If file is empty, exit now
if not text:
return DocumentSet([])
# Guess CSV dialect
if dialect is None:
dialect = csv.Sniffer().sniff(text)
f.seek(0)
# Read the records
records = []
for record in csv.DictReader(f):
if filter:
record = filter(record)
if record:
records.append(record)
# No records, exit now
if not records:
return DocumentSet([])
# Get the colum names
columns = list(records[0].keys())
# Guess the field names
fields = dict(
title=title_field
or find_field(
columns,
[
"title",
],
),
authors=authors_field
or find_field(
columns,
[
"authors",
"author(s)",
"author",
"names",
"people",
"person",
"persons",
],
),
abstract=abstract_field
or find_field(
columns,
[
"abstract",
"description",
"content",
"text",
"short text",
"body",
],
),
citation=citation_field
or find_field(
columns,
[
"citation count",
"citations count",
"number of citations",
"number citations",
"cited by",
"citations",
"cited",
],
),
date=date_field
or find_field(
columns,
[
"pub date",
"datum",
"date of publication",
"published date",
"publishing date",
"pub year",
"year of publication",
"published year",
"publishing year",
"date",
"year",
],
),
source=source_field
or find_field(
columns,
[
"source title",
"source name",
"source",
"conference name",
],
),
pubmed=find_field(
columns,
[
"pubmed",
"pubmedid",
"pubmed id",
],
),
doi=doi_field
or find_field(
columns,
[
"doi",
"object identifier",
"object identification",
],
),
keywords=find_field(
columns,
[
"keywords",
"tags",
"categories",
"keys",
"indices",
"author keywords",
"author tags",
],
),
publisher=find_field(
columns,
[
"publisher",
"publisher name",
],
),
language=find_field(
columns,
[
"language",
"lang",
"original language",
],
),
)
docs = [CsvDocument(record, fields) for record in records]
return DocumentSet(docs)
================================================
FILE: litstudy/sources/dblp.py
================================================
from ..types import Document, DocumentSet, DocumentIdentifier, Author
import requests
import shelve
import logging
class DBLPDocument(Document):
def __init__(self, entry, authors):
id = DocumentIdentifier(entry["title"], doi=entry.get("doi"))
super().__init__(id)
self.entry = entry
self._authors = authors
@property
def title(self):
return self.entry.get("title")
@property
def publication_year(self):
try:
return int(self.entry.get("year"))
except Exception:
return None
@property
def publication_type(self):
return self.entry.get("type")
@property
def publication_source(self):
return self.entry.get("venue")
@property
def publisher(self):
return self.entry.get("publisher")
@property
def authors(self):
return self._authors
def __repr__(self):
return f"<{self.title}>"
class DBLPAuthor(Author):
def __init__(self, pid, name):
self._pid = pid
self._name = name
@property
def pid(self):
return self._pid
@property
def name(self):
return self._name
def __repr__(self):
return f"<{self.name}>"
def process_authors(entry, author_cache):
# Sometimes, authors is not a valid key
if "authors" not in entry:
return None
inputs = entry["authors"]["author"]
outputs = []
# Sometimes, inputs is nothing? (empty str or null)
if not inputs:
return None
# Sometimes, inputs is str? (single author name)
if isinstance(inputs, str):
return [DBLPAuthor(None, inputs)]
# Sometimes, input is dict? (single-item list)
if isinstance(inputs, dict):
inputs = [inputs]
# Sometimes inputs is list
for author in inputs:
pid = author["@pid"]
name = author["text"]
if pid not in author_cache:
author_cache[pid] = DBLPAuthor(pid, name)
outputs.append(author_cache[pid])
return outputs
CACHE_FILE = ".dblp"
DBLP_URL = "http://dblp.org/search/publ/api"
def search_dblp(query: str, *, limit=None) -> DocumentSet:
"""Perform the given `query` on the DBLP API and return the results
as a `DocumentSet`.
:param limit: The maximum number of documents to retrieve.
"""
attr = dict(format="json", h=100, q=query, f=0)
offset = 0
docs = []
author_cache = dict()
with shelve.open(CACHE_FILE) as cache:
while True:
key = f"{query};{offset}"
if key not in cache:
attr["f"] = offset
req = requests.get(DBLP_URL, params=attr)
cache[key] = req.json().get("result")
data = cache[key]
if not data:
break
status = data.get("status").get("text")
if status != "OK":
logging.warning(f"expecting status OK, got status {status}")
break
if "hits" not in data or "hit" not in data["hits"]:
break
entries = data["hits"]["hit"]
offset += len(entries)
if not entries:
break
for entry in entries:
entry = entry["info"]
authors = process_authors(entry, author_cache)
docs.append(DBLPDocument(entry, authors))
if limit is not None and len(docs) >= limit:
break
return DocumentSet(docs)
================================================
FILE: litstudy/sources/ieee.py
================================================
from ..types import Document, Author, DocumentSet, DocumentIdentifier, Affiliation
from ..common import robust_open
import csv
import logging
class IEEEDocument(Document):
def __init__(self, entry):
doi = entry["DOI"] or None
title = entry["Document Title"]
super().__init__(DocumentIdentifier(title, doi=doi))
self.entry = entry
@property
def title(self) -> str:
return self.entry.get("Document Title")
@property
def authors(self):
authors = self.entry.get("Authors", "").split("; ")
affs = self.entry.get("Author Affiliations", "").split("; ")
# Bug fix #55:
# In some cases, the number of affiliations does not match the number of authors
# given by the CSV file. Since there is no way of knowing which affiliations belong
# to which authors, we just ignore all affiliations in this case.
if len(authors) != len(affs):
logging.warn(
(
f"affiliations for entry '{self.title}' are invalid: the number of authors "
f"({len(authors)}) does not match the number of author affilications ({len(affs)})"
)
)
affs = [None] * len(authors)
return [IEEEAuthor(a, b) for a, b in zip(authors, affs)]
@property
def affiliations(self):
affs = self.entry.get("Author Affiliations", "").split("; ")
return [IEEEAffiliation(a) for a in affs]
@property
def publisher(self):
return self.entry.get("Publisher")
@property
def publication_year(self):
try:
return int(self.entry["Publication Year"])
except Exception:
return None
@property
def keywords(self):
# There are several sources of keywords. Should we only include
# author keywords maybe? Or all possible keywords?
keys = [
"Author Keywords",
"IEEE Terms",
"INSPEC Controlled Terms",
"INSPEC Non-Controlled Terms",
"Mesh_Terms",
]
keywords = []
for key in keys:
for word in self.entry.get(key, "").split(";"):
if word:
keywords.append(word)
return keywords
@property
def abstract(self):
return self.entry.get("Abstract") or None
@property
def citation_count(self):
try:
return int(self.entry["Article Citation Count"])
except Exception:
return None
class IEEEAffiliation(Affiliation):
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
class IEEEAuthor(Author):
def __init__(self, name, affiliation):
self._name = name
self._affiliation = affiliation
@property
def name(self):
return self._name
@property
def affiliations(self):
# Handle special case where affiliation is NA (not applicable)
if not self._affiliation or self._affiliation == "NA":
return None
return [IEEEAffiliation(self._affiliation)]
def load_ieee_csv(path: str) -> DocumentSet:
"""Import CSV file exported from
`IEEE Xplore `_.
"""
with robust_open(path) as f:
lines = csv.DictReader(f)
docs = [IEEEDocument(line) for line in lines]
return DocumentSet(docs)
================================================
FILE: litstudy/sources/ris.py
================================================
from ..types import Document, Author, DocumentSet, DocumentIdentifier
from ..common import robust_open
import logging
def extract_title(attr):
return attr.get("TI") or attr.get("T1") or attr.get("T2") or attr.get("T3") or attr.get("TT")
class RISDocument(Document):
def __init__(self, attr, keywords, authors):
title = extract_title(attr)
doi = attr.get("DO") or None
super().__init__(DocumentIdentifier(title, doi=doi))
self.attr = attr
self.keyword_list = keywords
self.author_list = authors
@property
def title(self) -> str:
return extract_title(self.attr)
@property
def authors(self):
return self.author_list
@property
def affiliations(self):
return None
@property
def publisher(self):
return self.attr.get("PB")
@property
def language(self):
return self.attr.get("LA")
@property
def publication_year(self):
try:
return int(self.attr["PY"])
except Exception:
return None
@property
def publication_source(self):
return None
@property
def keywords(self):
return self.keyword_list
@property
def abstract(self):
return self.attr.get("AB")
class RISAuthor(Author):
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
def load_ris_file(path: str) -> DocumentSet:
"""Load the RIS file at the given `path` as a `DocumentSet`."""
docs = []
with robust_open(path) as f:
authors = []
keywords = []
attr = dict()
for line in f:
line = line.strip()
if not line: # ignore empty lines?
continue
if len(line) < 5 or line[2:5] != " -":
raise Exception(f"invalid RIS line: {line}")
key = line[:2]
value = line[5:].strip()
if key == "ER":
docs.append(RISDocument(attr, keywords, authors))
attr = dict()
authors = []
keywords = []
elif key == "KW":
keywords.append(value)
elif key in ["A1", "A2", "A3", "A4", "AU"]:
authors.append(RISAuthor(value))
elif key in attr:
logging.warn(
f"Tag {key} appears multiple times " + f'("{value}" and "{attr[key]}")'
)
else:
attr[key] = value
# Last document in RIS file
if attr:
docs.append(RISDocument(attr, keywords, authors))
return DocumentSet(docs)
================================================
FILE: litstudy/sources/scopus.py
================================================
from ..common import progress_bar, canonical
from ..types import Document, DocumentSet, DocumentIdentifier, Author, Affiliation
from collections import defaultdict
from datetime import date
from typing import Tuple, Optional
import logging
import random
import shelve
SCOPUS_CACHE = ".scopus"
class ScopusAuthor(Author):
def __init__(self, name, affiliations):
self._name = name
self._affiliations = affiliations
@property
def name(self):
return self._name
@property
def affiliations(self):
return self._affiliations
class ScopusAffiliation(Affiliation):
def __init__(self, affiliation):
self._affiliation = affiliation
@property
def name(self) -> str:
return self._affiliation.organization
@property
def country(self):
return self._affiliation.country or None
def __repr__(self):
return f"<{self.name}>"
class ScopusDocument(Document):
@staticmethod
def from_identifier(id, id_type, view="FULL"):
from pybliometrics.scopus import AbstractRetrieval
from pybliometrics.scopus.exception import Scopus404Error
with shelve.open(SCOPUS_CACHE) as cache:
key = id + "_found"
if cache.get(key) is False:
raise Scopus404Error()
try:
result = AbstractRetrieval(id, id_type=id_type, view=view)
return ScopusDocument(result)
except Scopus404Error:
cache[key] = False
raise
@staticmethod
def from_eid(eid, **kwargs):
return ScopusDocument.from_identifier(eid, "eid", **kwargs)
@staticmethod
def from_doi(doi, **kwargs):
return ScopusDocument.from_identifier(doi, "doi", **kwargs)
def __init__(self, doc):
identifier = DocumentIdentifier(
doc.title,
doi=doc.doi,
pubmed=doc.pubmed_id,
eid=doc.eid,
)
super().__init__(identifier)
self.doc = doc
@property
def title(self):
return self.doc.title or None
@property
def authors(self):
if self.doc.authorgroup is not None:
items = defaultdict(list)
for aff in self.doc.authorgroup:
name = f"{aff.indexed_name} (AUID: {aff.auid})"
items[name].append(ScopusAffiliation(aff))
return [ScopusAuthor(a, f) for a, f in items.items()]
if self.doc.authors is not None:
at = self.doc.authors
return [ScopusAuthor(a.indexed_name, None) for a in at]
return None
@property
def publisher(self):
return self.doc.publisher or None
@property
def language(self):
return self.doc.language or None
@property
def keywords(self):
return self.doc.authkeywords or []
@property
def abstract(self):
return self.doc.abstract or self.doc.description or None
@property
def citation_count(self):
if self.doc.citedby_count is not None:
return int(self.doc.citedby_count)
return None
@property
def references(self):
refs = []
if not self.doc.references:
return None
for ref in self.doc.references:
refs.append(
DocumentIdentifier(
ref.title,
eid=ref.id,
doi=ref.doi,
)
)
return refs
@property
def publication_source(self):
return self.doc.confname or self.doc.publicationName or None
@property
def source_type(self):
return self.doc.aggregationType
@property
def publication_date(self):
if self.doc.confdate:
year, month, day = self.doc.confdate[0]
return date(year, month, day)
if self.doc.coverDate:
try:
year, month, day = self.doc.coverDate.split("-")
return date(int(year), int(month), int(day))
except Exception:
pass
return None
def __repr__(self):
return f"<{self.title}>"
def fetch_scopus(key: str) -> Optional[Document]:
"""Fetch the document on Scopus for the given key. The key can be one of
the following options:
* DOI
* Scopus EID or Scopus ID
* PII
* Pubmed-ID
"""
return ScopusDocument.from_identifier(key, None)
def search_scopus(query: str, *, limit: int = None) -> DocumentSet:
"""Submit the given query to the Scopus API.
:param limit: Restrict results the first `limit` documents.
"""
from pybliometrics.scopus import ScopusSearch
search = ScopusSearch(query, view="STANDARD")
eids = list(search.get_eids())
docs = []
if limit is not None and len(eids) > limit:
random.seed(0)
random.shuffle(eids)
eids = eids[:limit]
for eid in progress_bar(eids):
doc = ScopusDocument.from_eid(eid)
docs.append(doc)
return DocumentSet(docs)
def refine_scopus(docs: DocumentSet, *, search_title=True) -> Tuple[DocumentSet, DocumentSet]:
"""Attempt to fetch Scopus metadata for each document in the given
set. Returns a tuple containing two sets: the documents available on
Scopus and the remaining documents not found on Scopus.
Documents are retrieved based on their identifier (DOI, Pubmed ID, or
Scopus ID). Documents without a unique identifier are retrieved by
performing a fuzzy search based on their title. This is not ideal
and can lead to false positives (i.e., another document is found having
the same title), thus it can be disabled if necessary.
:param search_title: Flag to toggle searching by title.
"""
from pybliometrics.scopus import ScopusSearch
def callback(doc):
id = doc.id
if isinstance(doc, ScopusDocument):
return doc
doi = id.doi
if doi:
try:
return ScopusDocument.from_doi(doi)
except Exception as e:
logging.warn(f"no document found for DOI {doi}: {e}")
return None
title = canonical(id.title)
if len(title) > 10 and search_title:
query = f"TITLE({title})"
response = ScopusSearch(query, view="STANDARD", download=False)
nresults = response.get_results_size()
if nresults > 0 and nresults < 10:
response = ScopusSearch(query, view="STANDARD")
for record in response.results or []:
if canonical(record.title) == title:
return ScopusDocument.from_eid(record.eid)
return None
return docs._refine_docs(callback)
================================================
FILE: litstudy/sources/scopus_csv.py
================================================
"""
support loading Scopus CSV export.
"""
from typing import List, Optional
from ..types import Document, Author, DocumentSet, DocumentIdentifier, Affiliation
from ..common import robust_open
import csv
class ScopusCsvAffiliation(Affiliation):
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
class ScopusCsvAuthor(Author):
def __init__(self, name, affiliation):
self._name = name
self._affiliation = affiliation
@property
def name(self):
return self._name
@property
def affiliations(self):
return [ScopusCsvAffiliation(self._affiliation)]
class ScopusCsvDocument(Document):
def __init__(self, entry):
doi = entry.get("DOI")
title = entry.get("Title")
pubmed_id = entry.get("PubMed ID")
eid = entry.get("EID")
identifier = DocumentIdentifier(title, doi=doi, pubmed=pubmed_id, eid=eid)
super().__init__(identifier)
self.entry = entry
@property
def title(self) -> Optional[str]:
return self.entry.get("Title") or None
@property
def authors(self) -> List[ScopusCsvAuthor]:
auths_affs = self.entry.get("Authors with affiliations")
auths_id = self.entry.get("Author(s) ID", "")
# author_last, first initial, affiliation; .....
if not auths_affs:
return []
auths_affs = auths_affs.split("; ")
auths = [", ".join(auth_aff.split(", ")[0:2]) for auth_aff in auths_affs]
affs = [", ".join(auth_aff.split(", ")[2:]) for auth_aff in auths_affs]
# try to add id to author name
auths_id = auths_id.split(";")[:-1] # remove empty string last el
if len(auths) == len(auths_id):
auths = [f"{name} (ID: {auth_id})" for name, auth_id in zip(auths, auths_id)]
return [ScopusCsvAuthor(a, b) for a, b in zip(auths, affs)]
@property
def publisher(self) -> Optional[str]:
return self.entry.get("Publisher") or None
@property
def publication_year(self) -> Optional[int]:
year = self.entry.get("Year")
if not year:
return None
try:
return int(year)
except:
return None
@property
def keywords(self) -> Optional[List[str]]:
keywords = self.entry.get("Author Keywords")
if not keywords:
return None
return keywords.split("; ")
@property
def abstract(self) -> Optional[str]:
abstract = self.entry.get("Abstract")
if not abstract:
return None
return abstract
@property
def citation_count(self) -> Optional[int]:
citation_count = self.entry.get("Cited by")
if not citation_count:
return None
return int(citation_count)
@property
def language(self) -> Optional[str]:
return self.entry.get("Language of Original Document") or None
@property
def publication_source(self) -> Optional[str]:
return self.entry.get("Source title") or None
@property
def source_type(self) -> Optional[str]:
return self.entry.get("Document Type") or None
def load_scopus_csv(path: str) -> DocumentSet:
"""Import CSV file exported from Scopus"""
with robust_open(path) as f:
lines = csv.DictReader(f)
docs = [ScopusCsvDocument(line) for line in lines]
return DocumentSet(docs)
================================================
FILE: litstudy/sources/semanticscholar.py
================================================
from time import sleep
from typing import Tuple, Optional
from urllib.parse import urlencode, quote_plus
import logging
import requests
import shelve
from ..common import progress_bar
from ..types import Document, Author, DocumentSet, DocumentIdentifier
def extract_id(item):
if item is None or not item.get("title"):
return None
return DocumentIdentifier(
item["title"],
doi=item.get("doi"),
arxivid=item.get("arxivId"),
s2id=item.get("paperId"),
)
def extract_ids(items):
if not items:
return None
return list(filter(None, map(extract_id, items)))
class ScholarAuthor(Author):
def __init__(self, entry):
self.entry = entry
@property
def name(self):
return self.entry.get("name")
@property
def orcid(self):
return None
class ScholarDocument(Document):
def __init__(self, entry):
super().__init__(extract_id(entry))
self.entry = entry
@property
def title(self) -> str:
return self.entry.get("title")
@property
def authors(self):
authors = self.entry.get("authors")
if not authors:
return None
return [ScholarAuthor(a) for a in authors if a]
@property
def publication_year(self):
return self.entry.get("year")
@property
def publication_source(self):
return self.entry.get("venue")
@property
def abstract(self):
return self.entry.get("abstract")
@property
def citations(self):
return extract_ids(self.entry.get("citations"))
@property
def citation_count(self):
return self.entry.get("numCitedBy")
@property
def references(self):
return extract_ids(self.entry.get("references"))
def __repr__(self):
return f"<{self.title}>"
@staticmethod
def load(id):
return fetch_semanticscholar(id)
S2_PAPER_URL = "https://api.semanticscholar.org/v1/paper/"
S2_QUERY_URL = "https://api.semanticscholar.org/graph/v1/paper/search"
CACHE_FILE = ".semantischolar"
DEFAULT_TIMEOUT = 3.05 # 100 requests per 5 minutes
def request_query(query, offset, limit, cache, session, timeout=DEFAULT_TIMEOUT):
params = urlencode(dict(query=query, offset=offset, limit=limit))
url = f"{S2_QUERY_URL}?{params}"
if url in cache:
return cache[url]
reply = session.get(url)
response = reply.json()
if "data" not in response:
msg = response.get("error") or response.get("message") or "unknown"
raise Exception(f"error while fetching {reply.url}: {msg}")
cache[url] = response
return response
def request_paper(key, cache, session, timeout=DEFAULT_TIMEOUT):
url = S2_PAPER_URL + quote_plus(key)
if url in cache:
return cache[url]
try:
sleep(timeout)
data = session.get(url).json()
except Exception as e:
logging.warning(f"failed to retrieve {key}: {e}")
return None
if "paperId" not in data:
msg = data.get("error") or data.get("message") or "unknown error"
logging.warning(f"failed to retrieve {key}: {msg}")
return None
cache[url] = data
return data
def fetch_semanticscholar(key: set, *, session=None) -> Optional[Document]:
"""Fetch SemanticScholar metadata for the given key. The key can be
one of the following (see `API reference
`_):
* DOI
* S2 paper ID
* ArXiv ID (example format: `arXiv:1705.10311`)
* MAG ID (example format: `MAG:112218234`)
* ACL ID (example format: `ACL:W12-3903`)
* PubMed ID (example format: `PMID:19872477`)
* Corpus ID (example format: `CorpusID:37220927`)
:param session: The `requests.Session` to use for HTTP requests.
:returns: The `Document` if it was found and `None` otherwise.
"""
if key is None:
return None
if session is None:
session = requests.Session()
with shelve.open(CACHE_FILE) as cache:
if isinstance(key, DocumentIdentifier):
data = None
if data is None and key.s2id:
data = request_paper(key.s2id, cache, session)
if data is None and key.doi:
data = request_paper(key.doi, cache, session)
if data is None and key.pubmed:
data = request_paper(f"PMID:{key.pubmed}", cache, session)
if data is None and key.arxivid:
data = request_paper(f"arXiv:{key.arxivid}", cache, session)
else:
data = request_paper(key, cache, session)
if data is None:
return None
return ScholarDocument(data)
def refine_semanticscholar(docs: DocumentSet, *, session=None) -> Tuple[DocumentSet, DocumentSet]:
"""Attempt to fetch SemanticScholar metadata for each document in the
given set based on their DOIs. Returns a tuple containing two sets: the
documents available on SemanticScholar and the remaining documents that
were not found or do not have a DOI.
:param session: The `requests.Session` to use for HTTP requests.
:returns: The documents available on SemanticScholar and the remaining documents.
"""
def callback(doc):
if isinstance(doc, ScholarDocument):
return doc
return fetch_semanticscholar(doc.id, session=session)
return docs._refine_docs(callback)
def search_semanticscholar(
query: str, *, limit: int = None, batch_size: int = 100, session=None
) -> DocumentSet:
"""Submit the given query to SemanticScholar API and return the results
as a `DocumentSet`. The query is a string containg keywords (see `API reference
`_).
:param query: The search query to submit.
:param limit: The maximum number of results to return.
:param batch_size: The number of results to retrieve per request. Must be at most 100.
:param session: The `requests.Session` to use for HTTP requests.
"""
if not query:
raise Exception("no query specified in `search_semanticscholar`")
if session is None:
session = requests.Session()
docs = []
with shelve.open(CACHE_FILE) as cache:
paper_ids = []
while True:
offset = len(paper_ids)
response = request_query(query, offset, batch_size, cache, session)
if not response:
break
records = response["data"]
total = response["total"]
for record in records:
paper_ids.append(record["paperId"])
# Check if we reached the total number of papers
if len(paper_ids) >= total:
break
# Check if we exceeded the user-defined limit
if limit is not None and len(paper_ids) >= limit:
paper_ids = paper_ids[:limit]
break
for paper_id in progress_bar(paper_ids):
doc = request_paper(paper_id, cache, session)
if doc:
docs.append(ScholarDocument(doc))
else:
logging.warn(f"could not find paper id {paper_id}")
return DocumentSet(docs)
================================================
FILE: litstudy/sources/springer.py
================================================
import csv
from ..types import Document, DocumentSet, DocumentIdentifier
from ..common import robust_open
class SpringerDocument(Document):
def __init__(self, entry):
doi = entry["Item DOI"] or None
title = entry["Item Title"]
super().__init__(DocumentIdentifier(title, doi=doi))
self.entry = entry
@property
def title(self) -> str:
return self.entry["Item Title"]
@property
def authors(self):
# While Springer does provide an authors field, all names are
# concatenated into one long string without seperators, making
# it impossible to seperate them. Too bad.
# authors = self.entry.get('Authors')
return None
@property
def publisher(self):
return "springer"
@property
def publication_year(self):
try:
return int(self.entry["Publication Year"])
except Exception:
return None
def load_springer_csv(path: str) -> DocumentSet:
"""Load CSV file exported from
`Springer Link `_.
"""
with robust_open(path) as f:
lines = csv.DictReader(f)
docs = [SpringerDocument(line) for line in lines]
return DocumentSet(docs)
================================================
FILE: litstudy/stats.py
================================================
from .common import FuzzyMatcher
from collections import defaultdict, OrderedDict
from .types import DocumentSet
import pandas as pd
def compute_histogram(docs, fun, keys=None, sort_by_key=False, groups=None, limit=None):
if isinstance(groups, list):
groups = dict((v, v) for v in groups)
if isinstance(groups, dict):
data = dict()
for name, value in groups.items():
if isinstance(value, str):
data[name] = docs.data.eval(value)
else:
values = list(value)
assert len(values) == len(docs)
data[name] = values
groups = pd.DataFrame(data)
elif groups is None:
groups = pd.DataFrame(index=range(len(docs)))
elif isinstance(groups, pd.DataFrame):
pass
assert len(groups) == len(docs)
totals = defaultdict(lambda: 0)
counts = defaultdict(lambda: 0)
for doc, row in zip(docs, groups.itertuples()):
for item in fun(doc):
if item is None:
continue
totals[item] += 1
for index, weight in enumerate(row[1:]):
if weight:
counts[item, index] += weight
if keys is None:
totals = pd.Series(totals)
totals = totals.sort_values(ascending=False)
if limit is not None:
totals = totals[:limit]
if sort_by_key:
totals = totals.sort_index()
else:
totals = OrderedDict((k, totals[k]) for k in keys)
totals = pd.Series(totals)
columns = groups.columns
if len(columns):
data = [[counts[item, index] for index in range(len(columns))] for item in totals.index]
else:
columns = ["Frequency"]
data = totals
return pd.DataFrame(
data,
index=totals.index,
columns=columns,
)
def compute_groups_histogram(docs: DocumentSet, **kwargs) -> pd.DataFrame:
return compute_histogram(docs, lambda _: ["Frequency"], **kwargs).T
def compute_year_histogram(docs: DocumentSet, **kwargs) -> pd.DataFrame:
"""Compute a histogram of the number of documents published in each
year."""
years = [doc.publication_year for doc in docs]
min_year = min(year for year in years if year)
max_year = max(year for year in years if year)
keys = list(range(min_year, max_year + 1))
def extract(doc):
yield doc.publication_year
return compute_histogram(docs, extract, keys=keys, **kwargs)
def compute_number_authors_histogram(docs: DocumentSet, max_authors=10, **kwargs) -> pd.DataFrame:
"""Compute a histogram of the number of authors per document.
:param max_authors: If a document has more than `max_author` authors, it
is it is listed as a special "max authors" category.
"""
keys = ["NA"] + list(range(1, max_authors + 1)) + [f">{max_authors}"]
def extract(doc):
n = len(doc.authors or [])
if n == 0:
yield "NA"
elif n > max_authors:
yield ">{max_authors}"
else:
yield n
return compute_histogram(docs, extract, keys=keys, **kwargs)
def compute_language_histogram(docs: DocumentSet, **kwargs) -> pd.DataFrame:
"""Compute a histogram of number of documents by language."""
def extract(doc):
if doc.language:
yield doc.language
return compute_histogram(docs, extract, **kwargs)
def default_mapper(mapper):
if mapper is None:
return FuzzyMatcher()
elif type(mapper) is dict:
return FuzzyMatcher(mapper)
else:
return mapper
def compute_source_histogram(docs: DocumentSet, mapper=None, **kwargs) -> pd.DataFrame:
"""Compute a histogram of number of documents by publication source."""
mapper = default_mapper(mapper)
def extract(doc):
source = doc.publication_source
yield mapper.get(source) if source else "(unknown)"
return compute_histogram(docs, extract, **kwargs)
def compute_source_type_histogram(docs: DocumentSet, **kwargs) -> pd.DataFrame:
"""Compute a histogram of number of documents by source type."""
def extract(doc):
yield doc.source_type or "(unknown)"
return compute_histogram(docs, extract, **kwargs)
def compute_author_histogram(docs: DocumentSet, **kwargs) -> pd.DataFrame:
"""Compute a histogram of number of documents by author name."""
def extract(doc):
for author in doc.authors or []:
yield author.name
return compute_histogram(docs, extract, **kwargs)
def compute_author_affiliation_histogram(docs: DocumentSet, **kwargs) -> pd.DataFrame:
"""Compute a histogram of number of documents by (author name,
affiliation name) combinations. This can help reduce conflicts where there
are many authors of the same name working for different affiliations."""
def extract(doc):
for author in doc.authors or []:
for affiliation in author.affiliations or []:
if author.name and affiliation.name:
yield f"{author.name}, {affiliation.name}"
return compute_histogram(docs, extract, **kwargs)
def compute_affiliation_histogram(docs: DocumentSet, mapper=None, **kwargs) -> pd.DataFrame:
"""Compute a histogram of number of documents by affiliation name."""
mapper = default_mapper(mapper)
def extract(doc):
result = set()
for author in doc.authors or []:
for aff in author.affiliations or []:
if aff.name:
result.add(mapper.get(aff.name))
return result
return compute_histogram(docs, extract, **kwargs)
def extract_country(aff):
from .continent import COUNTRY_TO_CONTINENT
# Sometimes affiliation has given country
country = aff.country
if country:
return country
# Sometimes the country is in the affiliation name
name = aff.name
if name:
for country in COUNTRY_TO_CONTINENT.keys():
if country in name:
return country
return None
def compute_country_histogram(docs: DocumentSet, **kwargs) -> pd.DataFrame:
"""Compute a histogram of number of documents by affiliation country."""
def extract(doc):
result = set()
for author in doc.authors or []:
for aff in author.affiliations or []:
country = extract_country(aff)
if country:
result.add(country)
return result
return compute_histogram(docs, extract, **kwargs)
def compute_continent_histogram(docs: DocumentSet, **kwargs) -> pd.DataFrame:
"""Compute a histogram of number of documents by affiliation
continent.
"""
from .continent import COUNTRY_TO_CONTINENT
def extract(doc):
result = set()
for author in doc.authors or []:
for aff in author.affiliations or []:
country = extract_country(aff)
if country:
country = country.strip().lower()
if country.startswith("the "):
country = country[4:]
continent = COUNTRY_TO_CONTINENT.get(country)
if continent:
result.add(continent)
else:
result.add("Other")
return result
return compute_histogram(docs, extract, **kwargs)
================================================
FILE: litstudy/stopwords.py
================================================
STOPWORDS = [
"'d",
"'ll",
"'m",
"'re",
"'s",
"'ve",
"a",
"about",
"above",
"achieve",
"acm",
"across",
"after",
"afterwards",
"again",
"against",
"ain",
"all",
"almost",
"alone",
"along",
"already",
"also",
"although",
"always",
"am",
"among",
"amongst",
"amoungst",
"amount",
"an",
"and",
"another",
"any",
"anyhow",
"anyone",
"anything",
"anyway",
"anywhere",
"appproach",
"approach",
"are",
"aren",
"aren't",
"around",
"as",
"at",
"available",
"back",
"based",
"be",
"became",
"because",
"become",
"becomes",
"becoming",
"been",
"before",
"beforehand",
"behind",
"being",
"below",
"beside",
"besides",
"between",
"beyond",
"bill",
"both",
"bottom",
"but",
"by",
"ca",
"call",
"can",
"cannot",
"cant",
"co",
"combination",
"computer",
"con",
"copyright",
"could",
"couldn",
"couldn't",
"couldnt",
"cry",
"current",
"d",
"de",
"describe",
"detail",
"did",
"didn",
"didn't",
"discuss",
"do",
"does",
"doesn",
"doesn't",
"doing",
"don",
"don't",
"done",
"down",
"due",
"during",
"each",
"eg",
"eight",
"either",
"eleven",
"else",
"elsewhere",
"empty",
"enough",
"etc",
"even",
"ever",
"every",
"everyone",
"everything",
"everywhere",
"except",
"few",
"fifteen",
"fifty",
"fill",
"find",
"fire",
"first",
"five",
"for",
"former",
"formerly",
"forty",
"found",
"four",
"from",
"front",
"full",
"further",
"get",
"give",
"go",
"had",
"hadn",
"hadn't",
"has",
"hasn",
"hasn't",
"hasnt",
"have",
"haven",
"haven't",
"having",
"he",
"hence",
"her",
"here",
"hereafter",
"hereby",
"herein",
"hereupon",
"hers",
"herself",
"high",
"him",
"himself",
"his",
"how",
"however",
"hpc",
"hundred",
"i",
"ie",
"ieee",
"if",
"impact",
"in",
"inc",
"increase",
"indeed",
"interest",
"into",
"is",
"isn",
"isn't",
"it",
"it's",
"its",
"itself",
"just",
"keep",
"key",
"kg",
"km",
"large",
"last",
"latter",
"latterly",
"least",
"less",
"ll",
"ltd",
"m",
"ma",
"made",
"make",
"many",
"may",
"me",
"meanwhile",
"method",
"might",
"mightn",
"mightn't",
"mill",
"mine",
"more",
"moreover",
"most",
"mostly",
"move",
"much",
"must",
"mustn",
"mustn't",
"my",
"myself",
"n't",
"name",
"namely",
"need",
"needn",
"needn't",
"neither",
"never",
"nevertheless",
"new",
"next",
"nine",
"no",
"nobody",
"none",
"noone",
"nor",
"not",
"nothing",
"now",
"nowhere",
"n‘t",
"n’t",
"o",
"of",
"off",
"often",
"on",
"once",
"one",
"only",
"onto",
"or",
"other",
"others",
"otherwise",
"our",
"ours",
"ourselves",
"out",
"over",
"own",
"paper",
"part",
"per",
"perhaps",
"please",
"present",
"propose",
"proposed",
"provide",
"put",
"quite",
"rather",
"re",
"real",
"really",
"regarding",
"results",
"s",
"same",
"say",
"see",
"seem",
"seemed",
"seeming",
"seems",
"serious",
"set",
"several",
"shan",
"shan't",
"she",
"she's",
"should",
"should've",
"shouldn",
"shouldn't",
"show",
"side",
"significant",
"since",
"sincere",
"six",
"sixty",
"size",
"so",
"some",
"somehow",
"someone",
"something",
"sometime",
"sometimes",
"somewhere",
"springer",
"still",
"such",
"system",
"t",
"take",
"ten",
"than",
"that",
"that'll",
"the",
"their",
"theirs",
"them",
"themselves",
"then",
"thence",
"there",
"thereafter",
"thereby",
"therefore",
"therein",
"thereupon",
"these",
"they",
"thick",
"thin",
"third",
"this",
"those",
"though",
"three",
"through",
"throughout",
"thru",
"thus",
"time",
"to",
"today",
"together",
"too",
"top",
"toward",
"towards",
"twelve",
"twenty",
"two",
"un",
"under",
"unless",
"until",
"up",
"upon",
"us",
"use",
"used",
"using",
"various",
"ve",
"verlag",
"very",
"via",
"was",
"wasn",
"wasn't",
"we",
"well",
"were",
"weren",
"weren't",
"what",
"whatever",
"when",
"whence",
"whenever",
"where",
"whereafter",
"whereas",
"whereby",
"wherein",
"whereupon",
"wherever",
"whether",
"which",
"while",
"whither",
"who",
"whoever",
"whole",
"whom",
"whose",
"why",
"will",
"with",
"within",
"without",
"won",
"won't",
"work",
"would",
"wouldn",
"wouldn't",
"y",
"yet",
"you",
"you'd",
"you'll",
"you're",
"you've",
"your",
"yours",
"yourself",
"yourselves",
"‘d",
"‘ll",
"‘m",
"‘re",
"‘s",
"‘ve",
"’d",
"’ll",
"’m",
"’re",
"’s",
"’ve",
]
================================================
FILE: litstudy/types.py
================================================
from abc import ABC, abstractmethod
from datetime import date
from typing import Optional, List
import numpy as np
import pandas as pd
import random
import re
from .common import fuzzy_match, canonical, progress_bar
class DocumentSet:
"""Represents a set of documents.
`DocumentSet` stores a list of `Document` objects. Optionally, a pandas
data frame can be provided which stores additional properties on the
documents.
All set operations are accepted by `DocumentSet` (union, intersection,
difference), allowing for new sets to be created from existing sets.
Note that a `DocumentSet` is immutable and its content cannot be changed.
Instead, most methods below return a new `DocumentSet` instead of
performing modifications in-place.
"""
def __init__(self, docs, data=None):
"""Construct a new `DocumentSet`.
:param docs: A list (or iterator) of `Document` objects.
:param data: Additional metadata associated with the documents. This
can be either a `pandas.DataFrame` or something which
is accepted by the pandas DataFrame constructor.
"""
docs = list(docs)
if data is None:
data = pd.DataFrame(index=range(len(docs)))
else:
data = pd.DataFrame(data)
assert len(data) == len(docs)
self.data = data
self.docs = docs
def _refine_docs(self, callback):
new_indices = []
new_docs = []
old_indices = []
old_docs = []
for i, doc in enumerate(progress_bar(self.docs)):
new_doc = callback(doc)
if new_doc is not None:
new_indices.append(i)
new_docs.append(new_doc)
else:
old_indices.append(i)
old_docs.append(doc)
new_data = self.data.iloc[new_indices]
old_data = self.data.iloc[old_indices]
# FIX: not forget to reset the index
new_data.reset_index(drop=True, inplace=True)
old_data.reset_index(drop=True, inplace=True)
return DocumentSet(new_docs, new_data), DocumentSet(old_docs, old_data)
def add_property(self, name: str, values) -> "DocumentSet":
"""Returns a new set which has an additional property added.
:param name: Name of the new property.
:param values: List of values. Should be the same length as the
number of documents in this set.
:returns: The new document set.
"""
data = self.data.copy(deep=False)
data[name] = values
return DocumentSet(self.docs, data)
def remove_property(self, name: str) -> "DocumentSet":
"""Returns a new set which has the given property removed.
:param name: Name of the property.
:returns: The new document set.
"""
data = self.data.copy(deep=False)
data.drop(name)
return DocumentSet(self.docs, data)
def filter_docs(self, predicate) -> "DocumentSet":
"""Returns a new set for which the provided predicate returned `True`.
:param predicate: A function `Document -> bool`.
:returns: The new document set.
"""
return self.filter(lambda doc, _: predicate(doc))
def filter(self, predicate) -> "DocumentSet":
"""Returns a new set for which the provided predicate returned `True`.
:param predicate: A function `Document, dict -> bool`. The provided
dict stores the properties of the document.
:returns: The new document set.
"""
indices = []
for doc, record in zip(self.docs, self.data.itertuples()):
if predicate(doc, record):
indices.append(record.Index)
return self.select(indices)
def select(self, indices) -> "DocumentSet":
"""Returns a new set which contains only the documents at the
provided indices.
:param indices: Any input accepted by `pandas.DataFrame.iloc` such
as a list of integer.
:returns: The new document set.
"""
data = self.data.iloc[indices]
docs = [self.docs[i] for i in data.index]
data = data.reset_index(drop=True)
return DocumentSet(docs, data)
def _intersect_indices(self, other):
haystack = [d.id for d in other]
left = []
right = []
for i, doc in enumerate(self):
needle = doc.id
for j, id in enumerate(haystack):
if id.matches(needle):
left.append(i)
right.append(j)
break
return left, right
def _zip_with(self, left, other, right):
assert len(left) == len(right)
data = dict()
for key, column in self.data.iloc[left].items():
column = column.copy().reset_index(drop=True)
data[key] = column
for key, column in other.data.iloc[right].items():
column = column.copy().reset_index(drop=True)
if key in data:
data[key] = np.maximum(data[key], column)
else:
data[key] = column
return pd.DataFrame(index=range(len(left)), data=data)
def intersect(self, other: "DocumentSet") -> "DocumentSet":
"""Returns a new set which contains the documents provided in
both `self` and `other`. This is also available as the `&` operator.
:returns: The new document set.
"""
if not self or not other:
return DocumentSet([])
left, right = DocumentSet._intersect_indices(self, other)
docs = [self.docs[i] for i in left] # Select docs from left?
data = DocumentSet._zip_with(self, left, other, right)
return DocumentSet(docs, data)
def difference(self, other: "DocumentSet") -> "DocumentSet":
"""Returns a new set which contains the documents provided in
`self` but not in `other`. This is also available as the `-` operator.
:returns: The new document set.
"""
if not other or not self:
return self
indices, _ = DocumentSet._intersect_indices(self, other)
return self.select(sorted(set(range(len(self))) - set(indices)))
def union(self, other: "DocumentSet") -> "DocumentSet":
"""Returns a new set which contains the documents provided in
either `self` and `other`. Duplicate documents in `other` that also
appear in `self` are discarded. This is also available as the `|`
operator.
:returns: The new document set.
"""
if not other:
return self
if not self:
return other
left, right = DocumentSet._intersect_indices(self, other)
if not left:
return DocumentSet.concat(self, other)
docs = [self.docs[i] for i in left] # Select docs from left?
data = DocumentSet._zip_with(self, left, other, right)
middle = DocumentSet(docs, data)
left = self.select(sorted(set(range(len(self))) - set(left)))
right = other.select(sorted(set(range(len(other))) - set(right)))
return DocumentSet.concat(middle, DocumentSet.concat(left, right))
def concat(self, other: "DocumentSet") -> "DocumentSet":
"""Returns a new set which does contain the documents provided in
either `self` and `other`. Duplicate documents are not removed, see
`union` instead. This is also available as the `+` operator.
:returns: The new document set.
"""
def default_val(dtype):
c = dtype.char
if c == "?":
return False
if c in "bBiu":
return 0
if c in "fc":
return float("nan")
if c in "SaU":
return ""
return None
if not self:
return other
if not other:
return self
left = self.data.copy()
right = other.data.copy()
for col in left:
if col not in right:
dtype = left[col].dtype
right[col] = np.array(default_val(dtype)).astype(dtype)
for col in right:
if col not in left:
dtype = right[col].dtype
left[col] = np.array(default_val(dtype)).astype(dtype)
data = pd.concat([left, right], ignore_index=True)
docs = self.docs + other.docs
return DocumentSet(docs, data)
def unique(self) -> "DocumentSet":
"""Returns a new set which has all duplicate documents removed.
:returns: The new document set.
"""
indices = []
for i, doc in enumerate(self.docs):
found = False
needle = doc.id
for other in self[:i]:
if other.id.matches(needle):
other._identifier = other._identifier.merge(needle)
found = True
break
if not found:
indices.append(i)
return self.select(indices)
def sample(self, n, seed=0) -> "DocumentSet":
"""Returns a new set which contains `n` randomly chosen documents
from `self`.
:returns: The new document set.
"""
if len(self) <= n:
return self
random.seed(seed)
indices = random.sample(len(self), n)
indices.sort()
return self.select(indices)
def itertuples(self):
"""Returns an iterator over `(Document, dict)` tuples, where the
`dict` contains the properties of this document.
"""
return zip(self.docs, self.data.itertuples())
def __or__(self, other):
"""Alias for `DocumentSet.union`"""
return self.union(other)
def __and__(self, other):
"""Alias for `DocumentSet.intersect`"""
return self.intersect(other)
def __add__(self, other):
"""Alias for `DocumentSet.concat`"""
return self.concat(other)
def __sub__(self, other):
"""Alias for `DocumentSet.difference`"""
return self.difference(other)
def __len__(self):
"""Returns the number of documents in this set"""
return len(self.docs)
def __getitem__(self, key):
"""Returns different things depending on the key type:
* `str`: The property named `key` is returned.
* `int`: The document at position `key` is returned.
* otherwise: The call is forwarded to `DocumentSet.select`.
"""
if isinstance(key, str):
return self.data[key]
elif np.issubdtype(type(key), np.integer): # any type of integer works
return self.docs[int(key)]
else:
return self.select(key)
def __iter__(self):
"""Returns an iterator over `Document` objects in this set."""
return iter(self.docs)
def __bool__(self):
return bool(len(self))
def __repr__(self):
return f"<{len(self)} documents>"
class DocumentIdentifier:
"""Represents an identifier for a document.
Uniquely identifing an scientific document is often difficult since a
single document might have multiple identifiers assigned to it (e.g., DOI,
PubMed ID, Scopus ID, SemanticScholar ID) and not all data sources might
provide all these identifiers. This class stores all possible identifiers
that a document has.
"""
def __init__(self, title, **attr):
# Remove keys where value is None
self._title = title
self._attr = dict((k, v) for k, v in attr.items() if v)
@property
def title(self) -> Optional[str]:
"""Returns the title."""
return self._title
@property
def doi(self) -> Optional[str]:
"""Returns the DOI (example: 10.1093/ajae/aaq063)."""
return self._attr.get("doi")
@property
def pubmed(self) -> Optional[str]:
"""Returns the PubMed ID."""
return self._attr.get("pubmed")
@property
def arxivid(self) -> Optional[str]:
"""Returns the arXiv ID."""
return self._attr.get("arxivid")
@property
def scopusid(self) -> Optional[str]:
"""Returns the Scopus ID."""
return self._attr.get("eid")
@property
def s2id(self) -> Optional[str]:
"""Returns the Semantic Scholar ID."""
return self._attr.get("s2id")
def matches(self, other: "DocumentIdentifier") -> bool:
"""Returns `True` iff these two identifiers are equivalent
Two documents are considered to be equivalent if all identifiers they
have in common are equal. For example, if both documents have a DOI
then these should be the same. If two documents have not a single
identifier in common, a fuzzy match based on the title is performed.
"""
n = 0
# Two identifiers match if all keys that they have in common are equal
for key in self._attr:
if key in other._attr:
if self._attr[key] != other._attr[key]:
return False
n += 1
if n > 0:
return True
# No identifiers in common
return fuzzy_match(self._title, other._title)
def merge(self, other) -> "DocumentIdentifier":
"""Returns a new `DocumentIdentifier` which adds the identifiers
`others` to `self`.
"""
attr = dict()
attr.update(other._attr)
attr.update(self._attr)
return DocumentIdentifier(self._title, **attr)
def __repr__(self):
return f"<{self._title}, {self._attr}>"
class Document(ABC):
"""Stores the metadata of a document.
This is an interface which provides several methods which can be
overridden by child classes. All methods can thus return `None`
in case that method is not overridden.
"""
def __init__(self, identifier: DocumentIdentifier):
self._identifier = identifier
@property
def id(self) -> DocumentIdentifier:
"""The `DocumentIdentifier` of this document."""
return self._identifier
@property
@abstractmethod
def title(self) -> str:
"""The title of this document."""
pass
@property
@abstractmethod
def authors(self) -> Optional[List["Author"]]:
"""The authors of this document."""
pass
@property
def affiliations(self) -> Optional[List["Affiliation"]]:
"""The affiliations associated with the authors of this document."""
authors = self.authors
if authors is None:
return None
items = dict()
for author in authors:
affiliations = author.affiliations
if affiliations:
for aff in affiliations:
if aff.name:
items[aff.name] = aff
return list(items.values())
@property
def publisher(self) -> Optional[str]:
"""The publisher of this document."""
return None
@property
def language(self) -> Optional[str]:
"""The language this document is written in."""
return None
@property
def publication_date(self) -> Optional[date]:
"""The data of publication."""
return None
@property
def publication_year(self) -> Optional[int]:
"""The year of publication."""
date = self.publication_date
if date is None:
return None
return date.year
@property
def publication_source(self) -> Optional[str]:
"""The name of the publication source (i.e., journal name,
conference name, etc.)
"""
return None
@property
def source_type(self) -> Optional[str]:
"""The type of publication source (i.e., journal, conference
proceedings, book, etc.)
"""
return None
@property
def keywords(self) -> Optional[List[str]]:
"""The keywords of this document. What exactly consistutes as
keywords depends on the data source (author keywords, generated
keywords, topic categories), but is should be a list of strings.
"""
return None
@property
def abstract(self) -> Optional[str]:
"""The abstract of this document."""
return None
@property
def citation_count(self) -> Optional[int]:
"""The number of citations that this document received."""
return None
@property
def references(self) -> Optional[List[DocumentIdentifier]]:
"""The list of other documents that are cited by this document."""
return None
@property
def citations(self) -> Optional[List[DocumentIdentifier]]:
"""The list of other documents that cite this document."""
return None
def mentions(self, term: str) -> bool:
"""Returns `True` if this document mentions the given term in the
title, abstract, or keywords.
"""
pattern = r"(^|\s)" + re.escape(term) + r"($|\s)"
flags = re.IGNORECASE
keywords = self.keywords or []
for text in [self.title, self.abstract] + keywords:
if text and re.search(pattern, text, flags=flags):
return True
return False
class Affiliation(ABC):
"""Represents the affiliation of an author"""
@property
@abstractmethod
def name(self) -> str:
"""Name of the affiliation"""
pass
@property
def city(self) -> Optional[str]:
"""City the affiliation is located in."""
pass
@property
def country(self) -> Optional[str]:
"""Country the affiliation is located in."""
pass
class Author(ABC):
"""Represents the author of a document."""
@property
@abstractmethod
def name(self) -> str:
"""The name of the author."""
pass
@property
def orcid(self) -> Optional[str]:
"""The ORCID of the author."""
return None
@property
def s2id(self) -> Optional[str]:
"""The SemanticScholar ID of the author."""
return None
@property
def affiliations(self) -> "Optional[list[Affiliation]]":
"""The affiliations this author is associated with."""
return None
class DocumentMapping:
def __init__(self, docs=None):
self.title = dict()
self.doi = dict()
self.eid = dict()
if docs:
for index, doc in enumerate(docs):
self.add(doc.id, index)
def add(self, doc: DocumentIdentifier, value):
if doc.scopusid:
self.eid[doc.scopusid] = value
if doc.doi:
self.doi[doc.doi] = value
if doc.title:
self.title[canonical(doc.title)] = value
def get(self, doc: DocumentIdentifier):
result = None
if result is None and doc.scopusid:
result = self.eid.get(doc.scopusid)
if result is None and doc.doi:
result = self.doi.get(doc.doi)
if result is None and doc.title:
result = self.title.get(canonical(doc.title))
return result
================================================
FILE: notebooks/citation.html
================================================
0%
================================================
FILE: notebooks/data/exclude.ris
================================================
TY - CONF
TI - Integral image computation on GPU
T2 - 10th International Multi-Conferences on Systems, Signals & Devices 2013 (SSD13)
SP - 1
EP - 4
AU - M. Chouchene
AU - F. E. Sayadi
AU - M. Atri
AU - R. Tourki
PY - 2013
DO - 10.1109/SSD.2013.6564007
JO - 10th International Multi-Conferences on Systems, Signals & Devices 2013 (SSD13)
IS -
SN -
VO -
VL -
JA - 10th International Multi-Conferences on Systems, Signals & Devices 2013 (SSD13)
Y1 - 18-21 March 2013
ER -
================================================
FILE: notebooks/data/ieee_1.csv
================================================
"Document Title",Authors,"Author Affiliations","Publication Title",Date Added To Xplore,"Publication Year","Volume","Issue","Start Page","End Page","Abstract","ISSN",ISBNs,"DOI",Funding Information,PDF Link,"Author Keywords","IEEE Terms","INSPEC Controlled Terms","INSPEC Non-Controlled Terms","Mesh_Terms",Article Citation Count,Patent Citation Count,"Reference Count","License",Online Date,Issue Date,"Meeting Date","Publisher",Document Identifier
"Exploring a multi-resolution GPU programming model for Chapel","A. Hayashi; S. Raj Paul; V. Sarkar","Georgia Institute of Technology Atlanta,Georgia,USA; Georgia Institute of Technology Atlanta,Georgia,USA; Georgia Institute of Technology Atlanta,Georgia,USA","2020 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","28 Jul 2020","2020","","","675","675","There is a growing need to support accelerators, especially GPU accelerators, since they are a common source of performance improvement in HPC clusters. As for GPU programming with Chapel, typically programmers first start with writing forall loops and run these loops on CPUs as a proof-of-concept. If the resulting CPU performance is not sufficient for their needs, their next step could be to try the automatic compiler-based GPU code generation techniques [1], [2]. For portions that remain as performance bottlenecks, even after automatic compilation approaches, the next step is to consider writing GPU kernels using CUDA/HIP/OpenCL and invoking these kernels from the Chapel program using the GPUIterator [3], [4] and Chapel's C interoperability feature.","","978-1-7281-7445-7","10.1109/IPDPSW50202.2020.00117","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9150427","","Graphics processing units;Programming;Kernel;Data transfer;Optimization;Conferences;Writing","parallel architectures;parallel programming;program compilers;public domain software","automatic compilation;GPU kernels;Chapel program;multiresolution GPU programming model;GPU accelerators;HPC clusters;forall loops;Chapel C interoperability feature;automatic compiler-based GPU code generation;CUDA;OpenCL;HIP","","","","6","","28 Jul 2020","","","IEEE","IEEE Conferences"
"GPU Assist using DSP Pre-processor","M. Mody; H. Hariyani; A. Balagopalakrishnan; J. Jones; A. Jayaraj; Y. A. Prithvishankar","Texas Instruments Inc,Embedded Automotive Processor Business; Texas Instruments Inc,Embedded Automotive Processor Business; Texas Instruments Inc,Embedded Automotive Processor Business; Texas Instruments Inc,Embedded Automotive Processor Business; Texas Instruments Inc,Embedded Automotive Processor Business; Texas Instruments Inc,Embedded Automotive Processor Business","2020 IEEE International Conference on Electronics, Computing and Communication Technologies (CONECCT)","16 Sep 2020","2020","","","1","4","There is an ever increasing need for higher GPU performance to render sophisticated User Interface, latest high end 3D games and general purpose compute (GPGPU) applications. GPU SW programming models such as OpenGL have evolved over decades to cater to the unique mixed pipeline 3D GPU architectures. Due to the sticky nature of GPU SW programming model, leveraging other HW blocks to enhance graphics performance has been a most challenging task for SW architects. System designers have usually responded to the GFLOPS demand by increasing the GPU HW specifications. This paper proposes enhancing GPU performance by leveraging DSP transparently in background without impacting GPU software programming model. The proposed solution consists of multiple novel techniques namely ability to offload vertex shader to DSP, 3 stage pipelined execution and ability to re-use GPU internal pipeline. The proposed solution is prototyped in Jacinoto6 Platform from Texas Instruments. The default GPU spec performance is increased by up-to 41% by leveraging dual core C66x DSP in Jacinto6 Platform using proposed solution for different use-cases. The proposed solution is fully transparent to application software stack. In addition, the solution is directly applicable to any GPU + DSP architecture making it attractive approach for cost optimized solutions.","","978-1-7281-6828-9","10.1109/CONECCT50063.2020.9198650","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9198650","GPU;GPGPU;GLOPS;Shader;OpenGL;Vulkan DSP;Jacinto","Graphics processing units;Pipeline processing;Pipelines;Programming;Random access memory;Context","digital signal processing chips;graphics processing units;pipeline processing","3D games;general purpose compute applications;GPU SW programming model;graphics performance;GPU HW specifications;GPU software programming model;3 stage pipelined execution;default GPU spec performance;DSP architecture;GPU performance;user interface;GPU internal pipeline;3D GPU architectures;DSP preprocessor;OpenGL;GFLOPS;vertex shader;Jacinoto6 platform;dual core C66x DSP;Jacinto6 platform","","1","","8","","16 Sep 2020","","","IEEE","IEEE Conferences"
"GPU Computing Pipeline Inefficiencies and Optimization Opportunities in Heterogeneous CPU-GPU Processors","J. Hestness; S. W. Keckler; D. A. Wood",NA; NA; NA,"2015 IEEE International Symposium on Workload Characterization","2 Nov 2015","2015","","","87","97","Emerging heterogeneous CPU-GPU processors have introduced unified memory spaces and cache coherence. CPU and GPU cores will be able to concurrently access the same memories, eliminating memory copy overheads and potentially changing the application-level optimization targets. To date, little is known about how developers may organize new applications to leverage the available, finer-grained communication in these processors. However, understanding potential application optimizations and adaptations is critical for directing heterogeneous processor programming model and architectural development. This paper quantifies opportunities for applications and architectures to evolve to leverage the new capabilities of heterogeneous processors. To identify these opportunities, we ported and simulated a broad set of benchmarks originally developed for discrete GPUs to remove memory copies, and applied analytical models to quantify their application-level pipeline inefficiencies. For existing benchmarks, GPU bulk-synchronous software pipelines result in considerable core and cache utilization inefficiency. For heterogeneous processors, the results indicate increased opportunity for techniques that provide flexible compute and data granularities, and support for efficient producer-consumer data handling and synchronization within caches.","","978-1-5090-0088-3","10.1109/IISWC.2015.15","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7314150","GPGPU;GPU computing;heterogeneous processors;benchmarking","Graphics processing units;Benchmark testing;Kernel;Optimization;Pipelines;Synchronization","graphics processing units;memory architecture;optimisation;pipeline processing","GPU computing pipeline inefficiency;optimization opportunity;heterogeneous CPU-GPU processor;unified memory space;cache coherence;CPU core;GPU core;memory copy overhead;application-level optimization;finer-grained communication;heterogeneous processor programming model;architectural development;application-level pipeline inefficiency;GPU bulk-synchronous software pipeline","","19","2","38","","2 Nov 2015","","","IEEE","IEEE Conferences"
"Poster: Acceleration of the BLAST Hydro Code on GPU","T. Dong; T. Kolev; R. Rieben; V. Dobrev","Center for Appl. Sci. Comput., Lawrence Livermore Nat. Lab., Livermore, USA; Center for Appl. Sci. Comput., Lawrence Livermore Nat. Lab., Livermore, USA; Lawrence Livermore Nat. Lab., Livermore, USA; Center for Appl. Sci. Comput., Lawrence Livermore Nat. Lab., Livermore, USA","2012 SC Companion: High Performance Computing, Networking Storage and Analysis","11 Apr 2013","2012","","","1337","1337","The BLAST code implements a high-order numerical algorithm that solves the equations of compressible hydrodynamics using the Finite Element Method in a moving Lagrangian frame. BLAST is coded in C++ and parallelized by MPI. We accelerate the most computationally intensive parts (80%-95%) of BLAST on an NVIDIA GPU with the CUDA programming model. Several 2D and 3D problems were tested and a maximum speedup of 4.3x was delivered. Our results demonstrate the validity and capability of GPU computing.","","978-0-7695-4956-9","10.1109/SC.Companion.2012.172","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6495955","GPU;CFD;FEM","","application program interfaces;C++ language;compressible flow;computational fluid dynamics;finite element analysis;graphics processing units;hydrodynamics;message passing;parallel programming","GPU computing;NVIDIA GPU;compute unified device architecture;CUDA programming model;parallelization;message passing interface;MPI;C++ language;moving Lagrangian frame;finite element method;compressible hydrodynamics;high-order numerical algorithm;graphics processing unit;BLAST hydro code","","","","","","11 Apr 2013","","","IEEE","IEEE Conferences"
"Accelerating Kirchhoff Migration on GPU Using Directives","R. Xu; M. Hugues; H. Calandra; S. Chandrasekaran; B. Chapman","Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; TOTAL E&P Res. & Technol. USA, Houston, TX, USA; TOTAL E&P Res. & Technol. USA, Houston, TX, USA; Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA","2014 First Workshop on Accelerator Programming using Directives","9 Apr 2015","2014","","","37","46","Accelerators offer the potential to significantly improve the performance of scientific applications when offloading compute intensive portions of programs to the accelerators. However, effectively tapping their full potential is difficult owing to the programmability challenges faced by the users when mapping computation algorithms to the massively parallel architectures such as GPUs.Directive-based programming models offer programmers an option to rapidly create prototype applications by annotating region of code for offloading with hints to the compiler. This is critical to improve the productivity in the production code. In this paper, we study the effectiveness of a high-level directivebased programming model, OpenACC, for parallelizing a seismic migration application called Kirchhoff Migration on GPU architecture. Kirchhoff Migration is a real-world production code in the Oil & Gas industry. Because of its compute intensive property, we focus on the computation part and explore different mechanisms to effectively harness GPU's computation capabilities and memory hierarchy. We also analyze different loop transformation techniques in different OpenACC compilers and compare their performance differences. Compared toone socket (10 CPU cores) on the experimental platform, one GPU achieved a maximum speedup of 20.54x and 6.72x for interpolation and extrapolation kernel functions.","","978-1-4673-6753-0","10.1109/WACCPD.2014.8","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7081676","OpenACC; Kirchhoff Migration; GPU; Directives; Programming Model","Graphics processing units;Interpolation;Kernel;Programming;Extrapolation;Computer architecture;Computational modeling","extrapolation;geophysics computing;graphics processing units;interpolation;parallel architectures;program compilers;seismology","Kirchhoff migration;accelerator;compute intensive portion;programmability challenges;computation algorithm;parallel architecture;directive-based programming model;productivity;high-level directive based programming model;seismic migration application;GPU architecture;real-world production code;oil & gas industry;compute intensive property;GPU computation capability;memory hierarchy;loop transformation technique;OpenACC compiler;interpolation kernel function;extrapolation kernel function","","5","","18","","9 Apr 2015","","","IEEE","IEEE Conferences"
"GPU parallel computing architecture and CUDA programming model","J. Nickolls",NA,"2007 IEEE Hot Chips 19 Symposium (HCS)","4 Jul 2016","2007","","","1","12","This article consists of a collection of slides from the author's conference presentation on NVIDIA's CUDA programming model (parallel computing platform and application programming interface) via graphical processing units (GPU). Some of the specific topics discussed include: the special features of GPUs; the importance of GPU computing; system specifications and architectures; processing capabilities; parallel memory sharing; CUDA programming models; transparent scalability; and major applications supported.","","978-1-4673-8869-6","10.1109/HOTCHIPS.2007.7482491","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7482491","","Instruction sets;Graphics processing units;Parallel processing;Computer architecture;Programming;Computational modeling","application program interfaces;graphics processing units;parallel architectures","GPU parallel computing architecture;NVIDIA CUDA programming models;parallel computing platform;application programming interface;graphical processing units;parallel memory sharing;transparent scalability","","14","1","","","4 Jul 2016","","","IEEE","IEEE Conferences"
"Kernel Fusion/Decomposition for Automatic GPU-Offloading","A. Mishra; M. Kong; B. Chapman","Stony Brook University, USA; Brookhaven National Laboratory, USA; Stony Brook University, USA","2019 IEEE/ACM International Symposium on Code Generation and Optimization (CGO)","7 Mar 2019","2019","","","283","284","The massively parallel architecture of GPU accelerators are being harnessed to expedite computational workloads in cutting edge scientific research. Unfortunately writing applications for GPUs requires extensive knowledge of the underlying architecture, the application and the interfacing programming model. Moreover, (re-)writing kernels using lower-level programming models such as CUDA and OpenCL is a burden for application scientists. A more appealing strategy is to leverage a programming model layered on directive-based optimization: OpenMP, whose recent specification significantly extends its accelerator functionalities. Despite this, it is still quite challenging to optimize large scale applications, since “pragmatizing” each kernel is a repetitive and complex task. In large scale applications most of the operations could be small, don't have enough computational work to justify a GPU execution, deeply buried in the library specification, or evenly spread throughout the application. Thus, we seek to design and build a compiler framework that can automatically and profitably offload regions of code with these characteristics. The driving principle of our work resides in generating numerous kernel variants that result from fusing and/or decomposing existing function bodies. We analyze the program's call graph to determine the “proximity” of kernel calls and evaluate the degree of data reuse among adjacent or “close-enough” calls. When such patterns are detected we generate several scenarios, until producing a single variant whose footprint is near the capacity of the GPU. To compare the potential performance among the various kernel variants generated, we are designing an adaptive cost model. The precision of this cost model will depend upon the analyzability of the program. We are also building upon existing cost models like Baghsorkhi et al.'s model which proposed a work flow graph based analytical model and a recent Hong et al.'s model which propose the use of abstract kernel emulations to help identify the performance bottlenecks of a GPU program execution. Along with these we introduce GPU initialization and data transfer cost to the model. Once the profitable kernel variants are detected, we automatically insert pertinent OpenMP directives and provide a newly generated code supporting GPU offloading.","","978-1-7281-1436-1","10.1109/CGO.2019.8661188","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8661188","","Kernel;Graphics processing units;Adaptation models;Computational modeling;Analytical models;Programming;Libraries","application program interfaces;coprocessors;graphics processing units;message passing;optimisation;parallel architectures;parallel programming;program compilers","lower-level programming models;application scientists;directive-based optimization;accelerator functionalities;repetitive task;complex task;GPU execution;library specification;kernel calls;adaptive cost model;work flow graph;abstract kernel emulations;GPU program execution;data transfer cost;profitable kernel variants;pertinent OpenMP directives;kernel fusion/decomposition;automatic GPU-offloading;massively parallel architecture;GPU accelerators;computational workloads;edge scientific research;interfacing programming model;writing kernels;generated code;automatic GPU offloading","","3","","8","","7 Mar 2019","","","IEEE","IEEE Conferences"
"Research on Tool Path Planning Method of NURBS Surface Based on CPU-GPU Parallel Computing","W. Yu; Y. Bi; Z. Li","Sch. of Autom., Hangzhou Univ. of Electron. Sci. & Technol., Hangzhou, China; Sch. of Autom., Hangzhou Univ. of Electron. Sci. & Technol., Hangzhou, China; Sch. of Autom., Hangzhou Univ. of Electron. Sci. & Technol., Hangzhou, China","2017 International Conference on Computer Network, Electronic and Automation (ICCNEA)","7 Dec 2017","2017","","","85","88","In order to deal with the inefficiency of trational serial tool path algorithms and incompatibility issues on the heterogeneous hardware platforms, this paper suggests a tool path planning method based on CPU-GPU(Central Processing Unit-Graphic Processing Unit) heterogeneous parallel computing. The method contra poses NURBS(Non-Uniform Rational B-Splines) surface which is abstracted as a matrix multiplication on the principle of isoparametric line tool path planning method. Then a parallel algorithm in accordance with Open CL(Open Computing Language) specification is proposed. Adopting data parallel programming model, the method executes multiple work-items of the GPU on the core under control of the CPU logic, and reconstructs the isoparametric line method as parallel execution instead of traditional serial execution. Simulation results show that this algorithm takes less time to generate tool paths on the CPU-GPU heterogeneous platforms, reduced by 1.5 to 15.9 times compared with traditional serial algorithm and it is of great significance to the tool path planning's real-time or quasi real-time generation.","","978-1-5386-3981-8","10.1109/ICCNEA.2017.52","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8128535","Component;Nurbs surfaces;OpenCL;Parallel computing;Tool path planning;CPU-GPU","Tools;Graphics processing units;Path planning;Parallel processing;Splines (mathematics);Surface topography;Surface reconstruction","graphics processing units;parallel programming;path planning;splines (mathematics)","CPU logic;CPU-GPU heterogeneous platforms;traditional serial algorithm;Nurbs surface;CPU-GPU parallel computing;heterogeneous hardware platforms;parallel algorithm;serial tool path algorithms;Central Processing Unit-Graphic Processing Unit;NonUniform Rational B-Splines surface;isoparametric line tool path planning;Open CL;Open Computing Language;data parallel programming model","","1","","11","","7 Dec 2017","","","IEEE","IEEE Conferences"
"GPU programming for EDA with OpenCL","R. O. Topaloglu; B. Gaster","GLOBALFOUNDRIES, 840 N McCarthy Blvd, Milpitas CA 95035; Advanced Micro Devices, 1 AMD Pl, Sunnyvale CA 94085","2011 IEEE/ACM International Conference on Computer-Aided Design (ICCAD)","15 Dec 2011","2011","","","63","66","Graphical processing unit (GPU) computing has been an interesting area of research in the last few years. While initial adapters of the technology have been from image processing domain due to difficulties in programming the GPUs, research on programming languages made it possible for people without the knowledge of low-level programming languages such as OpenGL develop code on GPUs. Two main GPU architectures from AMD (former ATI) and NVIDIA acquired grounds. AMD adapted Stanford's Brook language and made it into an architecture-agnostic programming model. NVIDIA, on the other hand, brought CUDA framework to a wide audience. While the two languages have their pros and cons, such as Brook not being able to scale as well and CUDA having to account for architectural-level decisions, it has not been possible to compile one code on another architecture or across platforms. Another opportunity came with the introduction of the idea of combining one or more CPUs and GPUs on the same die. Eliminating some of the interconnection bandwidth issues, this combination makes it possible to offload tasks with high parallelism to the GPU. The technological direction towards multicores for CPU-only architectures also require a programming methodology change and act as a catalyst for suitable programming languages. Hence, a unified language that can be used both on multiple core CPUs as well as GPUs and their combinations has gained interest. Open Computing Language (OpenCL), developed originally by the Khronos Group of Apple and supported by both AMD and NVIDIA, is seen as the programming language of choice for parallel programming. In this paper, we provide a motivation for our tutorial talk on usage of OpenCL for GPUs and highlight key features of the language. We provide research directions on OpenCL for EDA. In our tutorial talk, we use EDA as our application domain to get the readers started with programming the rising language of parallelism, OpenCL.","1558-2434","978-1-4577-1400-9","10.1109/ICCAD.2011.6105306","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6105306","GPU;GPGPU;OpenCL;EDA;CAD;algorithms","Graphics processing unit;Programming;Kernel;Multicore processing;Design automation;Algorithm design and analysis","graphics processing units;parallel programming;programming languages","GPU programming;EDA;OpenCL;graphical processing unit computing;image processing domain;research on programming language;low-level programming languages;OpenGL;GPU architecture;AMD;NVIDIA;Stanford Brook language;architecture-agnostic programming model;CUDA framework;architectural-level decisions;unified language;open computing language;parallel programming","","1","","17","","15 Dec 2011","","","IEEE","IEEE Conferences"
"Reflection removal using ghosting cues based on GPU via CUDA","M. Liao; C. Lv; G. Li; J. Lin; X. Gao","Software School, Xiamen University, Xiamen, Fujian, P.R. China; Software School, Xiamen University, Xiamen, Fujian, P.R. China; Software School, Xiamen University, Xiamen, Fujian, P.R. China; Software School, Xiamen University, Xiamen, Fujian, P.R. China; Software School, Xiamen University, Xiamen, Fujian, P.R. China","2016 11th International Conference on Computer Science & Education (ICCSE)","6 Oct 2016","2016","","","814","817","Reflections of windows or glass panes always destroy the photograph that we want to take by camera or phone. The purpose of this paper is to study and put forward a reflection removal algorithm based on GPU. The algorithm is not simply transplanted from CPU onto GPU. In order to make it adapted to the GPU architecture and programming model, we improve on the original method and the improved algorithm is more efficient by using GPU resources sufficiently. Experimental results show that the algorithm of this paper is effective and efficient. The GPU-based implementation is faster (up to 18 times) than the CPU-based implementation.","","978-1-5090-2218-2","10.1109/ICCSE.2016.7581687","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7581687","reflection removal;parallel computation;GPU;CUDA","Reflection;Graphics processing units;Algorithm design and analysis;Windows;Glass;Parallel processing","graphics processing units;image restoration;parallel architectures;reflection","reflection removal algorithm;ghosting cues;GPU architecture;CUDA;window reflections;glass pane reflections;photographs;programming model;image restoration","","1","","22","","6 Oct 2016","","","IEEE","IEEE Conferences"
"Hybrid Parallel Programming on GPU Clusters","C. Yang; C. Huang; C. Lin; T. Chang","Dept. of Comput. Sci., Tunghai Univ., Taichung, Taiwan; Dept. of Comput. Sci., Tunghai Univ., Taichung, Taiwan; Dept. of Comput. Sci., Tunghai Univ., Taichung, Taiwan; Dept. of Comput. Sci., Tunghai Univ., Taichung, Taiwan","International Symposium on Parallel and Distributed Processing with Applications","11 Nov 2010","2010","","","142","147","Nowadays, NVIDIA's CUDA is a general purpose scalable parallel programming model for writing highly parallel applications. It provides several key abstractions - a hierarchy of thread blocks, shared memory, and barrier synchronization. This model has proven quite successful at programming multithreaded many core GPUs and scales transparently to hundreds of cores: scientists throughout industry and academia are already using CUDA to achieve dramatic speedups on production and research codes. In this paper, we propose a hybrid parallel programming approach using hybrid CUDA and MPI programming, which partition loop iterations according to the number of C1060 GPU nodes in a GPU cluster which consists of one C1060 and one S1070. Loop iterations assigned to one MPI process are processed in parallel by CUDA run by the processor cores in the same computational node.","2158-9208","978-1-4244-8095-1","10.1109/ISPA.2010.97","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5634329","CUDA;GPU;MPI;OpenMP;hybrid;parallel programming","Graphics processing unit;Instruction sets;Parallel processing;Parallel programming;Computational modeling;Linux","computer graphic equipment;coprocessors;message passing;parallel programming","hybrid parallel programming;NVIDIA CUDA programming model;graphics processing units;multithreaded programming;message passing interface;loop iterations;C1060 GPU cluster;S1070 GPU cluster","","4","","18","","11 Nov 2010","","","IEEE","IEEE Conferences"
"GPU-accelerated parallel algorithms for map algebra","Jianbo Zhang; Wenxin Yang; Jing Sun; Yonghong Lv","Department of Software Engineering, Faculty of Information Engineering, China University of Geoscience, Wuhan, China; Department of Software Engineering, Faculty of Information Engineering, China University of Geoscience, Wuhan, China; Department of Software Engineering, Faculty of Information Engineering, China University of Geoscience, Wuhan, China; Department of Software Engineering, Faculty of Information Engineering, China University of Geoscience, Wuhan, China","2010 The 2nd Conference on Environmental Science and Information Application Technology","9 Sep 2010","2010","1","","882","885","Aiming at the low efficiency when traditional realization methods of map algebra apply to calculations for gigantic raster data, this paper maps the traditional serial algorithms to GPU parallel processing architecture on a new parallel programming model of GPU named Compute Unified Device Architecture. The paper also aims to discuss the realization mechanism surrounding parallel mapping methods from traditional serial algorithms to parallel algorithms and adaptive-parameter adjustments on computer graphic processor resources.","","978-1-4244-7390-8","10.1109/ESIAT.2010.5567202","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5567202","Map Algebra;GPU;CUDA;Parallel Computation","Graphics processing unit;Algebra;Instruction sets;Computer architecture;Computational modeling;Hardware;Parallel processing","geographic information systems;mathematics computing;parallel algorithms;parallel architectures;parallel programming","GPU-accelerated parallel algorithms;map algebra;serial algorithms;GPU parallel processing architecture;parallel programming model;Compute Unified Device Architecture;adaptive-parameter adjustments;computer graphic processor","","2","","10","","9 Sep 2010","","","IEEE","IEEE Conferences"
"Abstract: GPU Accelerated Ultrasonic Tomography Using Propagation and Backpropagation Method","P. D. Bello; Y. Jin; E. Lu","Dept. of Electr. & Comput. Eng., Florida Int. Univ., Miami, FL, USA; Dept. of Eng. & Aviation Sci., Univ. of Maryland Eastern Shore, Princess Anne, MD, USA; Dept. of Math. & Comput. Sci., Salisbury Univ., Salisbury, MD, USA","2012 SC Companion: High Performance Computing, Networking Storage and Analysis","11 Apr 2013","2012","","","1445","1446","This paper develops implementation strategy and method to accelerate the propagation and backpropagation (PBP) tomographic imaging algorithm using Graphic Processing Units (GPUs). The Compute Unified Device Architecture (CUDA) programming model is used to develop our parallelized algorithm since the CUDA model allows the user to interact with the GPU resources more efficiently than traditional shader methods. The results show an improvement of more than 80x when compared to the C/C++ version of the algorithm, and 515x when compared to the MATLAB version while achieving high quality imaging for both cases. We test different CUDA kernel configurations in order to measure changes in the processing-time of our algorithm. By examining the acceleration rate and the image quality, we develop an optimal kernel configuration that maximizes the throughput of CUDA implementation for the PBP method.","","978-0-7695-4956-9","10.1109/SC.Companion.2012.248","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6496031","Medical Imaging;Ultrasonic Tomography;GPU;CUDA;Parallel Computing","","acoustic tomography;backpropagation;computerised tomography;graphics processing units;medical image processing;parallel algorithms;parallel architectures;ultrasonic imaging","parallel computing;medical imaging;PBP method;optimal kernel configuration;image quality;acceleration rate;CUDA kernel configuration;MATLAB version;shader method;GPU resource;parallelized algorithm;CUDA programming model;compute unified device architecture;graphic processing unit;PBP tomographic imaging algorithm;propagation and backpropagation tomographic imaging algorithm;GPU accelerated ultrasonic tomography","","","","5","","11 Apr 2013","","","IEEE","IEEE Conferences"
"Extending OpenSHMEM for GPU Computing","S. Potluri; D. Bureddy; H. Wang; H. Subramoni; D. K. Panda","Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA","2013 IEEE 27th International Symposium on Parallel and Distributed Processing","29 Jul 2013","2013","","","1001","1012","Graphics Processing Units (GPUs) are becoming an integral part of modern supercomputer architectures due to their high compute density and performance per watt. In order to maximize utilization, it is imperative that applications running on these clusters have low synchronization and communication overheads. Partitioned Global Address Space (PGAS) models provide an attractive approach for developing parallel scientific applications. Such models simplify programming through the abstraction of a shared memory address space while their one-sided communication primitives allow for efficient implementation of applications with minimum synchronization. OpenSHMEM is a library-based programming model that is gaining popularity. However, the current OpenSHMEM standard does not support direct communication from GPU device buffers. It requires data to be copied to the host memory before OpenSHMEM calls can be made. Similarly, data has to moved to the GPU explicitly by remote processes. This severely limits the programmability and performance of GPU applications. In this paper we provide extensions to the OpenSHMEM model which allow communication calls to be made directly on the GPU memory. The proposed extensions are interoperable with the two most popular GPU programming frameworks: CUDA and OpenCL. We present designs for an efficient OpenSHMEM runtime which transparently provide high-performance communication between GPUs in different inter-node and intra-node configurations. To the best of our knowledge this is the first work that enables GPU-GPU communication using the OpenSHMEM model for both CUDA and OpenCL computing frameworks. The proposed extensions to OpenSHMEM, coupled with the high-performance runtime, improve the latency of GPU-GPU shmem getmem operation by 90%, 40% and 17%, for intra-IOH (I/O Hub), inter-IOH and inter-node configurations. It improves the performance of OpenSHMEM atomics by up to 55% and 52%, for intra-IOH and inter-node GPU configurations respectively. The proposed enhancements improve the performance of Stencil2D kernel by 65% on a cluster of 192 GPUs and the performance of BFS kernel by 12% on a cluster of 96 GPUs.","1530-2075","978-1-4673-6066-1","10.1109/IPDPS.2013.104","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6569880","PGAS;OpenSHMEM;GPU;CUDA;OpenCL","Graphics processing units;Runtime;Context;Computational modeling;Electronics packaging;Programming;Kernel","graphics processing units;parallel architectures;parallel machines;shared memory systems","OpenSHMEM runtime;high-performance communication;inter-node configurations;intra-node configurations;OpenCL computing frameworks;high-performance runtime;GPU-GPU shmem getmem operation;intra-IOH;I/O hub;OpenSHMEM atomics;GPU computing;graphics processing units;modern supercomputer architectures;high compute density;performance per watt;communication overheads;partitioned global address space models;PGAS models;parallel scientific applications;abstraction;shared memory address space;one-sided communication primitives;minimum synchronization;library-based programming model;direct communication;GPU device buffers;host memory;programmability;OpenSHMEM model;GPU memory;interoperable;GPU programming frameworks;CUDA;OpenCL;Stencil2D kernel","","21","","32","","29 Jul 2013","","","IEEE","IEEE Conferences"
"Tartan: Evaluating Modern GPU Interconnect via a Multi-GPU Benchmark Suite","A. Li; S. L. Song; J. Chen; X. Liu; N. Tallent; K. Barker",Pacific Northwest National Laboratory; Pacific Northwest National Laboratory; Pacific Northwest National Laboratory; Pacific Northwest National Laboratory; Pacific Northwest National Laboratory; Pacific Northwest National Laboratory,"2018 IEEE International Symposium on Workload Characterization (IISWC)","13 Dec 2018","2018","","","191","202","High performance multi-GPU computing becomes an inevitable trend due to the ever-increasing demand on computation capability in emerging domains such as deep learning, big data and planet-scale applications. However, the lack of deep understanding on how modern GPUs can be connected and the actual impact of state-of-the-art interconnect on multiGPU application performance becomes a hurdle. Additionally, the absence of a practical multi-GPU benchmark suite poses further obstacles for conducting research in multi-GPU era. In this paper, we fill the gap by proposing a multi-GPU benchmark suite named Tartan, which contains microbenchmarks, scale-up and scale-out applications. We then apply Tartan to evaluate the four latest types of modern GPU interconnects, i.e., PCI-e, NVLink-V1, NVLink-V2 and InfiniBand with GPUDirect-RDMA from two recently released NVIDIA super AI platforms as well as ORNL's exascale prototype system. Based on empirical evaluation, we observe four new types of NUMA effects: three types are triggered by NVLink's topology, connectivity and routing, while one type is caused by PCI-e (i.e., anti-locality). They are very important for performance tuning in multi-GPU environment. Our evaluation results show that, unless the current CPU-GPU master-slave programming model can be replaced, it is difficult for scale-up multi-GPU applications to really benefit from faster intra-node interconnects such as NVLinks; while for inter-node scale-out applications, although interconnect is more crucial to the overall performance, GPUDirect-RDMA appears to be not always the optimal choice. The Tartan benchmark suite including the microbenchmarks are opensource and available athttp://github.com/uuudown/Tartan.","","978-1-5386-6780-4","10.1109/IISWC.2018.8573483","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8573483","","Graphics processing units;Bandwidth;Peer-to-peer computing;Benchmark testing;Network topology;Topology;Routing","benchmark testing;computer graphic equipment;graphics processing units;multiprocessing systems","Tartan benchmark suite;modern GPU interconnect;high performance multiGPU computing;planet-scale applications;multiGPU application performance;multiGPU era;NVLink-V1;NVLink-V2;multiGPU environment;scale-up multiGPU applications;modern GPU;CPU-GPU master-slave programming model;multiGPU benchmark suite;intra-node interconnects","","14","","72","","13 Dec 2018","","","IEEE","IEEE Conferences"
"Integrating Multi-GPU Execution in an OpenACC Compiler","T. Komoda; S. Miwa; H. Nakamura; N. Maruyama","Grad. Sch. of Inf. Sci. & Technol., Univ. of Tokyo, Tokyo, Japan; Grad. Sch. of Inf. Sci. & Technol., Univ. of Tokyo, Tokyo, Japan; Grad. Sch. of Inf. Sci. & Technol., Univ. of Tokyo, Tokyo, Japan; Adv. Inst. for Comput. Sci., RIKEN, Kobe, Japan","2013 42nd International Conference on Parallel Processing","19 Dec 2013","2013","","","260","269","GPUs have become promising computing devices in current and future computer systems due to its high performance, high energy efficiency, and low price. However, lack of high level GPU programming models hinders the wide spread of GPU applications. To resolve this issue, OpenACC is developed as the first industry standard of a directive-based GPU programming model and several implementations are now available. Although early evaluations of the OpenACC systems showed significant performance improvement with modest programming efforts, they also revealed the limitations of the systems. One of the biggest limitations is that the current OpenACC compilers do not automate the utilization of multiple GPUs. In this paper, we present an OpenACC compiler with the capability to execute single GPU OpenACC programs on multiple GPUs. By orchestrating the compiler and the runtime system, the proposed system can efficiently manage the necessary data movements among multiple GPUs memories. To enable advanced communication optimizations in the proposed system, we propose a small set of directives as extensions of OpenACC API. The directives allow programmers to express the patterns of memory accesses in the parallel loops to be offloaded. Inserting a few directives into an OpenACC program can reduce a large amount of unnecessary data movements and thus helps the proposed system drawing great performance from multi-GPU systems. We implemented and evaluated the prototype system on top of CUDA with three data parallel applications. The proposed system achieves up to 6.75x of the performance compared to OpenMP in the 1CPU with 2GPU machine, and up to 2.95x of the performance compared to OpenMP in the 2CPU with 3GPU machine. In addition, in two of the three applications, the multi-GPU OpenACC compiler outperforms the single GPU system where hand-written CUDA programs run.","2332-5690","978-0-7695-5117-3","10.1109/ICPP.2013.35","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6687359","OpenACC;Multi-GPU","Graphics processing units;Arrays;Kernel;Programming;Runtime;Distributed databases","application program interfaces;graphics processing units;multiprocessing systems;program compilers","multiGPU execution;graphics processing unit;OpenACC compiler;high level GPU programming models;GPU applications;directive-based GPU programming model;GPU OpenACC programs;runtime system;data movements;GPU memories;OpenACC API extension;application program interface;data parallel applications;hand-written CUDA programs;compute unified device architecture","","11","","23","","19 Dec 2013","","","IEEE","IEEE Conferences"
"Integral image computation on GPU","M. Chouchene; F. E. Sayadi; M. Atri; R. Tourki","Laboratory of Electronics and Microelectronics (EμE), Faculty of Sciences Monastir, Tunisia; Laboratory of Electronics and Microelectronics (EμE), Faculty of Sciences Monastir, Tunisia; Laboratory of Electronics and Microelectronics (EμE), Faculty of Sciences Monastir, Tunisia; Laboratory of Electronics and Microelectronics (EμE), Faculty of Sciences Monastir, Tunisia","10th International Multi-Conferences on Systems, Signals & Devices 2013 (SSD13)","22 Jul 2013","2013","","","1","4","In this paper we present an integral image algorithm that can run in real-time on a Graphics Processing Unit (GPU). Our system exploits the parallelisms in computation via the NVIDA CUDA programming model, which is a software platform for solving non-graphics problems in a massively parallel high performance fashion. We compare the performance of the parallel approach running on the GPU with the sequential CPU implementation across a range of image sizes.","","978-1-4673-6457-7","10.1109/SSD.2013.6564007","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6564007","Integral image;GPU;CPU;NVIDIA CUDA","Graphics processing units;Instruction sets;Programming;Computer architecture;Kernel;Computer vision;Laboratories","graphics processing units;parallel architectures;parallel programming","integral image computation;GPU;graphics processing unit;NVIDA;CUDA programming model;software platform;nongraphics problem solving;parallel high performance fashion","","2","","12","","22 Jul 2013","","","IEEE","IEEE Conferences"
"GPU-based non-binary LDPC decoder with weighted bit-reliability based algorithm","Z. Liu; R. Liu; L. Zhao","School of Electrical and Information Engineering, Beihang University, Beijing 100191, China; School of Electrical and Information Engineering, Beihang University, Beijing 100191, China; School of Electrical and Information Engineering, Beihang University, Beijing 100191, China","China Communications","29 May 2020","2020","17","5","78","88","In this paper, we present a graphics processing unit (GPU)-based implementation of a weighted bit-reliability based (wBRB) decoder for non-binary LDPC (NB-LDPC) codes. To achieve coalesced memory accesses, an efficient data structure for the wBRB algorithm is proposed. Based on the Single-Instruction Multiple-Threads (SIMT) programming model, a novel mapping strategy with high intra-frame parallelism is presented to improve the latency and throughput performance. Moreover, by using Single-Instruction Multiple-Data (SIMD) intrinsics, four 8-bit message elements are packed into a 32-bit unit and simultaneously processed. Experimental results show that the proposed wBRB decoder provides good tradeoff between error performance and throughput for the codes with relatively large column degrees or high rates.","1673-5447","","10.23919/JCC.2020.05.008","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9103919","non-binary LDPC;bit-reliability;GPU;SIMT;SIMD","Decoding;Iterative decoding;Complexity theory;Graphics processing units;Memory management;Data structures;Throughput","data structures;decoding;graphics processing units;multi-threading;parity check codes","GPU-based nonbinary LDPC decoder;graphics processing unit-based implementation;weighted bit-reliability based decoder;nonbinary LDPC codes;NB-LDPC;coalesced memory accesses;efficient data structure;wBRB algorithm;high intra-frame parallelism;8-bit message elements;32-bit unit;wBRB decoder;single-instruction multiple-data intrinsics;single-instruction multiple-threads programming model","","","","","","29 May 2020","","","IEEE","IEEE Magazines"
"GPU implementation of Hertzian Potential Formulation for simulation of nanosensors","D. Tartarini; A. Massaro","Scuola Superiore ISUFI, University of Salento, via Arnesano 16, Lecce 73100, Italy; Center for Bio-Molecular Nanotechnologies (CBN) of IIT, via Barsanti 1, 73010, Arnesano (LE), Italy","2011 Numerical Simulation of Optoelectronic Devices","10 Oct 2011","2011","","","109","110","The time domain modeling and simulation of electromagnetic (EM) waves interaction with nanodevices, at high spatial and time resolution, requires high computational power. In this paper we present an implementation of the Hertzian Potential Formulation (HPF) on the Graphics Processing Units (GPUs) through the NVIDIA's CUDA (Compute Unified Device Architecture)programming model. The results demonstrate that this GPU tool outperforms the CPU based HPF implementation, reaching a speedup from 30× to 70×.","2158-3242","978-1-61284-878-5","10.1109/NUSOD.2011.6041164","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6041164","GPU Implementation;Nanodevices;Hertzian Potential Formulation","Graphics processing unit;Computational modeling;Time domain analysis;Electromagnetic scattering;Optical waveguides;Nanoscale devices","computer graphics;nanophotonics;nanosensors;optical engineering computing;optical sensors;time-domain analysis","GPU;Hertzian potential formulation;nanosensors;time domain modeling;electromagnetic waves interaction;nanodevices;spatial resolution;time resolution;graphics processing units;compute unified device architecture programming model","","","","14","","10 Oct 2011","","","IEEE","IEEE Conferences"
"Physis: An implicitly parallel programming model for stencil computations on large-scale GPU-accelerated supercomputers","N. Maruyama; K. Sato; T. Nomura; S. Matsuoka","Tokyo Institute of Technology, JST, CREST 2-12-1 Ookayama, Meguro-ku, Tokyo, Japan; Tokyo Institute of Technology, 2-12-1 Ookayama, Meguro-ku, Tokyo, Japan; Google, Inc. 6-10-1 Roppongi, Minato-ku, Tokyo, Japan; Tokyo Institute of Technology, JST, CREST & NII, 2-12-1 Ookayama, Meguro-ku, Tokyo, Japan","SC '11: Proceedings of 2011 International Conference for High Performance Computing, Networking, Storage and Analysis","29 Dec 2011","2011","","","1","12","This paper proposes a compiler-based programming framework that automatically translates user-written structured grid code into scalable parallel implementation code for GPU-equipped clusters. To enable such automatic translations, we design a small set of declarative constructs that allow the user to express stencil computations in a portable and implicitly parallel manner. Our framework translates the user-written code into actual implementation code in CUDA for GPU acceleration and MPI for node-level parallelization with automatic optimizations such as computation and communication overlapping. We demonstrate the feasibility of such automatic translations by implementing several structured grid applications in our framework. Experimental results on the TSUBAME2.0 GPU-based supercomputer show that the performance is comparable as hand-written code and good strong and weak scalability up to 256 GPUs.","2167-4337","978-1-4503-0771-0","10.1145/2063384.2063398","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6114468","Domain Specific Languages;Application Framework;High Perforamnce Computing","Programming;Computational modeling;DSL;Graphics processing unit;Runtime;Optimization;Indexes","application program interfaces;graphics processing units;grid computing;message passing;parallel architectures;parallel machines;program compilers;program interpreters","Physis;parallel programming model;stencil computations;TSUBAME2.0 GPU-based supercomputer;compiler-based programming framework;user-written structured grid code translation;parallel implementation code;GPU-equipped clusters;CUDA;GPU acceleration;MPI;node-level parallelization;computation overlapping;communication overlapping;structured grid applications","","53","1","30","","29 Dec 2011","","","IEEE","IEEE Conferences"
"Infiniband-Verbs on GPU: A Case Study of Controlling an Infiniband Network Device from the GPU","L. Oden; H. Fröning; F. Pfreundt","Competence Center High Perfomance Comput., Fraunhofer Inst. for Ind. Math., Kaiserslautern, Germany; Inst. of Comput. Eng., Univ. of Heidelberg, Heidelberg, Germany; Competence Center High Perfomance Comput., Fraunhofer Inst. for Ind. Math., Kaiserslautern, Germany","2014 IEEE International Parallel & Distributed Processing Symposium Workshops","4 Dec 2014","2014","","","976","983","Due to their massive parallelism and high performance per watt GPUs gain high popularity in high performance computing and are a strong candidate for future exacscale systems. But communication and data transfer in GPU accelerated systems remain a challenging problem. Since the GPU normally is not able to control a network device, today a hybrid-programming model is preferred, whereby the GPU is used for calculation and the CPU handles the communication. As a result, communication between distributed GPUs suffers from unnecessary overhead, introduced by switching control flow from GPUs to CPUs and vice versa. In this work, we modify user space libraries and device drivers of GPUs and the Infiniband network device in a way to enable the GPU to control an Infiniband network device to independently source and sink communication requests without any involvements of the CPU. Our performance analysis shows the differences to hybrid communication models in detail, in particular that the CPU's advantage in generating work requests outshines the overhead associated with context switching. In other terms, our results show that complex networking protocols like IBVERBS are better handled by CPUs in spite of time penalties due to context switching, since overhead of work request generation cannot be parallelized and is not suitable with the high parallel programming model of GPUs.","","978-1-4799-4116-2","10.1109/IPDPSW.2014.111","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6969487","GPUs;Communication;Heterogeneous Clusters;Infiniband;RDMA","Graphics processing units;Data transfer;Registers;Performance evaluation;Context;Libraries;Instruction sets","graphics processing units;parallel programming","infiniband-verbs;GPU;infiniband network device;massive parallelism;high performance per watt;high performance computing;exacscale systems;data transfer;hybrid-programming model;IBVERBS;high parallel programming model","","9","2","24","","4 Dec 2014","","","IEEE","IEEE Conferences"
"Performance Analysis of Benchmarks for GPU-based Linear Programming Problem Solvers","U. A. Shah; S. Yousaf","Department of Computer Science and IT, University of Engineering and Technology, Peshawar, Pakistan; Department of Computer Science and IT, University of Engineering and Technology, Peshawar, Pakistan","2019 2nd International Conference on Communication, Computing and Digital systems (C-CODE)","4 Apr 2019","2019","","","132","136","The single instruction multiple threads (SIMT) architecture of modern graphics processing units (GPUs) shows great potential for efficiently solving compute-intensive linear programming (LP) problems. For benchmarking these GPU-based solutions, speedup is used to measure their relative performance gains with respect to CPU-based implementations. However, a methodological flaw has been observed in benchmarking these GPU-based LP problem solvers, namely, the magnitude of their speedup varies with the choice of CPU-based benchmark. In this paper, we analyze the performance of CPU-based LP problem solvers used to benchmark their GPU-based counterparts. More specifically, we consider benchmarks of two established GPU-based solutions for revised simplex method. The first solution is based on general-purpose computing on GPUs (GPGPU) programming model, and uses a custom-built CPU-based solution as benchmark. The second solution is an OpenGL-based solver, and uses the LP utility in GNU linear programming kit (GLPK) as benchmark. Further, we performed experiments to compare the efficiency of these CPU-based benchmarks with an LP tool present in a commercially available CPU-based software package called CPLEX. Our study reveals that the use of nonstandard benchmarks makes it unfair to quantitatively compare the claims made about speedups achieved by various GPU-based solvers. In order to facilitate decision making process for potential users of GPU-based solutions, we recommend that standard sequential benchmarks be used during any future attempts at developing GPU-based linear optimization tools.","","978-1-5386-9609-5","10.1109/C-CODE.2019.8680981","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8680981","Graphics processing unit (GPU);General-purpose computing on GPUs (GPGPU);Linear programming (LP);Revised simplex method (RSM)","Benchmark testing;Linear programming;Graphics processing units;Standards;Libraries;Tools;Optimization","decision making;graphics processing units;linear programming;optimisation","compute-intensive linear programming problems;CPU-based implementations;CPU-based benchmark;CPU-based LP problem solvers;GPU-based counterparts;established GPU-based solutions;GPUs programming model;custom-built CPU-based solution;GNU linear programming kit;nonstandard benchmarks;GPU-based solvers;standard sequential benchmarks;GPU-based linear programming problem solvers;single instruction multiple threads architecture;graphics processing units;general-purpose computing;CPU-based software package","","1","","18","","4 Apr 2019","","","IEEE","IEEE Conferences"
"Accelerating frequency-domain simulations using small shared-memory CPU/GPU cluster","T. Topa; A. Noga; A. Karwowski","Silesian University of Technology, Gliwice, Poland; Silesian University of Technology, Gliwice, Poland; Silesian University of Technology, Gliwice, Poland","2016 21st International Conference on Microwave, Radar and Wireless Communications (MIKON)","16 Jun 2016","2016","","","1","4","Numerical approach to frequency response problems usually requires that the system governing equation is solved repeatedly at many frequencies. The computational efficiency of the overall process can be increased by departing from traditional sequential computing model in favor of utilizing the parallel processing capability commonly offered by modern hardware. In this paper, we consider a hybrid programming pattern, OpenMP + CUDA, from the perspective of a user of a rather typical low-cost multi-core CPU-based workstation that can accommodate up to four GPUs. Such the small-scale heterogeneous platforms have recently gained wide popularity in scientific computing as an inexpensive massively parallel architecture. The relevant programming model issues and performance questions are addressed. Experimental results for the example physics problem, that is, the electromagnetic scattering from perfectly electrically conducting body, show that significant performance improvement can be attained with the OpenMP + CUDA programming model.","","978-1-5090-2214-4","10.1109/MIKON.2016.7492098","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7492098","GPU;CUDA;milticore CPU;OpenMP;MoM","Graphics processing units;Method of moments;Mathematical model;Kernel;Instruction sets;Computational modeling;Programming","electromagnetic wave scattering;frequency response;frequency-domain analysis;graphics processing units;microprocessor chips;multiprocessing systems;parallel architectures","frequency-domain simulations;graphics processing units;small shared-memory CPU-GPU cluster;frequency response problems;computational efficiency;sequential computing model;parallel processing capability;hybrid programming pattern;multicore CPU-based workstation;electromagnetic scattering;OpenMP + CUDA programming model","","","","11","","16 Jun 2016","","","IEEE","IEEE Conferences"
"Time-Domain Computational Electromagnetics Algorithms for GPU Based Computers","P. P. M. So","Department of Electrical and Computer Engineering, University of Victoria, Victoria, BC, Canada. email: Poman.So@ECE.UVic.CA","EUROCON 2007 - The International Conference on "Computer as a Tool"","26 Dec 2007","2007","","","1","4","Time-domain computational electromagnetic algorithms such as FDTD and TLM require computers with superb processing power and large memory capacity. Grid computing network, cluster computer and massively parallel supercomputers have been the hardware of choices for running powerful modelling tools based on these methods. As a result, high performance modelling tools are only available to elite groups of researchers and big corporations. Stream computing, a new technology that harnesses the tremendous numerical processing power of advanced graphics processing units for general purpose numerical computation, is going to bring high performance time-domain modelling tools to the EM community. This paper reviews the emerging GPU technologies and programming models. Two modelling examples are also used to illustrate the suitability of GPU computing for time-domain electromagnetics.","","978-1-4244-0812-2","10.1109/EURCON.2007.4400480","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4400480","CEM;TLM;Time Domain;GPU Computing;Stream Computing","Time domain analysis;Computational electromagnetics;Clustering algorithms;Grid computing;High performance computing;Finite difference methods;Computer networks;Concurrent computing;Supercomputers;Hardware","computational electromagnetics;computer graphic equipment;finite difference time-domain analysis;grid computing;parallel processing","time-domain computational electromagnetics algorithm;GPU based computer;grid computing network;cluster computer;parallel supercomputer;high performance modelling tool;stream computing technology;general purpose numerical computation;graphics processing unit;programming model","","3","","8","","26 Dec 2007","","","IEEE","IEEE Conferences"
"Scalability of Higher-Order Discontinuous Galerkin FEM Computations for Solving Electromagnetic Wave Propagation Problems on GPU Clusters","N. Gödel; N. Nunn; T. Warburton; M. Clemens","Faculty of Electrical Engineering, Chair for Theory of Electrical Engineering and Computational Electromagnetics, $^{1}$ Helmut-Schmidt-University, University of the Federal Armed Forces Hamburg, Hamburg, Germany; NA; $^{2}$ Computational and Applied Mathematics, Rice University, Houston, TX 77005 , USA; FB E, Chair for Electromagnetic Theory, $^{3}$Bergische Universität Wuppertal, Wuppertal, Germany","IEEE Transactions on Magnetics","19 Jul 2010","2010","46","8","3469","3472","A highly parallel implementation of Maxwell's equations in the time domain using a cluster of Graphics Processing Units (GPUs) is presented. The higher-order Discontinuous Galerkin Finite Element Method (DG-FEM) is used for spatial discretization since its characteristics are matching the parallelization design aspects of the NVIDIA Compute Unified Device Architecture (CUDA) programming model. Asynchronous data transfer is introduced to minimize parallelization overhead and improve parallel efficiency. The implementation is benchmarked with help of a realistic 3-D geometry of an electromagnetic compatibility problem.","1941-0069","","10.1109/TMAG.2010.2046022","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5513006","CUDA;discontinuous Galerkin;FEM;GPGPU;GPU-computing;high order","Scalability;Electromagnetic propagation;Maxwell equations;Graphics;Moment methods;Finite element methods;Concurrent computing;Computer architecture;Parallel programming;Geometry","electromagnetic wave propagation;finite element analysis;Galerkin method;Maxwell equations","high-order discontinuous Galerkin FEM computation;electromagnetic wave propagation;GPU clusters;graphics processing units;finite element method;spatial discretization;NVIDIA compute unified device architecture programming model;asynchronous data transfer;realistic 3-D geometry;Maxwell equations","","36","","8","IEEE","19 Jul 2010","","","IEEE","IEEE Journals"
"Improving Utility of GPU in Accelerating Industrial Applications With User-Centered Automatic Code Translation","P. Yang; F. Dong; V. Codreanu; D. Williams; J. B. T. M. Roerdink; B. Liu; A. Anvari-Moghaddam; G. Min","Department of Computer Science, Liverpool John Moores University, Liverpool, U.K.; University of Bedfordshire, Luton, U.K.; SURFsara, Amsterdam, The Netherlands; Faculteit Wiskunde en Natuurwetenschappen, Rijksuniversiteit Groningen, Groningen, The Netherlands; Johann Bernoulli Institute for Mathematics and Computer Science, University of Groningen, Groningen, The Netherlands; Department of Computer Science and Technology, University of Bedfordshire, Luton, U.K.; Department of Energy Technology, Aalborg University, Aalborg, Denmark; Department of Mathematics and Computer Science, College of Engineering, Mathematics and Physical Sciences, University of Exeter, Exeter, U.K.","IEEE Transactions on Industrial Informatics","4 Apr 2018","2018","14","4","1347","1360","Small to medium enterprises (SMEs), particularly those whose business is focused on developing innovative produces, are limited by a major bottleneck in the speed of computation in many applications. The recent developments in GPUs have been the marked increase in their versatility in many computational areas. But due to the lack of specialist GPUprogramming skills, the explosion of GPU power has not been fully utilized in general SME applications by inexperienced users. Also, the existing automatic CPU-to-GPU code translators are mainly designed for research purposes with poor user interface design and are hard to use. Little attentions have been paid to the applicability, usability, and learnability of these tools for normal users. In this paper, we present an online automated CPU-to-GPU source translation system (GPSME) for inexperienced users to utilize the GPU capability in accelerating general SME applications. This system designs and implements a directive programming model with a new kernel generation scheme and memory management hierarchy to optimize its performance. A web service interface is designed for inexperienced users to easily and flexibly invoke the automatic resource translator. Our experiments with nonexpert GPU users in four SMEs reflect that a GPSME system can efficiently accelerate real-world applications with at least 4× and have a better applicability, usability, and learnability than the existing automatic CPU-to-GPU source translators.","1941-0050","","10.1109/TII.2017.2731362","European Commission and the Engineering and Physical Sciences Research Council within the iManageCancer(grant numbers:611140); MyHealthAvatar(grant numbers:600929); MyLifeHub(grant numbers:EP/L023830); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7990251","Automatic translation;graphics processing unit (GPU);parallel computing;usability","Graphics processing units;Tools;Acceleration;Programming;Usability;C++ languages;Linux","C language;graphics processing units;performance evaluation;service-oriented architecture;small-to-medium enterprises;storage management;user interfaces;Web services","industrial applications;automatic code translation;medium enterprises;SMEs;computational areas;GPU power;general SME applications;inexperienced users;existing automatic CPU-to-GPU code translators;poor user interface design;normal users;CPU-to-GPU source translation system;GPU capability;automatic resource translator;nonexpert GPU users;GPSME system;real-world applications;CPU-to-GPU source translators;specialist GPU programming skills","","","","41","IEEE","24 Jul 2017","","","IEEE","IEEE Journals"
"GPU Accelerated Tensor Computation of Hadamard Product for Machine Learning Applications","K. M. A. Hasan; S. Chakraborty","Khulna University of Engineering & Technology,Computer Science and Engineering Department,Khulna,Bangladesh; Khulna University of Engineering & Technology,Computer Science and Engineering Department,Khulna,Bangladesh","2021 International Conference on Information and Communication Technology for Sustainable Development (ICICT4SD)","12 Apr 2021","2021","","","1","5","The computation on Graphics Processing Unit (GPU) has come out as a new cost-effective parallel computing paradigm for high performance computing that makes possible to process large scale data in parallel. GPU is designed to perform complex mathematical and geometric tasks which are primarily used for 3D graphics related functions. It is also possible to use GPU for non-graphics or general-purpose computation, called General Purpose Computing on GPU (GPGPU), a sub-discipline of High-Performance Computing (HPC). The use of GPU, along with CPU to accelerate more complex scientific, engineering and mathematical tasks is known as GPU Accelerated Computing. In this paper, we propose an efficient tensor computation for Hadamard Product (HP) which is directly applied in machine learning applications especially in Long Short-Term Memory (LSTM). The HP computation becomes complex when higher order tensors with millions of data is considered. Therefore, the only CPU-based traditional serial operation becomes tedious and inefficient. The contribution of this paper is in two fold; first we have developed efficient algorithms for higher order tensors by dimension conversion. Then we apply the algorithm in GPU to speed up the computation. To apply in GPU, we develop efficient partitioning scheme of higher order tensors. We have used CUDA (Compute Unified Device Architecture) C programming model developed by NVIDIA to implement the algorithm. We compared these algorithms with Traditional Multidimensional Array (TMA) based algorithm and found improved results.","","978-1-6654-1460-9","10.1109/ICICT4SD50815.2021.9396980","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9396980","GPU Computing;HPC;Tensor computation;Hadamard Product;CUDA C","Machine learning algorithms;Tensors;Graphics processing units;Machine learning;Partitioning algorithms;Acceleration;Task analysis","C language;graphics processing units;learning (artificial intelligence);mathematics computing;parallel architectures;parallel programming;recurrent neural nets;tensors","higher order tensor partitioning scheme;dimension conversion;LSTM;long short-term memory;HPC;GPGPU;general-purpose computing on GPU;GPU accelerated tensor computation;compute unified device architecture;CUDA C programming model;HP computation;GPU accelerated computing;geometric tasks;complex mathematical tasks;high performance computing;cost-effective parallel computing paradigm;graphics processing unit;machine learning applications;Hadamard Product","","","","17","","12 Apr 2021","","","IEEE","IEEE Conferences"
"Distributed Interactive Visualization Using GPU-Optimized Spark","S. Hong; J. Choi; W. -K. Jeong","Ulsan National Institute of Science and Technology, Ulsan, South Korea; Ulsan National Institute of Science and Technology, Ulsan, South Korea; Korea University, Seoul, South Korea","IEEE Transactions on Visualization and Computer Graphics","29 Jul 2021","2021","27","9","3670","3684","With the advent of advances in imaging and computing technologies, large-scale data acquisition and processing have become commonplace in many science and engineering disciplines. Conventional workflows for large-scale data processing usually rely on in-house or commercial software that are designed for domain-specific computing tasks. Recent advances in MapReduce, which was originally developed for batch processing textual data via a simplified programming model of the map and reduce functions, have expanded its applications to more general tasks in big-data processing, such as scientific computing, and biomedical image processing. However, as shown in previous work, volume rendering and visualization using MapReduce is still considered challenging and impractical owing to the disk-based, batch-processing nature of its computing model. In this article, contrary to this common belief, we show that the MapReduce computing model can be effectively used for interactive visualization. Our proposed system is a novel extension of Spark, one of the most popular open-source MapReduce frameworks, which offers GPU-accelerated MapReduce computing. To minimize CPU-GPU communication and overcome slow, disk-based shuffle performance, the proposed system supports GPU in-memory caching and MPI-based direct communication between compute nodes. To allow for GPU-accelerated in-situ visualization using raster graphics in Spark, we leveraged the CUDA-OpenGL interoperability, resulting in faster processing speeds by several orders of magnitude compared to conventional MapReduce systems. We demonstrate the performance of our system via several volume processing and visualization tasks, such as direct volume rendering, iso-surface extraction, and numerical simulations with in-situ visualization.","1941-0506","","10.1109/TVCG.2020.2990894","National Research Foundation of Korea(grant numbers:NRF-2017R1D1A1A09000841); Ministry of Science and ICT(grant numbers:NRF-2019M3E5D2A01063819,NRF-2014K1A3A1A05034557); Korea Health Industry Development Institute(grant numbers:HI18C0316); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9079657","MapReduce;spark;GPU;distributed rendering;in-situ visualization","Data visualization;Sparks;Graphics processing units;Computational modeling;Rendering (computer graphics);Programming;Task analysis","computer graphic equipment;computer graphics;data acquisition;data handling;data visualisation;graphics processing units;medical image processing;message passing;open systems;parallel architectures;parallel processing;public domain software;rendering (computer graphics)","CPU-GPU communication;disk-based shuffle performance;GPU in-memory caching;MPI-based direct communication;compute nodes;GPU-accelerated in-situ visualization;faster processing speeds;conventional MapReduce systems;volume processing;visualization tasks;direct volume rendering;distributed interactive visualization;GPU-optimized Spark;imaging computing technologies;large-scale data acquisition;conventional workflows;large-scale data processing;commercial software;domain-specific computing tasks;batch processing textual data;simplified programming model;general tasks;big-data processing;scientific computing;biomedical image processing;batch-processing nature;MapReduce computing model;popular open-source MapReduce frameworks;GPU-accelerated MapReduce computing","","2","","45","IEEE","27 Apr 2020","","","IEEE","IEEE Journals"
"A GPU-based Fast Solution for Riesz Space Fractional Reaction-Diffusion Equation","Q. Wang; J. Liu; C. Gong; Y. Zhang; Z. Xing","Sci. & Technol. on Parallel & Distrib. Process. Lab., Nat. Univ. of Defense Technol., Changsha, China; Sci. & Technol. on Parallel & Distrib. Process. Lab., Nat. Univ. of Defense Technol., Changsha, China; Sci. & Technol. on Parallel & Distrib. Process. Lab., Nat. Univ. of Defense Technol., Changsha, China; Sci. & Technol. on Parallel & Distrib. Process. Lab., Nat. Univ. of Defense Technol., Changsha, China; Sci. & Technol. on Parallel & Distrib. Process. Lab., Nat. Univ. of Defense Technol., Changsha, China","2015 18th International Conference on Network-Based Information Systems","10 Dec 2015","2015","","","317","323","The fast numerical solutions of Riesz fractional equation have computational cost of O(NMlogM), where M, N are the number of grid points and time steps. In this paper, we present a GPU-based fast solution for Riesz space fractional equation. The GPU-based fast solution, which is based on the fast method using FFT and implemented with CUDA programming model, consists of parallel FFT, vector-vector addition and vector-vector multiplication on GPU. The experimental results show that the GPU-based fast solution compares well with the exact solution. Compared to the known parallel fast solution on 8-core Intel E5-2670 CPU, the overall performance speedup on NVIDIA GTX650 GPU reaches 2.12 times and that on NVIDIA K20C GPU achieves 10.93 times.","","978-1-4799-9942-2","10.1109/NBiS.2015.49","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7350638","Parallel computing;GPU;fractional differential equation;FFT;fast solution","Graphics processing units;Instruction sets;Mathematical model;Arrays;Yttrium;Approximation methods;Parallel processing","differential equations;fast Fourier transforms;graphics processing units;mathematics computing;parallel architectures;reaction-diffusion systems;vectors","GPU-based fast solution;Riesz space fractional reaction-diffusion equation;numerical solutions;Riesz fractional equation;computational cost;CUDA programming model;parallel FFT;vector-vector addition;vector-vector multiplication;NVIDIA GTX650 GPU;NVIDIA K20C GPU;fractional differential equation","","2","","30","","10 Dec 2015","","","IEEE","IEEE Conferences"
"GCMR: A GPU Cluster-Based MapReduce Framework for Large-Scale Data Processing","Yiru Guo; Weiguo Liu; B. Gong; G. Voss; W. Muller-Wittig","Sch. of Comput. Sci. & Technol., Shandong Univ., Jinan, China; Sch. of Comput. Sci. & Technol., Shandong Univ., Jinan, China; Sch. of Comput. Sci. & Technol., Shandong Univ., Jinan, China; Fraunhofer IDM@NTU, Nanyang Technol. Univ., Singapore, Singapore; Fraunhofer IDM@NTU, Nanyang Technol. Univ., Singapore, Singapore","2013 IEEE 10th International Conference on High Performance Computing and Communications & 2013 IEEE International Conference on Embedded and Ubiquitous Computing","12 Jun 2014","2013","","","580","586","MapReduce is a very popular programming model to support parallel and distributed large-scale data processing. There have been a lot of efforts to implement this model on commodity GPU-based systems. However, most of these implementations can only work on a single GPU. And they can not be used to process large-scale datasets. In this paper, we present a new approach to design the MapReduce framework on GPU clusters for handling large-scale data processing. We have used Compute Unified Device Architectures (CUDA) and MPI parallel programming models to implement this framework. To derive an efficient mapping onto GPU clusters, we introduce a two-level parallelization approach: the inter node level and intra node level parallelization. Furthermore in order to improve the overall MapReduce efficiency, a multi-threading scheme is used to overlap the communication and computation on a multi-GPU node. Compared to previous GPU-based MapReduce implementations, our implementation, called GCMR, achieves speedups up to 2.6 on a single node and up to 9.1 on 4 nodes of a Tesla S1060 quad-GPU cluster system for processing small datasets. It also shows very good scalability for processing large-scale datasets on the cluster system.","","978-0-7695-5088-6","10.1109/HPCC.and.EUC.2013.88","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6831970","MapReduce;CUDA;MPI;GPU Cluster","Graphics processing units;Instruction sets;Computational modeling;Computer architecture;Acceleration;Writing;Data processing","application program interfaces;graphics processing units;message passing;parallel programming","GCMR;GPU cluster-based MapReduce framework;distributed large-scale data processing;commodity GPU-based systems;compute unified device architectures;CUDA;MPI parallel programming models;inter node level parallelization;intra node level parallelization;MapReduce efficiency;multithreading scheme;multi-GPU node;GPU-based MapReduce;single node;Tesla S1060 quad-GPU cluster system;large-scale datasets","","2","","15","","12 Jun 2014","","","IEEE","IEEE Conferences"
"NVIDIA A100 Tensor Core GPU: Performance and Innovation","J. Choquette; W. Gandhi; O. Giroux; N. Stam; R. Krashinsky","NVIDIA, Singapore; NVIDIA, Singapore; NVIDIA, Singapore; NVIDIA, Singapore; NVIDIA, Singapore","IEEE Micro","29 Mar 2021","2021","41","2","29","35","NVIDIA A100 Tensor Core GPU is NVIDIA's latest flagship GPU. It has been designed with many new innovative features to provide performance and capabilities for HPC, AI, and data analytics workloads. Feature enhancements include a Third-Generation Tensor Core, new asynchronous data movement and programming model, enhanced L2 cache, HBM2 DRAM, and third-generation NVIDIA NVLink I/O.","1937-4143","","10.1109/MM.2021.3061394","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9361255","GPU;A100;NVLink;Deep Learning;Tensor Core;CUDA;C++20","Graphics processing units;Tensors;Bandwidth;Throughput;Parallel processing;Benchmark testing;Artificial intelligence","cache storage;data analysis;DRAM chips;graphics processing units;multiprocessing systems;parallel architectures;parallel processing;tensors","third-generation NVIDIA NVLink;Third-Generation Tensor Core;innovative features;NVIDIA's latest flagship GPU;NVIDIA A100 Tensor Core GPU","","4","","5","IEEE","23 Feb 2021","","","IEEE","IEEE Magazines"
"Automatic Parallelization of GPU Applications Using OpenCL","L. D. Solano-Quinde; B. M. Bode; A. K. Somani","Dept. of Electr., Univ. of Cuenca, Cuenca, Ecuador; Nat. Center for Supercomput. Applic., Univ. of Illinois at Urbana-Champaign, Urbana, IL, USA; Dept. of Electr. & Comput. Eng., Iowa State Univ., Ames, IA, USA","2015 Asia-Pacific Conference on Computer Aided System Engineering","5 Oct 2015","2015","","","276","283","Graphics Processing Units (GPUs) have been successfully used to accelerate scientific applications due to their computation power and the availability of programming languages that make more approachable writing scientific applications for GPUs. However, since the programming model of GPUs requires offloading all the data to the GPU memory, the memory footprint of the application is limited to the size of the GPU memory. Multi-GPU systems can make memory limited problems tractable by parallelizing the computation and data among the available GPUs. Parallelizing applications written for running on single-GPU systems can be done (i) at runtime through an environment that captures the memory operations and kernel calls and distributes among the available GPUs, and (ii) at compile time through a pre-compiler that transforms the application for decomposing the data and computation among the available GPUs. In this paper we propose a framework and implement a tool that transforms an OpenCL application written to run on single-GPU systems into one that runs on multi-GPU systems. Based on data dependencies and data usage analysis, the application is transformed to decompose data and computation among the available GPUs. To reduce the data transfer overhead, computation-communication overlapping techniques are utilized. We tested our tool using two applications with different data transfer requirements, for the application with no data transfer requirements, a linear speedup is achieved, while for the application with data transfers, the computation-communication overlapping reduces the communication overhead by 40%.","","978-1-4799-7588-4","10.1109/APCASE.2015.56","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7287032","GPU;OpenCL;Program Transformation","Kernel;Arrays;Graphics processing units;Data transfer;Algorithms;XML;Memory management","graphics processing units;parallel processing","automatic parallelization;GPU applications;OpenCL;graphics processing units;scientific applications;computation power;programming languages;programming model;data offloading;GPU memory;memory footprint;multiGPU systems;parallelizing applications;single-GPU systems;memory operations;kernel calls;precompiler;data decomposition;data dependencies;data usage analysis;data transfer overhead;computation-communication overlapping techniques;data transfer requirements;linear speedup;communication overhead","","1","","10","","5 Oct 2015","","","IEEE","IEEE Conferences"
"An OpenMP-CUDA Implementation of Multilevel Fast Multipole Algorithm for Electromagnetic Simulation on Multi-GPU Computing Systems","J. Guan; S. Yan; J. Jin","Center for Computational Electromagnetics, Department of Electrical and Computer Engineering, University of Illinois at Urbana-Champaign, Urbana, IL, USA; Center for Computational Electromagnetics, Department of Electrical and Computer Engineering, University of Illinois at Urbana-Champaign, Urbana, IL, USA; Center for Computational Electromagnetics, Department of Electrical and Computer Engineering, University of Illinois at Urbana-Champaign, Urbana, IL, USA","IEEE Transactions on Antennas and Propagation","2 Jul 2013","2013","61","7","3607","3616","A multi-GPU implementation of the multilevel fast multipole algorithm (MLFMA) based on the hybrid OpenMPCUDA parallel programming model (OpenMP-CUDA-MLFMA) is presented for computing electromagnetic scattering of a three-dimensional conducting object. The proposed hierarchical parallelization strategy ensures a high computational throughput for the GPU calculation. The resulting OpenMP-based multi-GPU implementation is capable of solving real-life problems with over one million unknowns with a remarkable speed-up. The radar cross sections of a few benchmark objects are calculated to demonstrate the accuracy of the solution. The results are compared with those from the CPU-based MLFMA and measurements. The capability and efficiency of the presented method are analyzed through the examples of a sphere, an aerocraft, and a missile-like object. Compared with the 8-threaded CPU-based MLFMA, the OpenMP-CUDA-MLFMA method can achieve from 5 to 20 total speed-up ratios.","1558-2221","","10.1109/TAP.2013.2258882","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6504730","CUDA;electromagnetic scattering;hybrid parallel programming model;multi-GPU;multilevel fast multipole algorithm;OpenMP;radar cross section","Graphics processing units;Instruction sets;Method of moments;Computer architecture;Antenna radiation patterns;Computational modeling","computational electromagnetics;electromagnetic wave scattering;graphics processing units;parallel architectures","multilevel fast multipole algorithm;electromagnetic simulation;multi-GPU computing systems;OpenMP-CUDA parallel programming model;electromagnetic scattering;three-dimensional conducting object;radar cross sections;aerocraft;missile-like object","","49","","27","","18 Apr 2013","","","IEEE","IEEE Journals"
"Enhancing Blowfish file encryption algorithm through parallel computing on GPU","T. Mahajan; S. Masih","Devi Ahilya University, Indore, India; Devi Ahilya University, Indore, India","2015 International Conference on Computer, Communication and Control (IC4)","11 Jan 2016","2015","","","1","4","Parallel computing can provide fast execution of the program as compared to sequential computing. Graphical Processing Unit can be used for parallel computing as it gives the advantage of multiple cores. Purpose of parallel implementation of Blowfish cryptography algorithm is to improve the speed up of encryption and decryption so that large files also can be communicated on the network in secure and efficient way. This paper demonstrates the way of implementing Blowfish cryptography algorithm on GPU for improving performance. This implementation uses GPGPU and CUDA. CUDA is used as a programming model for implementing on the GPU. The experiment shows multifold difference in performance of CPU and GPU in encryption-decryption of large files.","","978-1-4799-8164-9","10.1109/IC4.2015.7375604","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7375604","GPU-Graphical Processing Unit;CPU-Central Processing Unit;CUDA-Computer Unified Device Architecture;GPGPU-General Purpose computation on Graphical Processing Unit","Graphics processing units;Encryption;Programming;Algorithm design and analysis;Conferences","cryptography;graphics processing units;parallel architectures;parallel programming","Blowfish file encryption algorithm;parallel computing;program execution;sequential computing;graphical processing unit;parallel implementation;Blowfish cryptography algorithm;GPGPU;CUDA;programming model;large file encryption-decryption;computer unified device architecture;general purpose computation on graphical processing unit","","2","","10","","11 Jan 2016","","","IEEE","IEEE Conferences"
"HPGA: A High-Performance Graph Analytics Framework on the GPU","H. Yang; H. Su; M. Wen; C. Zhang","Department of Computer, National University of Defense Technology, Changsha, 410000, China; Department of Computer, National University of Defense Technology, Changsha, 410000, China; Department of Computer, National University of Defense Technology, Changsha, 410000, China; Department of Computer, National University of Defense Technology, Changsha, 410000, China","2018 International Conference on Information Systems and Computer Aided Education (ICISCAE)","14 Mar 2019","2018","","","488","492","In recent years, the rapidly growing use of graphs has sparked parallel graph analytics frameworks for leveraging the massive hardware resources, specifically graphics processing units (GPUs). However, the issues of the unpredictable control flows, memory divergence, and the complexity of programming have restricted high-level GPU graph libraries. In this work, we present HPGA, a high performance parallel graph analytics framework targeting the GPU. HPGA implements an abstraction which maps vertex programs to generalized sparse matrix operations on GPUs for delivering high performance. HPGA incorporates high-performance GPU computing primitives and optimization strategies with a high-level programming model. We evaluate the performance of HPGA for three graph primitives (BFS, SSSP, PageRank) with large-scale datasets. The experimental results show that HPGA matches or even exceeds the performance of MapGraph and nvGRAPH, two state-of-the-art GPU graph libraries.","","978-1-5386-5738-6","10.1109/ICISCAE.2018.8666877","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8666877","Graph Analytics;High-performance Computing;GPU","Graphics processing units;Sparse matrices;Programming;Computational modeling;Arrays;Optimization","graph theory;graphics processing units;sparse matrices","HPGA;high-performance graph analytics framework;parallel graph analytics frameworks;massive hardware resources;high-level GPU graph libraries;high performance;generalized sparse matrix operations;high-performance GPU;high-level programming model;GPU graph libraries;vertex programs","","","","20","","14 Mar 2019","","","IEEE","IEEE Conferences"
"Compiling and Optimizing Java 8 Programs for GPU Execution","K. Ishizaki; A. Hayashi; G. Koblents; V. Sarkar","IBM Res., Tokyo, Japan; NA; IBM Canada, Canada; NA","2015 International Conference on Parallel Architecture and Compilation (PACT)","10 Mar 2016","2015","","","419","431","GPUs can enable significant performance improvements for certain classes of data parallel applications and are widely used in recent computer systems. However, GPU execution currently requires explicit low-level operations such as 1) managing memory allocations and transfers between the host system and the GPU, 2) writing GPU kernels in a low-level programming model such as CUDA or OpenCL, and 3) optimizing the kernels by utilizing appropriate memory types on the GPU. Because of this complexity, in many cases, only expert programmers can exploit the computational capabilities of GPUs through the CUDA/OpenCL languages. This is unfortunate since a large number of programmers use high-level languages, such as Java, due to their advantages of productivity, safety, and platform portability, but would still like to exploit the performance benefits of GPUs. Thus, one challenging problem is how to utilize GPUs while allowing programmers to continue to benefit from the productivity advantages of languages like Java. This paper presents a just-in-time (JIT) compiler that can generate and optimize GPU code from a pure Java program written using lambda expressions with the new parallel streams APIs in Java 8. These APIs allow Java programmers to express data parallelism at a higher level than threads and tasks. Our approach translates lambda expressions with parallel streams APIs in Java 8 into GPU code and automatically generates runtime calls that handle the low-level operations mentioned above. Additionally, our optimization techniques 1) allocate and align the starting address of the Java array body in the GPUs with the memory transaction boundary to increase memory bandwidth, 2) utilize read-only cache for array accesses to increase memory efficiency in GPUs, and 3) eliminate redundant data transfer between the host and the GPU. The compiler also performs loop versioning for eliminating redundant exception checks and for supporting virtual method invocations within GPU kernels. These features and optimizations are supported and automatically performed by a JIT compiler that is built on top of a production version of the IBM Java 8 runtime environment. Our experimental results on an NVIDIA Tesla GPU show significant performance improvements over sequential execution (127.9 × geometric mean) and parallel execution (3.3 × geometric mean) for eight Java 8 benchmark programs running on a 160-thread POWER8 machine. This paper also includes an in-depth analysis of GPU execution to show the impact of our optimization techniques by selectively disabling each optimization. Our experimental results show a geometric-mean speed-up of 1.15 × in the GPU kernel over state-of-the-art approaches. Overall, our JIT compiler can improve the performance of Java 8 programs by automatically leveraging the computational capability of GPUs.","1089-795X","978-1-4673-9524-3","10.1109/PACT.2015.46","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7429325","JIT compiler;GPU;Java 8;Parallel streams","Graphics processing units;Java;Optimization;Kernel;Arrays;Semantics","application program interfaces;cache storage;configuration management;graphics processing units;Java;parallel processing;program compilers","Java 8 programs;GPU execution;data parallel applications;CUDA/OpenCL languages;Java language;just-in-time compiler;JIT compiler;GPU code optimization;lambda expressions;parallel streams API;data parallelism;memory transaction boundary;memory bandwidth;read-only cache;memory efficiency;loop versioning;virtual method invocations;GPU kernels;IBM Java 8 runtime environment;NVIDIA Tesla GPU;thread POWER8 machine;graphics processing unit","","24","3","37","","10 Mar 2016","","","IEEE","IEEE Conferences"
"OO-VR: NUMA Friendly Object-Oriented VR Rendering Framework For Future NUMA-Based Multi-GPU Systems","C. Xie; F. Xin; M. Chen; S. L. Song","Pacific Northwest National Lab (PNNL), University of Houston; ECMOS Lab, University of Houston,ECE Department; School of Computer Science and Software Engineering, East China Normal University; Pacific Northwest National Lab (PNNL), University of Houston","2019 ACM/IEEE 46th Annual International Symposium on Computer Architecture (ISCA)","6 Feb 2020","2019","","","53","65","With the strong computation capability, NUMA-based multi-GPU system is a promising candidate to provide sustainable and scalable performance for Virtual Reality (VR) applications and deliver the excellent user experience. However, the entire multi-GPU system is viewed as a single GPU under the single programming model which greatly ignores the data locality among VR rendering tasks during the workload distribution, leading to tremendous remote memory accesses among GPU models (GPMs). The limited inter- GPM link bandwidth (e.g., 64GB/s for NVlink) becomes the major obstacle when executing VR applications in the multi-GPU system. By conducting comprehensive characterizations on different kinds of parallel rendering frameworks, we observe that distributing the rendering object along with its required data per GPM can reduce the inter-GPM memory accesses. However, this object-level rendering still faces two major challenges in NUMA-based multi- GPU system: (1) the large data locality between the left and right views of the same object and the data sharing among different objects and (2) the unbalanced workloads induced by the software- level distribution and composition mechanisms. To tackle these challenges, we propose object-oriented VR rendering framework (OO-VR) that conducts the software and hardware co-optimization to provide a NUMA friendly solution for VR multi-view rendering in NUMA-based multi-GPU systems. We first propose an object-oriented VR programming model to exploit the data sharing between two views of the same object and group objects into batches based on their texture sharing levels. Then, we design an object aware runtime batch distribution engine and distributed hardware composition unit to achieve the balanced workloads among GPMs and further improve the performance of VR rendering. Finally, evaluations on our VR featured simulator show that OO-VR provides 1.58x overall performance improvement and 76% inter-GPM memory traffic reduction over the state-of- the-art multi-GPU systems. In addition, OO-VR provides NUMA friendly performance scalability for the future larger multi-GPU scenarios with ever increasing asymmetric bandwidth between local and remote memory.","2575-713X","978-1-4503-6669-4","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8980302","","","graphics processing units;multiprocessing systems;object-oriented programming;parallel processing;rendering (computer graphics);virtual reality","VR multiview rendering;NUMA-based multiGPU system;object-oriented VR programming model;data sharing;object aware runtime batch distribution engine;NUMA friendly performance scalability;NUMA friendly object-oriented VR rendering framework;virtual reality applications;single GPU;single programming model;data locality;VR rendering tasks;GPU models;VR applications;parallel rendering frameworks;inter-GPM memory accesses;object-level rendering;composition mechanisms;software-level distribution;inter-GPM link bandwidth;inter-GPM memory traffic reduction;OO-VR framework","","","","44","","6 Feb 2020","","","IEEE","IEEE Conferences"
"Efficient implementation of apriori algorithm on HDFS using GPU","M. Tiwary; A. K. Sahoo; R. Misra","Department of Information Technology, C.V. Raman College of Engineering, Bhubaneswar, India; Department of Information Technology, C.V. Raman College of Engineering, Bhubaneswar, India; Department of Information Technology, C.V. Raman College of Engineering, Bhubaneswar, India","2014 International Conference on High Performance Computing and Applications (ICHPCA)","19 Feb 2015","2014","","","1","7","A very efficient distributed processing framework is provided by Hadoop. For processing big data, Hadoop uses map-reduce programming model. The proposed technique uses parallel apriori mapreduce algorithm using high performance GPU. The computationally intensive operations of mapping phase are offloaded to GPU. Apriori is a very basic data mining algorithm which is used to determine the frequent item sets in the transactional database. In Hadoop, big transactional database are stored in structured form. When the size of transactional database is big, very fast apriori technique is required to solve the problem. Past researches show a clear view of solving data mining operations in heterogeneous environment which increase the performance with a very high rate than older serial execution techniques. This paper introduces integration of GPU in mapreduce programming model to solve the apriori data mining technique in a very time efficient manner. For our experimental implementation, we use NVIDIA's GPU and for the integration process, we use JCUDA and JNI.","","978-1-4799-5958-7","10.1109/ICHPCA.2014.7045323","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7045323","Hadoop;Map-reduce;CUDA;GPU;Apriori","Graphics processing units;Acceleration;Computer architecture;Databases;Integrated circuits;Kernel","Big Data;data integration;data mining;graphics processing units;parallel architectures;parallel programming;transaction processing","distributed processing framework;Hadoop;big data processing;Mapreduce programming model;parallel apriori Mapreduce algorithm;high performance GPU;mapping phase;data mining algorithm;big transactional database;data mining operations;heterogeneous environment;apriori data mining technique;NVIDIA's GPU;JCUDA;JNI","","7","","10","","19 Feb 2015","","","IEEE","IEEE Conferences"
"Accelerating FDTD algorithm using GPU computing","Z. Bo; X. Zheng-hui; R. Wu; L. Wei-ming; S. Xin-qing","School of Information and Electronics, Beijing Institute of Technology, Beijing 100081, China; School of Information and Electronics, Beijing Institute of Technology, Beijing 100081, China; School of Information and Electronics, Beijing Institute of Technology, Beijing 100081, China; School of Information and Electronics, Beijing Institute of Technology, Beijing 100081, China; School of Information and Electronics, Beijing Institute of Technology, Beijing 100081, China","2011 IEEE International Conference on Microwave Technology & Computational Electromagnetics","23 Jun 2011","2011","","","410","413","Hardware acceleration of Finite-Difference Time-Domain (FDTD) algorithm has always been an important part of FDTD research. In this essay, we discussed the advantage and feasibility of accelerate FDTD algorithm using Graphics Processing Unit (GPU). With the implement of lattice-threads mapping and other techniques, we proposed a GPU FDTD programming model that is both efficient and accurate. Then we simulated two projects using proposed model, the result shows good agreement with CPU computing while simulation speedup is 20 at minimum, thus proves the efficiency and great potential of GPU accelerating in FDTD research.","","978-1-4244-8559-8","10.1109/ICMTCE.2011.5915546","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5915546","FDTD;GPU;Hardware Accelerating","Graphics processing unit;Finite difference methods;Time domain analysis;Acceleration;Instruction sets;Lattices;Computer architecture","coprocessors;finite difference time-domain analysis;mathematics computing","GPU computing;hardware acceleration;finite-difference time-domain algorithm;lattice-threads mapping;FDTD research;FDTD algorithm","","9","","5","","23 Jun 2011","","","IEEE","IEEE Conferences"
"GPU based parallel matrix exponential algorithm for large scale power system electromagnetic transient simulation","J. Zhao; J. Liu; P. Li; X. Fu; G. Song; C. Wang","Key Laboratory of Smart Grid of Ministry of Education, Tianjin University, Tianjin, China; Key Laboratory of Smart Grid of Ministry of Education, Tianjin University, Tianjin, China; Key Laboratory of Smart Grid of Ministry of Education, Tianjin University, Tianjin, China; Key Laboratory of Smart Grid of Ministry of Education, Tianjin University, Tianjin, China; Key Laboratory of Smart Grid of Ministry of Education, Tianjin University, Tianjin, China; Key Laboratory of Smart Grid of Ministry of Education, Tianjin University, Tianjin, China","2016 IEEE Innovative Smart Grid Technologies - Asia (ISGT-Asia)","26 Dec 2016","2016","","","110","114","In order to meet the demand of fast electromagnetic transient simulation for large-scale interconnected power systems, a new method of GPU based parallel matrix exponential algorithm for power system electromagnetic transient simulation is presented in this paper. Firstly, the hardware structure and programming model of GPU are introduced. Then the high data parallelism based on matrix exponential integration algorithm is proposed. Then, a simulation test is carried out for a wind farm system including 17 WTGs. The accuracy and efficiency of the proposed method are verified. The results show that the speed of parallel computing based on GPU is about 2 times faster than that of CPU and Matlab/SimPowerSystems.","2378-8542","978-1-5090-4303-3","10.1109/ISGT-Asia.2016.7796370","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7796370","matrix exponential;electromagnetic transient simulation;GPU;parallel computation","Graphics processing units;Computational modeling;Parallel processing;Mathematical model;Algorithm design and analysis;Sparse matrices;Power systems","graphics processing units;power engineering computing;power system interconnection;power system simulation;wind power plants","GPU-based parallel matrix exponential integration algorithm;large-scale interconnected power system electromagnetic transient simulation;GPU hardware structure;GPU programming model;data parallelism;wind farm system;WTG;parallel computing;Matlab-SimPower system","","3","","14","","26 Dec 2016","","","IEEE","IEEE Conferences"
"GPU Peer-to-Peer Techniques Applied to a Cluster Interconnect","R. Ammendola; M. Bernaschi; A. Biagioni; M. Bisson; M. Fatica; O. Frezza; F. Lo Cicero; A. Lonardo; E. Mastrostefano; P. S. Paolucci; D. Rossetti; F. Simula; L. Tosoratto; P. Vicini","Sezione Roma Tor Vergata, Ist. Naz. di Fis. Nucleare, Rome, Italy; Ist. Applicazioni Calcolo, Consiglio Naz. delle Ric., Rome, Italy; Sezione Roma, Ist. Naz. di Fis. Nucleare, Rome, Italy; Ist. Applicazioni Calcolo, Consiglio Naz. delle Ric., Rome, Italy; NVIDIA Corp., CA, USA; Sezione Roma, Ist. Naz. di Fis. Nucleare, Rome, Italy; Sezione Roma, Ist. Naz. di Fis. Nucleare, Rome, Italy; Sezione Roma, Ist. Naz. di Fis. Nucleare, Rome, Italy; Dept. of Comput. Sci., Sapienza Univ., Rome, Italy; Sezione Roma, Ist. Naz. di Fis. Nucleare, Rome, Italy; Sezione Roma, Ist. Naz. di Fis. Nucleare, Rome, Italy; Sezione Roma, Ist. Naz. di Fis. Nucleare, Rome, Italy; Sezione Roma, Ist. Naz. di Fis. Nucleare, Rome, Italy; Sezione Roma, Ist. Naz. di Fis. Nucleare, Rome, Italy","2013 IEEE International Symposium on Parallel & Distributed Processing, Workshops and Phd Forum","31 Oct 2013","2013","","","806","815","Modern GPUs support special protocols to exchange data directly across the PCI Express bus. While these protocols could be used to reduce GPU data transmission times, basically by avoiding staging to host memory, they require specific hardware features which are not available on current generation network adapters. In this paper we describe the architectural modifications required to implement peer-to-peer access to NVIDIA Fermi- and Kepler-class GPUs on an FPGA-based cluster interconnect. Besides, the current software implementation, which integrates this feature by minimally extending the RDMA programming model, is discussed, as well as some issues raised while employing it in a higher level API like MPI. Finally, the current limits of the technique are studied by analyzing the performance improvements on low-level benchmarks and on two GPU-accelerated applications, showing when and how they seem to benefit from the GPU peer-to-peer method.","","978-0-7695-4979-8","10.1109/IPDPSW.2013.128","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6650959","peer-to-peer;GPU;interconnection network;parallel computing","Graphics processing units;Peer-to-peer computing;Bandwidth;Protocols;Hardware;Benchmark testing;Switches","field programmable gate arrays;graphics processing units;peer-to-peer computing;peripheral interfaces","RDMA programming model;FPGA based cluster interconnect;NVIDIA Fermi- and Kepler class GPU;peer-to-peer access;architectural modifications;hardware features;host memory;GPU data transmission times;PCI express bus;exchange data;GPUs support;GPU peer-to-peer techniques","","24","","17","","31 Oct 2013","","","IEEE","IEEE Conferences"
"Performance Portability of Molecular Docking Miniapp On Leadership Computing Platforms","M. Thavappiragasam; A. Scheinberg; W. Elwasif; O. Hernandez; A. Sedova","Oak Ridge National Laboratory,Oak Ridge,Tennessee; Jubilee Development,Cambridge,Massachusetts; Oak Ridge National Laboratory,Oak Ridge,Tennessee; Oak Ridge National Laboratory,Oak Ridge,Tennessee; Oak Ridge National Laboratory,Oak Ridge,Tennessee","2020 IEEE/ACM International Workshop on Performance, Portability and Productivity in HPC (P3HPC)","1 Jan 2021","2020","","","36","44","Rapidly changing computer architectures, such as those found at high-performance computing (HPC) facilities, present the need for mini-applications (miniapps) that capture essential algorithms used in large applications to test program performance and portability, aiding transitions to new systems. The COVID-19 pandemic has fueled a flurry of activity in computational drug discovery, including the use of supercomputers and GPU acceleration for massive virtual screens for therapeutics. Recent work targeting COVID-19 at the Oak Ridge Leadership Computing Facility (OLCF) used the GPU-accelerated program AutoDock-GPU to screen billions of compounds on the Summit supercomputer. In this paper we present the development of a new miniapp, miniAutoDock-GPU, that can be used to evaluate the performance and portability of GPU-accelerated protein-ligand docking programs on different computer architectures. These tests are especially relevant as facilities transition from petascale systems and prepare for upcoming exascale systems that will use a variety of GPU vendors. The key calculations, namely, the Lamarckian genetic algorithm combined with a local search using a Solis-Wets based random optimization algorithm, are implemented. We developed versions of the miniapp using several different programming models for GPU acceleration, including a version using the CUDA runtime API for NVIDIA GPUs, and the Kokkos middle-ware API which is facilitated by C++ template libraries. A third version, currently in progress, uses the HIP programming model. These efforts will help facilitate the transition to exascale systems for this important emerging HPC application, as well as its use on a wide range of heterogeneous platforms.","","978-1-6654-2287-1","10.1109/P3HPC51967.2020.00009","Battelle; U.S. Department of Energy; Office of Science; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9309044","heterogeneous system;high-performance computing;performance portability;hybrid parallel programming model;molecular docking;drug discovery","Graphics processing units;Proteins;Optimization;Programming;Leadership;Hip;COVID-19","application program interfaces;biology computing;coprocessors;drugs;genetic algorithms;graphics processing units;mainframes;molecular biophysics;parallel architectures;parallel machines;parallel processing;proteins","molecular docking miniapp;Leadership Computing platforms;high-performance computing facilities;COVID-19 pandemic;computational drug discovery;supercomputers;GPU acceleration;Oak Ridge Leadership Computing Facility;GPU-accelerated program AutoDock-GPU;Summit supercomputer;miniAutoDock-GPU;GPU-accelerated protein-ligand docking programs;computer architectures;petascale systems;exascale systems;GPU vendors;Lamarckian genetic algorithm;random optimization algorithm;HIP programming model;HPC application;NVIDIA GPU;Kokkos middleware API","","1","","14","","1 Jan 2021","","","IEEE","IEEE Conferences"
"A Formal Instruction-level GPU Model for Scalable Verification","Y. Xing; B. Huang; A. Gupta; S. Malik",Princeton University; Princeton University; Princeton University; Princeton University,"2018 IEEE/ACM International Conference on Computer-Aided Design (ICCAD)","3 Jan 2019","2018","","","1","8","GPUs have been widely used to accelerate big-data inference applications and scientific computing through their parallelized hardware resources and programming model. Their extreme parallelism increases the possibility of bugs such as data races and un-coalesced memory accesses, and thus verifying program correctness is critical. State-of-the-art GPU program verification efforts mainly focus on analyzing application-level programs, e.g., in C, and suffer from the following limitations: (1) high false-positive rate due to coarse-grained abstraction of synchronization primitives, (2) high complexity of reasoning about pointer arithmetic, and (3) keeping up with an evolving API for developing application-level programs. In this paper, we address these limitations by modeling GPUs and reasoning about programs at the instruction level. We formally model the Nvidia GPU at the parallel execution thread (PTX) level using the recently proposed Instruction-Level Abstraction (ILA) model for accelerators. PTX is analogous to the Instruction-Set Architecture (ISA) of a general-purpose processor. Our formal ILA model of the GPU includes non-synchronization instructions as well as all synchronization primitives, enabling us to verify multithreaded programs. We demonstrate the applicability of our ILA model in scalable GPU program verification of data-race checking. The evaluation shows that our checker outperforms state-of-the-art GPU data race checkers with fewer false-positives and improved scalability.","1558-2434","978-1-4503-5950-4","10.1145/3240765.3240771","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8587727","","Graphics processing units;Instruction sets;Synchronization;Computational modeling;Registers;Programming;Hardware","application program interfaces;graphics processing units;instruction sets;multiprocessing systems;multi-threading;program diagnostics;program verification;reasoning about programs","formal Instruction-level GPU model;scalable verification;big-data inference applications;parallelized hardware resources;programming model;data races;program correctness;application-level programs;coarse-grained abstraction;synchronization primitives;Nvidia GPU;parallel execution thread level;formal ILA model;nonsynchronization instructions;multithreaded programs;scalable GPU program verification;data-race checking;instruction-set architecture;GPU data race checkers;instruction-level abstraction model;GPU program verification efforts","","","","20","","3 Jan 2019","","","IEEE","IEEE Conferences"
"Unified Execution Mode in a GPU-Style Softcore","P. Thontirawong; P. Chongstitvatana","Dept. of Comput. Eng., Chulalongkorn Univ., Bangkok, Thailand; Dept. of Comput. Eng., Chulalongkorn Univ., Bangkok, Thailand","2013 International Conference on Information Science and Applications (ICISA)","15 Aug 2013","2013","","","1","4","A GPU-style processor has large amount of processing power on a given die compared to a general purpose processor. However, a Graphic Processing Unit must be executed in lock-step where a group of cores execute the same instruction. This constraint puts a real limitation on programming of a GPU. This work proposed a design of a processor that unifies the execution of Graphic Processing Units and a general purpose processor. The discussion of programming model of vectorised instructions and the extension to allow multi-cores to run independently is presented. The proposed design required only 3% additional resource compared to the original design. This design is suitable for embedded applications.","2162-9048","978-1-4799-0604-8","10.1109/ICISA.2013.6579365","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6579365","","Graphics processing units;Multicore processing;Registers;Logic gates;Programming;Benchmark testing;Process control","embedded systems;graphics processing units;multiprocessing systems;parallel processing;resource allocation","GPU-style softcore;GPU-style processor;processing power;graphic processing unit;lock-step;general purpose processor;programming model;vectorised instructions;multicores;unified execution mode;embedded applications","","","","7","","15 Aug 2013","","","IEEE","IEEE Conferences"
"Parallel Computing Accelerated Image Inpainting using GPU CUDA, Theano, and Tensorflow","H. T. R. Adie; I. A. Pradana; Pranowo","Department of Informatic Engineering, Universitas Atma Jaya Yogyakarta, Yogyakarta, Indonesia; Department of Informatic Engineering, Universitas Atma Jaya Yogyakarta, Yogyakarta, Indonesia; Department of Informatic Engineering, Universitas Atma Jaya Yogyakarta, Yogyakarta, Indonesia","2018 10th International Conference on Information Technology and Electrical Engineering (ICITEE)","15 Nov 2018","2018","","","621","625","Image inpainting refers to image restoration process that reconstruct damaged image to obtain it lost information based on existing information. PDE-based approach is commonly used for image interpolation especially inpainting. Since PDE process express convolution and continuous change, the approach may take a lot of computational resources and will run slow on standard computer CPU. To overcome that, GPU parallel computing method for PDE-based image inpainting are proposed. These days, some handy platform or frameworks to utilize GPU are already exist like CUDA, Theano and Tensorflow. CUDA is well-known as parallel computing platform and programming model to work with programming language such as C/C++. In other hand Theano and Tensorflow is a bit different thing, both of them is a machine learning framework based on Python that also able to utilize GPU. Although Theano and Tensorflow are specialized for machine learning and deep learning, the system is general enough to applied for computational process like image inpainting. The results of this work show benchmark performance of PDE image inpainting running on CPU using C++, Theano, and Tensorflow and on GPU with CUDA, Theano, and Tensorflow. The benchmark shows that parallel computing accelerated PDE image inpainting can run faster on GPU either with CUDA, Theano, or Tensorflow compared to PDE image inpainting running on CPU.","","978-1-5386-4739-4","10.1109/ICITEED.2018.8534858","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8534858","Image Inpainting;PDE;Parallel Computing;GPU;CUDA;Theano;Tensorflow","Graphics processing units;Parallel processing;Mathematical model;Handheld computers;Convolution;Heating systems;Acceleration","computer graphics;graphics processing units;image restoration;interpolation;learning (artificial intelligence);parallel architectures;partial differential equations;Python","parallel computing accelerated image inpainting;GPU CUDA;Theano;Tensorflow;image restoration process;image interpolation;GPU parallel computing method;PDE-based image inpainting;parallel computing platform;programming model;computer CPU;handy platform;machine learning framework;Python;deep learning;C++","","3","","13","","15 Nov 2018","","","IEEE","IEEE Conferences"
"Efficient data classification by GPU-accelerated linear mean squared slack minimization","G. A. Papakostas; K. I. Diamantaras","EMaTTech, Dept. Computer and Informatics Engineering, Kavala 65404, Greece; TEI of Thessaloniki, Dept. Information Technology, Sindos 57400, Greece","2014 IEEE International Workshop on Machine Learning for Signal Processing (MLSP)","20 Nov 2014","2014","","","1","6","An efficient parallel implementation of the recently proposed Slackmin classification algorithm that minimizes the mean squared slack variables energy is proposed in this paper. The efficacy of the resulted scheme is demonstrated both in terms of accuracy and computation speed. The parallelization of the Slackmin algorithm is achieved in the framework of GPU programming. Based on this framework the “cuLSlackmin” algorithm for linear problems was implemented, by using the CUDA C/C++ programming model and proposed herein. The introduced parallel algorithm is making use of the advantages imposed by the GPU architecture and achieves high classification rates in a short computation time. A set of experiments with some UCI datasets have shown the high performance of the cuLSlackmin algorithm compared to the Slackmin, LIBSVM and GPULIBSVM algorithms. The high performance of cuLSlackmin algorithm makes it appropriate for big data classification problems.","2378-928X","978-1-4799-3694-6","10.1109/MLSP.2014.6958885","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6958885","big data classification;machine learning;GPU programming;CUDA;slack minimization","Graphics processing units;Classification algorithms;Big data;Accuracy;Training;Machine learning algorithms;Instruction sets","Big Data;C++ language;graphics processing units;parallel algorithms;parallel architectures;pattern classification","GPU-accelerated linear mean squared slack minimization;parallel implementation;Slackmin classification algorithm;mean squared slack variables energy minimization;computation speed;Slackmin algorithm parallelization;GPU programming;cuLSlackmin algorithm;linear problem;CUDA C/C++ programming model;parallel algorithm;GPU architecture;classification rate;computation time;UCI dataset;GPULIBSVM algorithm;big data classification problem","","1","","22","","20 Nov 2014","","","IEEE","IEEE Conferences"
"GGAKE: GPU Based Genome Assembly Using K-Mer Extension","A. Garg; A. Jain; K. Paul","Dept. of Comput. Sci. & Eng., IIT Delhi, New Delhi, India; Dept. of Comput. Sci. & Eng., IIT Delhi, New Delhi, India; Dept. of Comput. Sci. & Eng., IIT Delhi, New Delhi, India","2013 IEEE 10th International Conference on High Performance Computing and Communications & 2013 IEEE International Conference on Embedded and Ubiquitous Computing","12 Jun 2014","2013","","","1105","1112","The genome assembly problem involves constructing the complete genome sequence from the reads generated by the sequencers. The Next Generation Sequencing (NGS) platforms produce a large number of short reads at a very low cost. Many assemblers have been developed to work with NGS reads. The assembly process is computation intensive and also requires a large amount of memory to store the reads. Numerous efforts are being made in recent times to parallelize the assembly process in order to reduce computation time. In this paper we present the design and development of a GPU based genome assembler (GGAKE). Our assembler works using the concept of k-mer extension. Prefix and suffix k-mers are spotted out of every read. Suffix k-mers are matched with prefix k-mers and extensions for every read are noted. Contigs are generated by extending the reads. We have implemented GGAKE on Nvidia's GPU using the CUDA programming model and benchmarked it on five bacterial genomes. Our results prove that at high coverage GGAKE is capable of producing good quality assembly in a small amount of time.","","978-0-7695-5088-6","10.1109/HPCC.and.EUC.2013.156","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6832038","parallel processing;bioinformatics;GPU;genome assembly","Graphics processing units;DNA;Bioinformatics;Assembly;Genomics;Encoding;Sorting","biology computing;cellular biophysics;genomics;graphics processing units;microorganisms;parallel architectures;parallel programming","GGAKE;GPU based genome assembly;genome sequence;next generation sequencing platforms;NGS reads;assembly process parallelization;GPU based genome assembler;k-mer extension;Nvidia's GPU;CUDA programming model;bacterial genomes;contig generation","","3","","21","","12 Jun 2014","","","IEEE","IEEE Conferences"
"Shared Memory and GPU Parallelization of an Operational Atmospheric Transport and Dispersion Application","F. Yu; P. Strazdins; J. Henrichs; T. Pugh",The Australian National University; The Australian National University; Bureau of Meteorology; Bureau of Meteorology,"2019 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","29 Jul 2019","2019","","","729","738","The HYSPLIT air concentration model is an operational Lagrangian trajectory and dispersion model that calculates the concentration or the distribution of pollutants by releasing and tracking particles or puffs. It is widely used for tracking and forecasting the release of pollutants such as radioactive material, dust storms and volcanic ash. Due to the massively parallel nature of the particle tracking system, the HYSPLIT model shows potential to be accelerated by multiple CPUs and GPUs. However, porting such a legacy application to a GPU requires non-trivial work to isolate the parallel code regions and correctly adapt the code to a parallel programming model. This paper presents methods to port the current HYSPLIT code to the shared-memory OpenMP and the CUDA programming models. In the OpenMP approach, the original HYSPLIT concentration model is analyzed, profiled and refactored to remove barriers for parallelizing on multi-core CPUs. A linear speed-up with some serial overhead is achieved for the OpenMP version. In the CUDA approach, we utilize the computing power of NVIDIA GTX960 and Tesla P100 GPUs, providing 4-5× faster overall performance than the original. With the help of GPU coarse-grained parallelism, a maximum 12.9× speedup has been measured, compared to the original program running on a CPU. The disturbance of different parallelization approaches to the original code base shows that most of the highly difficult work is in the refactoring, and that CUDA requires extensive, but mostly relatively shallow, changes.","","978-1-7281-3510-6","10.1109/IPDPSW.2019.00121","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8778420","Lagrangian trajectory and dispersion model, HYSPLIT, GPU acceleration, CUDA Fortran, OpenMP, MPI, CUDA coarse grained parallelism, High performance computing","Atmospheric modeling;Graphics processing units;Computational modeling;Dispersion;Mathematical model;Meteorology;Parallel processing","computer graphic equipment;graphics processing units;message passing;parallel algorithms;parallel architectures;parallel processing;parallel programming;shared memory systems","shared memory;GPU parallelization;operational atmospheric transport;dispersion application;HYSPLIT air concentration model;dispersion model;tracking particles;puffs;radioactive material;dust storms;volcanic ash;massively parallel nature;particle tracking system;HYSPLIT model;multiple CPUs;legacy application;nontrivial work;parallel code regions;parallel programming model;current HYSPLIT code;shared-memory OpenMP;CUDA programming models;OpenMP approach;original HYSPLIT concentration model;OpenMP version;CUDA approach;GPU coarse-grained parallelism;original program;multicore CPU;parallelization approaches;Tesla P100 GPU;original code base;NVIDIA GTX960","","","","14","","29 Jul 2019","","","IEEE","IEEE Conferences"
"Architecting Waferscale Processors - A GPU Case Study","S. Pal; D. Petrisko; M. Tomei; P. Gupta; S. S. Iyer; R. Kumar","Dept. of Electr. & Comput. Eng., Univ. of California, Los Angeles, Los Angeles, CA, USA; Dept. of Electr. & Comput. Eng., Univ. of Illinois at Urbana-Champaign, Urbana, IL, USA; Dept. of Electr. & Comput. Eng., Univ. of Illinois at Urbana-Champaign, Urbana, IL, USA; Dept. of Electr. & Comput. Eng., Univ. of California, Los Angeles, Los Angeles, CA, USA; Dept. of Electr. & Comput. Eng., Univ. of California, Los Angeles, Los Angeles, CA, USA; Dept. of Electr. & Comput. Eng., Univ. of Illinois at Urbana-Champaign, Urbana, IL, USA","2019 IEEE International Symposium on High Performance Computer Architecture (HPCA)","28 Mar 2019","2019","","","250","263","Increasing communication overheads are already threatening computer system scaling. One approach to dramatically reduce communication overheads is waferscale processing. However, waferscale processors [1], [2], [3] have been historically deemed impractical due to yield issues [1], [4] inherent to conventional integration technology. Emerging integration technologies such as Silicon-Interconnection Fabric (Si-IF) [5], [6], [7], where pre-manufactured dies are directly bonded on to a silicon wafer, may enable one to build a waferscale system without the corresponding yield issues. As such, waferscalar architectures need to be revisited. In this paper, we study if it is feasible and useful to build today's architectures at waferscale. Using a waferscale GPU as a case study, we show that while a 300 mm wafer can house about 100 GPU modules (GPM), only a much scaled down GPU architecture with about 40 GPMs can be built when physical concerns are considered. We also study the performance and energy implications of waferscale architectures. We show that waferscale GPUs can provide significant performance and energy efficiency advantages (up to 18.9x speedup and 143x EDP benefit compared against equivalent MCM-GPU based implementation on PCB) without any change in the programming model. We also develop thread scheduling and data placement policies for waferscale GPU architectures. Our policies outperform state-of-art scheduling and data placement policies by up to 2.88x (average 1.4x) and 1.62x (average 1.11x) for 24 GPM and 40 GPM cases respectively. Finally, we build the first Si-IF prototype with interconnected dies. We observe 100% of the inter-die interconnects to be successfully connected in our prototype. Coupled with the high yield reported previously for bonding of dies on Si-IF, this demonstrates the technological readiness for building a waferscale GPU architecture.","2378-203X","978-1-7281-1444-6","10.1109/HPCA.2019.00042","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8675211","Waferscale Processors;GPU;Silicon Interconnect Fabric","Graphics processing units;Silicon;Integrated circuit interconnections;Copper;Substrates;Computer architecture","cache storage;coprocessors;graphics processing units;integrated circuit interconnections;multiprocessing systems;parallel algorithms;parallel processing;silicon","GPU modules;GPM cases;silicon-interconnection fabric;Si-IF;waferscale processing;threatening computer system scaling;communication overheads;GPU case study;waferscale processors;state-of-art scheduling;waferscale GPU architecture;data placement policies;thread scheduling;equivalent MCM-GPU;energy efficiency advantages;waferscale architectures;waferscalar architectures;corresponding yield issues;waferscale system;silicon wafer;pre-manufactured dies;integration technologies;conventional integration technology;Si","","14","","82","","28 Mar 2019","","","IEEE","IEEE Conferences"
"BigKernel -- High Performance CPU-GPU Communication Pipelining for Big Data-Style Applications","R. Mokhtari; M. Stumm","Dept. of Electr. & Comput. Eng., Univ. of Toronto, Toronto, ON, Canada; Dept. of Electr. & Comput. Eng., Univ. of Toronto, Toronto, ON, Canada","2014 IEEE 28th International Parallel and Distributed Processing Symposium","14 Aug 2014","2014","","","819","828","GPUs offer an order of magnitude higher compute power and memory bandwidth than CPUs. GPUs therefore might appear to be well suited to accelerate computations that operate on voluminous data sets in independent ways, e.g., for transformations, filtering, aggregation, partitioning or other ""Big Data"" style processing. Yet experience indicates that it is difficult, and often error-prone, to write GPGPU programs which efficiently process data that does not fit in GPU memory, partly because of the intricacies of GPU hardware architecture and programming models, and partly because of the limited bandwidth available between GPUs and CPUs. In this paper, we propose Big Kernel, a scheme that provides pseudo-virtual memory to GPU applications and is implemented using a 4-stage pipeline with automated prefetching to (i) optimize CPU-GPU communication and (ii) optimize GPU memory accesses. Big Kernel simplifies the programming model by allowing programmers to write kernels using arbitrarily large data structures that can be partitioned into segments where each segment is operated on independently, these kernels are transformed into Big Kernel using straight-forward compiler transformations. Our evaluation on six data-intensive benchmarks shows that Big Kernel achieves an average speedup of 1.7 over state-of-the-art double-buffering techniques and an average speedup of 3.0 over corresponding multi-threaded CPU implementations.","1530-2075","978-1-4799-3800-1","10.1109/IPDPS.2014.89","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6877313","GPU;CPU;communication;optimization;stream processing","Graphics processing units;Kernel;Prefetching;Arrays;Memory management;Pipelines","Big Data;data structures;graphics processing units;pipeline processing;program compilers;storage management","BigKernel scheme;high performance CPU-GPU communication pipelining;Big Data-style processing;memory bandwidth;magnitude higher compute power;voluminous data sets;GPGPU programs;GPU hardware architecture;GPU programming models;pseudovirtual memory;automated prefetching;GPU memory accesses;data structures;straight-forward compiler transformations;double-buffering techniques;multithreaded CPU","","11","2","20","","14 Aug 2014","","","IEEE","IEEE Conferences"
"Profiling Kernels Behavior to Improve CPU / GPU Interactions","R. Salgado","Pleiad Lab., Univ. of Chile, Santiago, Chile","2015 IEEE/ACM 37th IEEE International Conference on Software Engineering","17 Aug 2015","2015","2","","754","756","Most modern computer and mobile devices have a graphical processing unit (GPU) available for any general purpose computation. GPU supports a programming model that is radically different from traditional sequential programming. As such, programming GPU is known to be hard and error prone, despite the large number of available APIs and dedicated programming languages. In this paper we describe a profiling technique that reports on the interaction between a CPU and GPUs. The resulting execution profile may then reveal anomalies and suboptimal situations, in particular due to an improper memory configuration. Our profiler has been effective at identifying suboptimal memory allocation usage in one image processing application.","1558-1225","978-1-4799-1934-5","10.1109/ICSE.2015.239","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7203060","gpgpu;opencl;memory profiling;profiling","Graphics processing units;Kernel;Programming;Visualization;Central Processing Unit;Computers;Measurement","graphics processing units;storage management","kernel behavior profiling technique;CPU-GPU interactions;mobile devices;graphical processing unit;programming model;improper memory configuration;suboptimal memory allocation usage;image processing application","","","","9","","17 Aug 2015","","","IEEE","IEEE Conferences"
"Performance improvement of CUDA applications by reducing CPU-GPU data transfer overhead","N. V. Sunitha; K. Raju; N. N. Chiplunkar","Department of CSE, NMAMIT, Nitte; Department of CSE, NMAMIT, Nitte; Department of CSE, NMAMIT, Nitte","2017 International Conference on Inventive Communication and Computational Technologies (ICICCT)","17 Jul 2017","2017","","","211","215","In a CPU-GPU based heterogeneous computing system, the input data to be processed by the kernel resides in the host memory. The host and the device memory address spaces are different. Therefore, the device can not directly access the host memory. In CUDA programming model, the data is moved between the host memory and the device memory. This data transfer is a time consuming task. The communication overhead can be hidden by overlapping the data transfer and the kernel execution. CUDA streams provide a means for overlapping data transfer and the kernel execution. In this paper we explore the effects of overlapping data transfer and the kernel execution on overall execution time of some CUDA applications. The results show that the usage of the different levels of concurrency supported by the streams enhances the performance of the CUDA applications.","","978-1-5090-5297-4","10.1109/ICICCT.2017.7975190","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7975190","Heterogeneous system;CUDA;Kernel;Stream","Graphics processing units;Kernel;Data transfer;Concurrent computing;Engines;Performance evaluation;Central Processing Unit","concurrency (computers);electronic data interchange;graphics processing units;parallel architectures;parallel programming","performance improvement;CUDA applications;CPU-GPU data transfer overhead reduction;CPU-GPU based heterogeneous computing system;host memory;CUDA programming model;device memory;communication overhead;kernel execution;CUDA streams;overlapping data transfer;overall execution time;concurrency level","","4","","12","","17 Jul 2017","","","IEEE","IEEE Conferences"
"Selective GPU caches to eliminate CPU-GPU HW cache coherence","N. Agarwal; D. Nellans; E. Ebrahimi; T. F. Wenisch; J. Danskin; S. W. Keckler",University of Michigan; NVIDIA; NVIDIA; University of Michigan; NVIDIA; NVIDIA,"2016 IEEE International Symposium on High Performance Computer Architecture (HPCA)","4 Apr 2016","2016","","","494","506","Cache coherence is ubiquitous in shared memory multiprocessors because it provides a simple, high performance memory abstraction to programmers. Recent work suggests extending hardware cache coherence between CPUs and GPUs to help support programming models with tightly coordinated sharing between CPU and GPU threads. However, implementing hardware cache coherence is particularly challenging in systems with discrete CPUs and GPUs that may not be produced by a single vendor. Instead, we propose, selective caching, wherein we disallow GPU caching of any memory that would require coherence updates to propagate between the CPU and GPU, thereby decoupling the GPU from vendor-specific CPU coherence protocols. We propose several architectural improvements to offset the performance penalty of selective caching: aggressive request coalescing, CPU-side coherent caching for GPU-uncacheable requests, and a CPU-GPU interconnect optimization to support variable-size transfers. Moreover, current GPU workloads access many read-only memory pages; we exploit this property to allow promiscuous GPU caching of these pages, relying on page-level protection, rather than hardware cache coherence, to ensure correctness. These optimizations bring a selective caching GPU implementation to within 93% of a hardware cache-coherent implementation without the need to integrate CPUs and GPUs under a single hardware coherence protocol.","2378-203X","978-1-4673-9211-2","10.1109/HPCA.2016.7446089","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7446089","","Graphics processing units;Coherence;Hardware;Memory management;Bandwidth;Protocols;System-on-chip","cache storage;graphics processing units;microprocessor chips;protocols;shared memory systems","HW cache coherence;hardware cache coherence;shared memory multiprocessor;programming model;aggressive request coalescing;CPU-side coherent caching;CPU-GPU interconnect optimization;hardware coherence protocol","","38","7","70","","4 Apr 2016","","","IEEE","IEEE Conferences"
"The Unicorn Runtime: Efficient Distributed Shared Memory Programming for Hybrid CPU-GPU Clusters","T. Beri; S. Bansal; S. Kumar","Department of Computer Science and Engineering, Indian Institute of Technology, Delhi, India; Department of Computer Science and Engineering, Indian Institute of Technology, Delhi, India; Department of Computer Science and Engineering, Indian Institute of Technology, Delhi, India","IEEE Transactions on Parallel and Distributed Systems","12 Apr 2017","2017","28","5","1518","1534","Programming hybrid CPU-GPU clusters is hard. This paper addresses this difficulty and presents the design and runtime implementation of Unicorn-a parallel programming model for hybrid CPU-GPU clusters. In particular, this paper proves that efficient distributed shared memory style programing is possible and its simplicity can be retained across CPUs and GPUs in a cluster, minus the frustration of dealing with race conditions. Further, this can be done with a unified abstraction, avoiding much of the complication of dealing with hybrid architectures. This is achieved with the help of transactional semantics (on shared global address spaces), deferred bulk data synchronization, workload pipelining and various communication and computation scheduling optimizations. We describe the said abstraction, our computation and communication scheduling system and report its performance on a few benchmarks like Matrix Multiplication, LU Decomposition and 2D FFT. We find that parallelization of coarse-grained applications like matrix multiplication or 2D FFT using our system requires only about 30 lines of C code to set up the runtime. The rest of the application code is regular single CPU/GPU implementation. This indicates the ease of extending parallel code to a distributed environment. The execution is efficient as well. When multiplying two square matrices of size 65, 536 χ 65,536, Unicornachieves a peak performance of 7.88 TFlop/s when run over a cluster of 14 nodes with each node equipped with two Tesla M2070 GPUs and two 6-core Intel Xeon 2.67 GHz CPUs, connected over a 32Gbps Infiniband network. In this paper, we also demonstrate that the Unicorn programming model can be efficiently used to implement high level abstractions like MapReduce. We use such an extension to implement PageRank and report its performance. For a sample web of 500 million web pages, our implementation completes a page rank iteration in about 18 seconds (on average) on a 14-node cluster.","1558-2183","","10.1109/TPDS.2016.2616314","Ministry of Earth Sciences; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7588161","Unicorn runtime;distributed system design;scheduling;load balancing;accelerators;bulk synchronous parallelism","Runtime;Programming;Optimization;Processor scheduling;Kernel;Synchronization;Graphics processing units","distributed shared memory systems;fast Fourier transforms;graphics processing units;information retrieval;Internet;mathematics computing;matrix multiplication;parallel programming;pipeline processing;processor scheduling;programming language semantics;transaction processing","Unicorn runtime;distributed shared memory programming;hybrid CPU-GPU clusters;parallel programming model;unified abstraction;transactional semantics;bulk data synchronization;workload pipelining;computation scheduling optimizations;communication scheduling optimizations;matrix multiplication;LU decomposition;2D FFT;coarse-grained applications;C code;application code;parallel code;Tesla M2070 GPU;6-core Intel Xeon CPU;Infiniband network;Unicorn programming model;PageRank implementation;page rank iteration;Web pages","","6","","40","IEEE","11 Oct 2016","","","IEEE","IEEE Journals"
"PACXX: Towards a Unified Programming Model for Programming Accelerators Using C++14","M. Haidl; S. Gorlatch","Univ. of Muenster, Muenster, Germany; Univ. of Muenster, Muenster, Germany","2014 LLVM Compiler Infrastructure in HPC","30 Mar 2015","2014","","","1","11","We present PACXX -- a unified programming model for programming many-core systems that comprise accelerators like Graphics Processing Units (GPUs). One of the main difficulties of the current GPU programming is that two distinct programming models are required: the host code for the CPU is written in C/C++ with the restricted, C-like API for memory management, while the device code for the GPU has to be written using a device-dependent, explicitly parallel programming model, e.g., OpenCL or CUDA. This leads to long, poorly structured and error-prone codes. In PACXX, both host and device programs are written in the same programming language -- the newest C++14 standard, with all modern features including type inference (auto), variadic templates, generic lambda expressions, as well as STL containers and algorithms. We implement PACXX by a custom compiler (based on the Clang front-end and LLVM IR) and a runtime system, that together perform major tasks of memory management and data synchronization automatically and transparently for the programmer. We evaluate our approach by comparing it to CUDA and OpenCL regarding program size and target performance.","","978-1-4799-7023-0","10.1109/LLVM-HPC.2014.9","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7069296","","Kernel;Graphics processing units;Programming;Vectors;Synchronization;Runtime;Standards","application program interfaces;C++ language;graphics processing units;multiprocessing systems;parallel architectures;parallel programming;program compilers;reasoning about programs;storage management;type theory","PACXX;unified programming model;programming accelerator;many-core system;graphics processing units;GPU programming;C/C++;C-like API;memory management;device code;device-dependent programming model;parallel programming model;OpenCL;CUDA;error-prone code;host program;device program;programming language;C++14 standard;type inference;variadic template;generic lambda expression;STL container;custom compiler;Clang front-end;LLVM IR;runtime system;data synchronization","","19","","15","","30 Mar 2015","","","IEEE","IEEE Conferences"
"An Efficient Parallelization Strategy for Dynamic Programming on GPU","K. Berger; F. Galea","LIST Embedded Real Time Syst. Lab., CEA, Gif-sur-Yvette, France; LIST Embedded Real Time Syst. Lab., CEA, Gif-sur-Yvette, France","2013 IEEE International Symposium on Parallel & Distributed Processing, Workshops and Phd Forum","31 Oct 2013","2013","","","1797","1806","Optimization methods generally do not fall into the most suitable algorithms for parallelization on a GPU. However, a relatively good efficiency still can be obtained if the method is properly adapted to the GPU programming model, which is the case for dynamic programming. In this article, we propose a parallelization strategy for thread grouping for dynamic programming in CUDA. We show that parametrizing the solver parallelism according to the hardware allows better performance. The strategy provides good acceleration compared to a standard GPU parallel strategy on a dynamic programming-based implementation of the knapsack problem. We show this strategy is helpful in the case of the multi-dimensional knapsack problem, where computing multi-dimensional indices is a costly operation.","","978-0-7695-4979-8","10.1109/IPDPSW.2013.208","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6651080","dynamic programming;parallelism;knapsack problem;GPU computing;combinatorial optimization;CUDA","Graphics processing units;Instruction sets;Vectors;Dynamic programming;Kernel;Parallel processing;Arrays","dynamic programming;graphics processing units;knapsack problems;parallel architectures","multidimensional indices;multidimensional knapsack problem;dynamic programming based implementation;standard GPU parallel strategy;hardware;solver parallelism;CUDA;GPU programming model;optimization methods;parallelization strategy","","9","","34","","31 Oct 2013","","","IEEE","IEEE Conferences"
"CUDA parallel programming model","M. Garland","NVIDIA Research, USA","2008 IEEE Hot Chips 20 Symposium (HCS)","4 Jul 2016","2008","","","1","29","Presents a collection of slides covering the following topics: parallel threads; parallel algorithms; heterogeneous systems; CPU; GPU; concurrent threads; shared memory model; vector addition kernel; block synchronization; thread block; per-block shared memory; parallel reduction; serial SAXPY routine; and parallel SAXPY routine.","","978-1-4673-8871-9","10.1109/HOTCHIPS.2008.7476519","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7476519","","Instruction sets;Graphics processing units;Tutorials;Parallel programming;Kernel;Parallel algorithms;Synchronization","concurrency control;graphics processing units;multi-threading;parallel algorithms;parallel architectures;shared memory systems","parallel threads;parallel algorithms;CUDA parallel programming model;heterogeneous systems;CPU;GPU;concurrent threads;shared memory model;vector addition kernel;block synchronization;thread block;per-block shared memory;parallel reduction;serial SAXPY routine;parallel SAXPY routine","","1","","","","4 Jul 2016","","","IEEE","IEEE Conferences"
"POSTER - collective dynamic parallelism for directive based GPU programming languages and compilers","G. Ozen; E. Ayguade; J. Labarta","Barcelona Supercomputing Center, Universitat Politecnica de Catalunya, Spain; Barcelona Supercomputing Center, Universitat Politecnica de Catalunya, Spain; Barcelona Supercomputing Center, Universitat Politecnica de Catalunya, Spain","2016 International Conference on Parallel Architecture and Compilation Techniques (PACT)","1 Dec 2016","2016","","","423","424","Early programs for GPU (Graphics Processing Units) acceleration were based on a flat, bulk parallel programming model, in which programs had to perform a sequence of kernel launches from the host CPU. In the latest releases of these devices, dynamic (or nested) parallelism is supported, making possible to launch kernels from threads running on the device, without host intervention. Unfortunately, the overhead of launching kernels from the device is higher compared to launching from the host CPU, making the exploitation of dynamic parallelism unprofitable. This paper proposes and evaluates the basic idea behind a user-directed code transformation technique, named collective dynamic parallelism, that targets the effective exploitation of nested parallelism in modern GPUs. The technique dynamically packs dynamic parallelism kernel invocations and postpones their execution until a bunch of them are available. We show that for sparse matrix vector multiplication, CollectiveDP outperforms well optimized libraries, making GPU useful when matrices are highly irregular.","","978-1-4503-4121-9","10.1145/2967938.2974056","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7756778","","Kernel;Parallel processing;Graphics processing units;Context;Sparse matrices;Parallel programming;Libraries","graphics processing units;matrix multiplication;microprocessor chips;parallel programming;program compilers;programming languages;vectors","programming languages;program compilers;graphics processing units;GPU;parallel programming model;host CPU;user-directed code transformation;collective dynamic parallelism;sparse matrix vector multiplication","","","","3","","1 Dec 2016","","","IEEE","IEEE Conferences"
"GPU accelerated three dimensional unstructured geometric multigrid solver","J. Sebastian; N. Sivadasan; R. Banerjee","Dept. of Computer Science and Engineering, Indian Institute of Technology Hyderabad, India; Dept. of Computer Science and Engineering, Indian Institute of Technology Hyderabad, India; Dept. of Mechanical Engineering, Indian Institute of Technology Hyderabad, India","2014 International Conference on High Performance Computing & Simulation (HPCS)","22 Sep 2014","2014","","","9","16","Graphics processor units (GPUs) have started becoming an integral part of high performance computing. We develop a GPU based 3D-unstructured geometric multigrid solver, which is extensively used in Computational Fluid Dynamics (CFD) applications. Parallelization for GPUs is not straightforward because of the irregularity of the mesh. Using combination of graph coloring and greedy maximal independent set computations, we obtain significant performance improvements in the multigrid solver and its parallelization. We use NVIDIAs CUDA programming model for the implementation. In our experiments, we solve heat conduction problems on unstructured 3D meshes. Different schemes for implementing the multigrid algorithm are evaluated. For a mesh of size 1.6 million, our multigrid GPU implementation gives 24 times speed up compared to multigrid serial implementation and 1630 times speed up compared to non-multigrid serial implementation.","","978-1-4799-5313-4","10.1109/HPCSim.2014.6903663","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6903663","GPU Computing;High Performance Computing;Computational Fluid Dynamics;Multigrid Flow Solver","Graphics processing units;Instruction sets;Image color analysis;Iterative methods;Smoothing methods;Computational fluid dynamics;Jacobian matrices","computational fluid dynamics;differential equations;graph colouring;graphics processing units;greedy algorithms;heat conduction;mechanical engineering computing;mesh generation;parallel architectures","GPU accelerated three dimensional unstructured geometric multigrid solver;graphics processor units;high performance computing;GPU based 3D-unstructured geometric multigrid solver;computational fluid dynamics;CFD;mesh irregularity;graph coloring;greedy maximal independent set computations;NVIDIA CUDA programming model;heat conduction problems;unstructured 3D mesh;multigrid serial implementation;nonmultigrid serial implementation","","3","","29","","22 Sep 2014","","","IEEE","IEEE Conferences"
"Accelerating of color moments and texture features extraction using GPU based parallel computing","H. Heidari; A. Chalechale; A. A. Mohammadabadi","Department of Computer Engineering Razi University Kermanshah, Iran; Department of Computer Engineering Razi University Kermanshah, Iran; Department of Computer Engineering Razi University Kermanshah, Iran","2013 8th Iranian Conference on Machine Vision and Image Processing (MVIP)","31 Mar 2014","2013","","","430","435","Image retrieval tools can assist people in making efficient use of digital image collections; also it has become imperative to find efficient methods for the retrieval of these images. Most image processing algorithms are inherently parallel, so multithreading processors are suitable in such applications. In very big image databases, image processing takes very long time for run on a single core processor because of single thread execution of algorithms. GPU is more common in most image processing applications due to multithread execution of algorithms, programmability and low cost. In this paper we implement color moments and texture based image retrieval (entropy, standard deviation and local range) in parallel using CUDA programming model to run on GPUs. These features are applied to search images from a database which are similar to a query image. We evaluated our retrieval system using recall, precision, and average precision measures. Experimental results showed that parallel implementation led to an average speed up of 144.67×over the serial implementation when running on a NVIDIA GPU GeForce GT610M. Also the average precision and the average recall of proposed method are 61.968% and 55% respectively.","2166-6784","978-1-4673-6184-2","10.1109/IranianMVIP.2013.6780024","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6780024","color moment;CUDA;GPU;texture based image retrieval","Feature extraction;Graphics processing units;Image color analysis;Image retrieval;Shape;Instruction sets","feature extraction;graphics processing units;image colour analysis;image retrieval;image texture;multi-threading;parallel architectures","color moments;texture features extraction;GPU based parallel computing;graphics processing unit;image retrieval tools;digital image collections;image processing algorithms;multithreading processors;very big image databases;CUDA programming model;compute unified device architecture;recall measure;precision measure;average precision measure;NVIDIA GPU GeForce GT610M","","2","","23","","31 Mar 2014","","","IEEE","IEEE Conferences"
"Parallel Monte Carlo Integration Algorithm Based on GPU","H. Zong; R. Hua; J. Zhao; Z. Cao","Huaiyin Institute of Technology,Faculty of Computer and Software Engineering,Huaian,China; Huaiyin Institute of Technology,Faculty of Computer and Software Engineering,Huaian,China; Huaiyin Institute of Technology,Faculty of Computer and Software Engineering,Huaian,China; Nanjing University of Aeronautics and Astronautics,College of Computer Science and Technology,Nanjing,China","2019 IEEE 14th International Conference on Intelligent Systems and Knowledge Engineering (ISKE)","18 Aug 2020","2019","","","790","794","Big data comes with the increasing maturity of computer network technology and its application popularity. How to process big data and mine its potential value is a hot issue today. Artificial intelligence is one of the main sources of algorithms for dealing with big data, while parallel computation is the only choice to improve computing performance. Monte Carlo method plays an important role in the application of artificial intelligence, such as computer game AlphaGo, and it requires a lot of random data to calculate, so we use it, in this paper, to explore the general method of parallel processing big data. According to Monte Carlo method, the calculation time of the algorithm will increase exponentially with the increase of the calculation accuracy. As the calculation accuracy will increase accordingly when the number of points increases. In order to improve the computing performance, a Monte Carlo parallel algorithm based on GPU-CUDA programming model is designed. The quality of the random number generator is the key factor affecting the accuracy of Monte Carlo calculation, so the higher quality Mersenne Twister random number algorithm is chosen. Taking π and e as examples, the experimental results show that the GPU-based Monte Carlo parallel algorithm is effective. This method improves both the calculation performance and the calculation accuracy.","","978-1-7281-2348-6","10.1109/ISKE47853.2019.9170329","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9170329","GPU;Monte Carlo method;definite integral;parallel computing;random number","","graphics processing units;Monte Carlo methods;parallel algorithms;parallel architectures;parallel processing;random number generation","Monte Carlo calculation;higher quality Mersenne Twister random number algorithm;GPU-based Monte Carlo parallel algorithm;calculation performance;parallel Monte Carlo integration algorithm;increasing maturity;computer network technology;application popularity;artificial intelligence;parallel computation;computing performance;Monte Carlo method;computer game AlphaGo;random data;parallel processing big data;calculation time;points increases;GPU-CUDA programming model;random number generator","","","","7","","18 Aug 2020","","","IEEE","IEEE Conferences"
"Accelerating gene regulatory networks inference through GPU/CUDA programming","F. F. Borelli; R. Y. Camargo; D. C. Martins; B. Stransky; L. C. S. Rozante","Universidade Federal do ABC, Santo André-SP, Brazil; Universidade Federal do ABC, Santo André-SP, Brazil; Universidade Federal do ABC, Santo André-SP, Brazil; Universidade Federal do ABC, Santo André-SP, Brazil; Universidade Federal do ABC, Santo André-SP, Brazil","2012 IEEE 2nd International Conference on Computational Advances in Bio and medical Sciences (ICCABS)","12 Apr 2012","2012","","","1","6","Gene regulatory networks (GRN) inference is an important bioinformatics problem in which the gene interactions need to be deduced from gene expression data, such as microarray data. Feature selection methods can be applied to this problem. A feature selection technique is composed by two parts: a search algorithm and a criterion function. Among the search algorithms already proposed, there is the exhaustive search where the best feature subset is returned, although its computational complexity is unfeasible in almost all situations. The objective of this work is the development of a low cost parallel solution based on GPU architectures for exhaustive search with a viable cost-benefit. CUDA™ is a general purpose parallel architecture with a new parallel programming model allowing that the NVIDIA® GPUs solve complex problems in an efficient way. We developed a parallel algorithm for GRN inference based on the GPU/CUDA and encouraging speedups (60x) were achieved when assuming that each target gene has two predictors. The idea behind the proposed method can be applied considering three or more predictors for each target gene as well.","","978-1-4673-1321-6","10.1109/ICCABS.2012.6182628","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6182628","GRNs Inference;exhaustive search;mean conditional entropy;GPU Computing;CUDA","Graphics processing unit;Computer architecture;Entropy;Instruction sets;Random access memory;Prediction algorithms;Performance evaluation","bioinformatics;computational complexity;feature extraction;genetics;graphics processing units;inference mechanisms;parallel architectures;parallel programming","gene regulatory network inference;GPU-CUDA programming;bioinformatics;gene interactions;feature selection method;gene expression data;search algorithm;feature subset;computational complexity;GPU architectures;parallel architecture;parallel programming model;parallel algorithm;GRN inference;exhaustive search","","3","","17","","12 Apr 2012","","","IEEE","IEEE Conferences"
"Comparison of GPU and FPGA based hardware platforms for ultrasonic flaw detection using support vector machines","K. Virupakshappa; E. Oruklu; Y. Jiang; Y. Yuan","ECE Department, Illinois Institute of Technology, Chicago, IL, USA; ECE Department, Illinois Institute of Technology, Chicago, IL, USA; ECE Department, Illinois Institute of Technology, Chicago, IL, USA; ECE Department, Illinois Institute of Technology, Chicago, IL, USA","2017 IEEE International Ultrasonics Symposium (IUS)","2 Nov 2017","2017","","","1","1","Our earlier work on support vector machines (SVM) and ultrasonic flaw detection algorithms demonstrated i) highly accurate classifier performance and ii) the feasibility of the algorithm for real-time implementation on low-cost embedded systems with graphical processing units (GPU) and CUDA library (a parallel computing platform and programming model) support. This works extends the implementation to another programmable hardware platform, FPGA, and also evaluates the performance of a different numerical computation library, TensorFlow by Google.","1948-5727","978-1-5386-3383-0","10.1109/ULTSYM.2017.8091862","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8091862","","Graphics processing units;Support vector machines;Field programmable gate arrays;Libraries;Classification algorithms;Hardware;Acoustics","embedded systems;field programmable gate arrays;flaw detection;graphics processing units;parallel architectures;pattern classification;support vector machines","parallel computing;embedded systems;programmable hardware platform;programming model;ultrasonic flaw detection algorithms;support vector machines;FPGA;GPU","","","","","","2 Nov 2017","","","IEEE","IEEE Conferences"
"GPU-based Real-time Decoding Technique for High-definition Videos","H. Deng; C. Deng; J. Li","Sch. of Comput. Sci. & Eng., South China Univ. of Technol., Guangzhou, China; Dept. of Comput. Eng., South China Univ. of Technol., Guangzhou, China; Sch. of Software Eng., South China Univ. of Technol., Guangzhou, China","2012 Eighth International Conference on Intelligent Information Hiding and Multimedia Signal Processing","23 Aug 2012","2012","","","186","190","In this paper, we first discussed the video decoding standard and its architecture, and then analyzed the decoding complexity of each process. By using the benefit of the CUDA programming model, and taking advantages of GPU to optimize the decoding process of MC (motion compensation) and CSC(color space conversion) that are very time consuming, we proposed a MC accelerating method based on CUDA, and a CSC accelerating method based on CUDA and OpenGL shader. The experiments show that it is feasible to decode high definition video in real time using GPGPU-CUDA.","","978-1-4673-1741-2","10.1109/IIH-MSP.2012.51","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6274644","CUDA;real-time decoding;high-definition video;GPGPU;GLSL","Graphics processing unit;Decoding;Videos;Instruction sets;Kernel;Central Processing Unit;Real time systems","graphics processing units;image colour analysis;parallel architectures;video coding","GPU based real-time decoding technique;high definition videos;video decoding;CUDA programming model;motion compensation;MC;color space conversion;CSC;OpenGL shader","","1","","8","","23 Aug 2012","","","IEEE","IEEE Conferences"
"Coordinate strip-mining and kernel fusion to lower power consumption on GPU","G. Wang","National Laboratory for Parallel and Distributed Processing, School of Computer, National University of Defense Technology, Changsha, Hunan, China","2011 Design, Automation & Test in Europe","5 May 2011","2011","","","1","4","Although general purpose GPUs have relatively high computing capacity, they also introduce high power consumption compared with general purpose CPUs. Therefore low-power techniques targeted for GPUs will be one of the most hot topics in the future. On the other hand, in several application domains, users are unwilling to sacrifice performance to save power. In this paper, we propose an effective kernel fusion method to reduce the power consumption for GPUs without performance loss. Different from executing multiple kernels serially, the proposed method fuses several kernels into one larger kernel. Owing to the fact that most consecutive kernels in an application have data dependency and could not be fused directly, we split large kernel into multiple slices with strip-mining method, then fuse independent sliced kernels into one kernel. Based on the CUDA programming model, we propose three different kernel fusion implementations, with each one targeting for a special case. Based on the different strip-ming methods, we also propose two fusion mechanisms, which are called invariant-slice fusion and variant-slice fusion. The latter one could be better adapted to the requirements of the kernels to be fused. The experimental results validate that the proposed kernel fusion method could effectively reduce the power consumption for GPU.","1558-1101","978-3-9810801-8-6","10.1109/DATE.2011.5763317","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5763317","GPGPV;Kernel Fusion;Strip-mining;Power Efficiency","Kernel;Energy consumption;Graphics processing unit;Power demand;Instruction sets;Programming;Optimization","computer graphic equipment;coprocessors;general purpose computers;low-power electronics;parallel architectures;program slicing","coordinate strip-mining;kernel fusion;power consumption;general purpose GPU;low-power techniques;data dependency;CUDA programming model;invariant-slice fusion;graphics processing unit","","1","","10","","5 May 2011","","","IEEE","IEEE Conferences"
"A Case Study on the HACCmk Routine in SYCL on Integrated Graphics","Z. Jin; V. Morozov; H. Finkel","Argonne National Laboratory,Leadership Computing Facility,9700 S Cass Ave, Lemont,IL,60439; Argonne National Laboratory,Leadership Computing Facility,9700 S Cass Ave, Lemont,IL,60439; Argonne National Laboratory,Leadership Computing Facility,9700 S Cass Ave, Lemont,IL,60439","2020 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","28 Jul 2020","2020","","","368","374","As opposed to the Open Computing Language (OpenCL) programming model in which host and device codes are generally written in different languages, the SYCL programming model can combine host and device codes for an application in a type-safe way to improve development productivity. In this paper, we chose the HACCmk routine, a representative compute-bound kernel, as a case study on the performance of the SYCL programming model targeting a heterogeneous computing device. More specifically, we introduced the SYCL programming model, presented the OpenCL and SYCL implementations of the routine, and compared the performance of the two implementations using the offline and online compilation on Intel® IrisTM Pro integrated GPUs. We found that the overhead of online compilation may become significant compared to the execution time of a kernel. Compared to the performance of OpenCL implementations, the SYCL implementation can maintain the performance using the offline compilation. The number of execution units in a GPU are critical to improving the raw performance of a compute-bound kernel.","","978-1-7281-7445-7","10.1109/IPDPSW50202.2020.00071","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9150310","Programming model;Compilation modes;Compute-bound kernel;GPU","Kernel;Programming;Graphics processing units;Computational modeling;Performance evaluation;C++ languages","application program interfaces;graphics processing units;parallel processing;program compilers","SYCL programming model;online compilation;OpenCL implementation;SYCL implementation;HACCmk routine;Open Computing Language programming model;representative compute-bound kernel;heterogeneous computing device;Intel IrisTM Pro;GPU","","1","","26","","28 Jul 2020","","","IEEE","IEEE Conferences"
"Exploring the Suitability of Remote GPGPU Virtualization for the OpenACC Programming Model Using rCUDA","A. Castelló; A. J. Peña; R. Mayo; P. Balaji; E. S. Quintana-Ortí","Univ. Jaume I de Castello, Castello de la Plana, Spain; Argonne Nat. Lab., Argonne, IL, USA; Univ. Jaume I de Castello, Castello de la Plana, Spain; Argonne Nat. Lab., Argonne, IL, USA; Univ. Jaume I de Castello, Castello de la Plana, Spain","2015 IEEE International Conference on Cluster Computing","29 Oct 2015","2015","","","92","95","OpenACC is an application programming interface (API) that aims to unleash the power of heterogeneous systems composed of CPUs and accelerators such as graphic processing units (GPUs) or Intel Xeon Phi coprocessors. This directive-based programming model is intended to enable developers to accelerate their application's execution with much less effort. Coprocessors offer significant computing power but in many cases these devices remain largely underused because not all parts of applications match the accelerator architecture. Remote accelerator virtualization frameworks introduce a means to address this problem. In particular, the remote CUDA virtualization middleware rCUDA provides transparent remote access to any GPU installed in a cluster. Combining these two technologies, OpenACC and rCUDA, in a single scenario is naturally appealing. In this work we explore how the different OpenACC directives behave on top of a remote GPGPU virtualization technology in two different hardware configurations. Our experimental evaluation reveals favorable performance results when the two technologies are combined, showing low overhead and similar scaling factors when executing OpenACC-enabled directives.","2168-9253","978-1-4673-6598-7","10.1109/CLUSTER.2015.23","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7307570","GPUs;OpenACC;remote virtualization;rCUDA","Graphics processing units;Virtualization;Acceleration;Programming;Coprocessors;Kernel","graphics processing units;middleware;parallel architectures;virtualisation","GPGPU virtualization;graphics processing unit;OpenACC programming model;rCUDA;CUDA virtualization middleware;application programming interface;API;directive-based programming model;remote accelerator virtualization framework","","3","","12","","29 Oct 2015","","","IEEE","IEEE Conferences"
"A Performance Prediction Model for Memory-Intensive GPU Kernels","Z. Hu; G. Liu; Z. Hu","Coll. of Comput., Nat. Univ. of Defense Technol., Changsha, China; Coll. of Comput., Nat. Univ. of Defense Technol., Changsha, China; NA","2014 IEEE Symposium on Computer Applications and Communications","2 Oct 2014","2014","","","14","18","Commodity graphic processing units (GPUs) have rapidly evolved to become high performance accelerators for data-parallel computing through a large array of processing cores and the CUDA programming model with a C-like interface. However, optimizing an application for maximum performance based on the GPU architecture is not a trivial task for the tremendous change from conventional multi-core to the many-core architectures. Besides, the GPU vendors do not disclose much detail about the characteristics of the GPU's architecture. To provide insights into the performance of memory-intensive kernels, we propose a pipelined global memory model to incorporate the most critical global memory performance related factor, uncoalesced memory access pattern, and provide a basis for predicting performance of memory-intensive kernels. As we will demonstrate, the pipeline throughput is dynamic and sensitive to the memory access patterns. We validated our model on the NVIDIA GPUs using CUDA (Compute Unified Device Architecture). The experiment results show that the pipeline captures performance factors related to global memory and is able to estimate the performance for memory-intensive GPU kernels via the proposed model.","","978-0-7695-5319-1","10.1109/SCAC.2014.10","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6913158","GPU;CUDA;performance prediction;memory-intensive","Graphics processing units;Instruction sets;Kernel;Pipelines;Memory management;Random access memory;Throughput","DRAM chips;graphics processing units;parallel architectures;performance evaluation;pipeline processing","DRAM chips;memory-intensive GPU kernels;global memory;Compute Unified Device Architecture;CUDA;NVIDIA GPU;dynamic sensitive pipeline throughput;uncoalesced memory access pattern;critical global memory performance related factor;pipelined global memory model;memory-intensive kernel performance;GPU architecture;data-parallel computing;high-performance accelerators;graphic processing units;performance prediction model","","","","13","","2 Oct 2014","","","IEEE","IEEE Conferences"
"LoSCache: Leveraging Locality Similarity to Build Energy-Efficient GPU L2 Cache","J. Tan; K. Yan; S. L. Song; X. Fu","College of Computer Science and Technology, Jilin University, Changchun, China; College of Communication Engineering, Jilin University, Changchun, China; HPC Group, Pacific Northwest National Laboratory, Richland, USA; ECE Department, University of Houston, Houston, USA","2019 Design, Automation & Test in Europe Conference & Exhibition (DATE)","16 May 2019","2019","","","1190","1195","This paper presents a novel energy-efficient cache design for massively parallel, throughput-oriented architectures like GPUs. Unlike L1 data cache on modern GPUs, L2 cache shared by all the streaming multiprocessors is not the primary performance bottleneck but it does consume a large amount of chip energy. We observe that L2 cache is significantly under-utilized by spending 95.6% of the time storing useless data. If such ""dead time"" on L2 is identified and reduced, L2's energy efficiency can be drastically improved. Fortunately, we discover that the SIMT programming model of GPUs provides a unique feature among threads: instruction-level data locality similarity, which can be used to accurately predict the data re-reference counts at L2 cache block level. We propose a simple design that leverages this Locality Similarity to build an energy-efficient GPU L2 Cache, named LoSCache. Specifically, LoSCache uses the data locality information from a small group of CTAs to dynamically predict the L2-level data re-reference counts of the remaining CTAs. After that, specific L2 cache lines can be powered off if they are predicted to be ""dead"" after certain accesses. Experimental results on a wide range of applications demonstrate that our proposed design can significantly reduce the L2 cache energy by an average of 64% with only 0.5% performance loss.","1558-1101","978-3-9819263-2-3","10.23919/DATE.2019.8714911","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8714911","GPU;cache;energy-efficiency;locality similarity","Instruction sets;Graphics processing units;Kernel;Hardware;Programming;Data models;System-on-chip","cache storage;energy conservation;graphics processing units;multi-threading;parallel architectures;power aware computing","energy-efficient GPU L2 cache;L1 data cache;instruction-level data locality similarity;L2 cache block level;L2 cache energy;energy-efficient cache design;SIMT programming model;LoSCache;massively parallel architectures;single instruction multiple thread programming model","","","","20","","16 May 2019","","","IEEE","IEEE Conferences"
"dCUDA: Hardware Supported Overlap of Computation and Communication","T. Gysi; J. Bär; T. Hoefler",NA; NA; NA,"SC '16: Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis","16 Mar 2017","2016","","","609","620","Over the last decade, CUDA and the underlying GPU hardware architecture have continuously gained popularity in various high-performance computing application domains such as climate modeling, computational chemistry, or machine learning. Despite this popularity, we lack a single coherent programming model for GPU clusters. We therefore introduce the dCUDA programming model, which implements device-side remote memory access with target notification. To hide instruction pipeline latencies, CUDA programs over-decompose the problem and over-subscribe the device by running many more threads than there are hardware execution units. Whenever a thread stalls, the hardware scheduler immediately proceeds with the execution of another thread ready for execution. This latency hiding technique is key to make best use of the available hardware resources. With dCUDA, we apply latency hiding at cluster scale to automatically overlap computation and communication. Our benchmarks demonstrate perfect overlap for memory bandwidth-bound tasks and good overlap for compute-bound tasks.","2167-4337","978-1-4673-8815-3","10.1109/SC.2016.51","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7877130","Distributed memory;gpu;latency hiding;programming model;remote memory access","Graphics processing units;Programming;Computational modeling;Hardware;Instruction sets;Kernel","multi-threading;parallel architectures;storage management","hardware supported overlap;computation;communication;GPU hardware architecture;high-performance computing;GPU clusters;dCUDA programming model;device-side remote memory access;instruction pipeline latencies;hardware scheduler;latency hiding;hardware resources;memory bandwidth-bound tasks;compute-bound tasks;threads","","13","1","31","","16 Mar 2017","","","IEEE","IEEE Conferences"
"GPU Computing","J. D. Owens; M. Houston; D. Luebke; S. Green; J. E. Stone; J. C. Phillips","Univ. of California, Davis; NA; NA; NA; NA; NA","Proceedings of the IEEE","15 Apr 2008","2008","96","5","879","899","The graphics processing unit (GPU) has become an integral part of today's mainstream computing systems. Over the past six years, there has been a marked increase in the performance and capabilities of GPUs. The modern GPU is not only a powerful graphics engine but also a highly parallel programmable processor featuring peak arithmetic and memory bandwidth that substantially outpaces its CPU counterpart. The GPU's rapid increase in both programmability and capability has spawned a research community that has successfully mapped a broad range of computationally demanding, complex problems to the GPU. This effort in general-purpose computing on the GPU, also known as GPU computing, has positioned the GPU as a compelling alternative to traditional microprocessors in high-performance computer systems of the future. We describe the background, hardware, and programming model for GPU computing, summarize the state of the art in tools and techniques, and present four GPU computing successes in game physics and computational biophysics that deliver order-of-magnitude performance gains over optimized CPU applications.","1558-2256","","10.1109/JPROC.2008.917757","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4490127","General-purpose computing on the graphics processing unit (GPGPU);GPU computing;parallel computing","Graphics;Central Processing Unit;Physics computing;Engines;Arithmetic;Bandwidth;Microprocessors;Hardware;Computational biophysics;Performance gain","computer graphic equipment;microcomputers;parallel programming","GPU computing;graphics processing unit;graphics engine;parallel programmable processor;peak arithmetic;memory bandwidth;general-purpose computing;microprocessor;high-performance computer system;programming model;game physics;computational biophysics;parallel computing","","1060","30","32","","15 Apr 2008","","","IEEE","IEEE Journals"
"Data Parallel Programming Model for Many-Core Architectures","Y. Zhang","North Carolina State Univ., Raleigh, NC, USA","2011 IEEE International Symposium on Parallel and Distributed Processing Workshops and Phd Forum","1 Sep 2011","2011","","","2065","2068","Emerging accelerating architectures, such as GPUs, have proved successful in providing significant performance gains to various application domains. This is done by exploiting data parallelism in existing algorithms. However, programming in a data-parallel fashion imposes extra burdens to programmers, who are used to writing sequential programs. New programming models and frameworks are needed to reach a balance between programmability, portability and performance. We start from stream processing domain and propose GStream, a general-purpose, scalable data streaming framework on GPUs. The contributions of GStream are as follows: (1) We provide powerful, yet concise language abstractions suitable to describe conventional algorithms as streaming problems. (2) We project these abstractions onto GPUs to fully exploit their inherent massive data-parallelism. (3) We demonstrate the viability of streaming on accelerators. Experiments show that the proposed framework provides flexibility, programmability and performance gains for various benchmarks from a collection of domains, including but not limited to data streaming, data parallel problems, numerical codes and text search. This work lays a foundation to our future work to develop more general data parallel programming models for many-core architectures.","1530-2075","978-1-61284-425-1","10.1109/IPDPS.2011.378","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6009018","","Graphics processing unit;Parallel processing;Benchmark testing;Libraries;Kernel;Computer architecture","computer graphic equipment;multiprocessing systems;parallel programming","data parallel programming model;many-core architectures;GPU;GStream;general-purpose scalable data streaming framework;language abstractions;massive data-parallelism","","","","22","","1 Sep 2011","","","IEEE","IEEE Conferences"
"A Unified Programming Model for Heterogeneous Computing with CPU and Accelerator Technologies","Y. Xiong","Shanghai Institute of Technology,Computer Science Department,Shanghai,China,201418","2019 12th International Congress on Image and Signal Processing, BioMedical Engineering and Informatics (CISP-BMEI)","23 Jan 2020","2019","","","1","4","This paper provides a unified programming model for heterogeneous computing with CPU and accelerator (like GPU, FPGA, Google TPU, and more) technologies. This new programming model provides a clean interface to application developers and to some extent makes programming across CPUs and accelerators turn into usual programming tasks with common programming languages. Thus it can contribute to improve software productivity for computing across CPUs and accelerators. It can be achieved by extending file managements in common programming languages, such as C/C++, Fortran, Python, MPI, etc., to cover GPUs, FPGAs, and other accelerators (such as Google TPU, etc.) as I/O devices. The programming model can be applied to a number of different computing systems equipped with accelerators, ranging from embedded systems, to mobile computing systems, to HPC systems, and to cloud computing systems.","","978-1-7281-4852-6","10.1109/CISP-BMEI48845.2019.8965946","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8965946","","Graphics processing units;Programming;Field programmable gate arrays;Computer languages;Printers;Task analysis;Deep learning","cloud computing;embedded systems;message passing;mobile computing;parallel programming;programming languages","unified programming model;heterogeneous computing;Google TPU;CPUs;programming tasks;programming languages;mobile computing systems","","","","50","","23 Jan 2020","","","IEEE","IEEE Conferences"
"A graphical dataflow programming model for on-line signal processing on parallel architectures","Yongsen Jiang","Beihua University, Jilin, China","2010 Third International Symposium on Knowledge Acquisition and Modeling","29 Nov 2010","2010","","","107","110","Many real-world signal processing applications require an enormous amount of computational power. When these applications are deployed in on-line settings, many hurdles including stringent timing constraints must be overcome. Additionally, the number of channels feeding mathematical DSP routines is growing rapidly, easily reaching 1,000 to 100,000 channels. These applications have increasingly demanding performance requirements for generating control outputs which interact with real-world processes, where 1ms loop times are not uncommon. In this paper, we describe a graphical dataflow approach capable of yielding the necessary computational power and meeting aggressive timing constraints. We combine this methodology with strategies for targeting a combination of processors including CPUs, FPGAs, and GPUs deployed on standard PCs, workstations, and real-time systems. We demonstrate this approach through case studies on adaptive mirror control for an extremely large telescope and plasma measurement via soft X-ray tomography.","","978-1-4244-8007-4","10.1109/KAM.2010.5646310","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5646310","Software Engineering;Parallel Programming;Program Design;Graphical Dataflow","Real time systems;Mirrors;Communities","computer graphic equipment;computerised tomography;coprocessors;data flow computing;field programmable gate arrays;parallel architectures;signal processing;X-ray microscopy","graphical dataflow programming model;online signal processing;parallel architectures;stringent timing constraints;mathematical DSP routines;computational power;aggressive timing constraints;CPU;FPGA;GPU;adaptive mirror control;extremely large telescope;plasma measurement;soft X-ray tomography","","","","6","","29 Nov 2010","","","IEEE","IEEE Conferences"
"Study on Transient Temperature Field Parallel Computing in Cooling Control Based on a GPU Fourier Method","L. Wang; Y. -s. Zhang","State Key Lab. of Mater. Process. & Die & Mould Technol., Huazhong Univ. of Sci. & Technol. Wuhan, Wuhan, China; State Key Lab. of Mater. Process. & Die & Mould Technol., Huazhong Univ. of Sci. & Technol. Wuhan, Wuhan, China","2010 International Conference on Computational Intelligence and Software Engineering","30 Dec 2010","2010","","","1","4","With the evolution of graphics processing units (GPUs) in floating point operations and programmability, GPU has increasingly become powerful and cost-efficient computing architectures, its range of application has expanded tremendously, especially in the area of computational simulation. In this article, the Fourier method combined with GPU acceleration techniques is applied to simulate large-scale transient temperature field in cooling control. Although it is possible to perform temperature field simulation on a personal computer through Fourier method, when grids are huge, a tremendous CPU calculating time is required which is unacceptable. Thus GPU accelerating technique is used for the parallel processing of Fourier method and a significant speedup can be observed. Following the programming model of compute unified device architecture (CUDA), the iteration process of Fourier method is improved into several kernel functions by the single instruction multiple thread (SIMT) mode and multiple processors of the GPU execute these kernel functions. Numerical results with over 13 speedups demonstrate the efficiency of GPU computing technique of the Fourier method. The absolute error between GPU and CPU is less than 10-12 in double-precision.","","978-1-4244-5391-7","10.1109/CISE.2010.5676712","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5676712","","Graphics processing unit;Mathematical model;Instruction sets;Equations;Transient analysis;Parallel processing;Computational modeling","computer architecture;control engineering computing;cooling;coprocessors;heat systems","transient temperature field parallel computing;cooling control;GPU Fourier method;graphics processing units;floating point operations;programmability;cost-efficient computing architecture;computational simulation;GPU acceleration;large-scale transient temperature field;compute unified device architecture;single instruction multiple thread mode","","1","","6","","30 Dec 2010","","","IEEE","IEEE Conferences"
"Towards high performance and usability programming model for heterogeneous HPC platforms","Myungho Lee; Heeseung Jo; Dong Hoon Choi","Dept of Computer Science and Engineering, Myongji University, 38-2 San Namdong, Cheo-In Gu, Yong In, Kyung Ki Do, Korea 449-728; Department of Information Technology, Chonbuk National University, Jeonju, Jeonbuk, Korea 561-756; Korea Institute of Science and Technology Information (KISTI), 245 Dae Hak Ro, Yu Seong Gu, Daejeon, Korea 305-806","2012 8th International Conference on Computing Technology and Information Management (NCM and ICNIT)","16 Aug 2012","2012","1","","51","57","Latest High Performance Computing (HPC) platforms are built with heterogeneous chips such as multicore microprocessors and multicore GPUs (Graphic Processing units), thus they are commonly called as Heterogeneous High Performance Computing (HPC) platforms. Various programming models have been developed and proposed for heterogeneous platforms. However, their wide adoption in the user community is predicted to be limited, because of low performance, low usability due to revealing architectural details in the program which burdens the programmers, and most importantly the limited SIMD execution model which relies on the GPU for most of the computations in the program which can limit the performance. Thus a more general programming model beyond SIMD which is easy to use and leads to high performance needs to be developed. In this paper, we propose methods to achieve this goal by considering all types of parallelism according to Flynn's classification (SIMD, MIMD, MISD). Our proposed methods incorporate these parallelisms in the existing high usability programming models and can lead to significant performance improvements.","","978-89-88678-68-8","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6268469","Heterogenesou HP platformC;programming model;OpenMP;CUDA;OpenACC","Graphics processing unit;Programming;Computational modeling;Registers;Levee;Engines","graphics processing units;multiprocessing systems;parallel processing","heterogeneous HPC platforms;usability programming model;high performance computing;multicore microprocessors;multicore GPU;graphic processing units;SIMD execution model;Flynn classification","","1","","20","","16 Aug 2012","","","IEEE","IEEE Conferences"
"2D-FMFI SAR application on HPC architectures with OmpSs parallel programming model","F. Kraja; A. Bode; X. Martorell","Chair of Computer Architecture, Department of Informatics, Technische Universität München, Munich, Germany; Chair of Computer Architecture, Department of Informatics, Technische Universität München, Munich, Germany; Computer Architecture Department, Universitat Politecnica de Catalunya, Barcelona Supercomputing Center, Barcelona, Spain","2012 NASA/ESA Conference on Adaptive Hardware and Systems (AHS)","16 Aug 2012","2012","","","115","121","Spacecraft on-board platforms will soon contain high performance off-the-shelf computing components, as the only way to deal with applications which require High Performance Computing (HPC) capabilities. Heterogeneous architectures, give the possibility to profit from specific features of such components, by combining them on the same computing platform. Such architectures integrate different multicore CPUs with many-core accelerators (GPGPUs) so that parts of the same application can efficiently execute on the CPU while other parts can profit more from the GPU features. The problem stands in the way how to program these heterogeneous architectures. In this paper we introduce the OmpSs Programming Model as a framework to program heterogeneous architectures. For benchmarking purposes, we use a Synthetic Aperture Radar (SAR) application, which we parallelized with OmpSs for Symmetric Multi-Processor (SMP) architectures and for hybrid SMP/GPU environments. We also compare the results obtained with OmpSs with the ones obtained with OpenMP in SMP environments and it turns out that OmpSs outperforms OpenMP. When applying OmpSs to the SAR code for hybrid architectures, OmpSs does not offer better performance than CUDA, but it offers support for heterogeneous architectures and it also increases programmer's productivity.","","978-1-4673-1916-4","10.1109/AHS.2012.6268638","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6268638","OmpSs;OpenMP;CUDA;Space Applications;SAR;SMP;GPU","Graphics processing unit;Computer architecture;Synthetic aperture radar;Image reconstruction;Runtime;Interpolation;Programming","aerospace engineering;aerospace instrumentation;graphics processing units;multiprocessing systems;parallel programming;software packages;space vehicles;synthetic aperture radar","2D-FMFI SAR application;HPC architectures;OmpSs parallel programming model;spacecraft on-board platforms;high performance computing;HPC;heterogeneous architectures;multicore CPU;GPGPU;many-core accelerators;synthetic aperture radar;symmetric multiprocessor architectures;SMP/GPU environments;OpenMP","","","","18","","16 Aug 2012","","","IEEE","IEEE Conferences"
"Heterogeneous Habanero-C (H2C): A Portable Programming Model for Heterogeneous Processors","D. Majeti; V. Sarkar",NA; NA,"2015 IEEE International Parallel and Distributed Processing Symposium Workshop","1 Oct 2015","2015","","","708","717","Heterogeneous architectures with their diverse architectural features impose significant programmability challenges. Existing programming systems involve non-trivial learning and are not productive, not portable, and are challenging to tune for performance. In this paper, we introduce Heterogeneous Habanero-C (H2C), which is an implementation of the Habanero execution model for modern heterogeneous (CPU + GPU) architectures. The H2C language provides high-level constructs to specify the computation, communication, and synchronization in a given application. H2C also implements novel constructs for task partitioning and locality. The H2C (source-to-source) compiler and runtime framework efficiently map these high-level constructs onto the underlying heterogeneous platform, which can include multiple CPU cores and multiple GPU devices, possibly from different vendors. Experimental evaluations of four applications show significant improvements in productivity, portability, and performance.","","978-1-4673-7684-6","10.1109/IPDPSW.2015.81","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7284378","heterogeneous architectures;programming model;automatic data distribution;OpenCL;event management","Runtime;Graphics processing units;Computer architecture;Optimization;Kernel;Programming","graphics processing units;multiprocessing systems;program compilers","portable programming model;heterogeneous processors;programming systems;Heterogeneous Habanero-C;Habanero execution model;modern heterogeneous architectures;compiler;runtime framework;multiple CPU cores;multiple GPU devices","","6","","20","","1 Oct 2015","","","IEEE","IEEE Conferences"
"High-speed parallel wavelet algorithm based on CUDA and its application in three-dimensional surface texture analysis","Wang Jianjun; Lu Wenlong; Liu Xiaojun; Jiang Xiangqian","The State Key Laboratory of Digital Manufacturing Equipment and Technology, School of Mechanical Science and Engineering, Huazhong University of Science and Technology, Wuhan, Hubei, China; The State Key Laboratory of Digital Manufacturing Equipment and Technology, School of Mechanical Science and Engineering, Huazhong University of Science and Technology, Wuhan, Hubei, China; The State Key Laboratory of Digital Manufacturing Equipment and Technology, School of Mechanical Science and Engineering, Huazhong University of Science and Technology, Wuhan, Hubei, China; The State Key Laboratory of Digital Manufacturing Equipment and Technology, School of Mechanical Science and Engineering, Huazhong University of Science and Technology, Wuhan, Hubei, China","2011 International Conference on Electric Information and Control Engineering","27 May 2011","2011","","","2249","2252","A new efficient parallel wavelet algorithm was presented in order to speed up wavelet transform in three dimensional surface texture analysis. It is based NVIDIA's CUDA (Compute Unified Device Architecture), a new general purpose parallel programming model and instruction set architecture that leverage computational problems on GPU more efficient than CPU. Compared with CPU, GPU has evolved into a highly parallel, multithread, multicore processor with tremendous computational horsepower and very high memory bandwidth. GPU is well-suited to address data-parallel computation problems rather than flow controlled problems. Wavelet transform can use data-parallel programming model so data elements will be mapped to parallel processing threads to speed up the computations. CUDA wavelet decomposition and reconstruction algorithms were realized based on the analysis above. Experiments show that the parallelization of the fast wavelet decomposition transform for GPU speedup 34×-38× over CPU, reconstruction transform speedup 29x-33x over CPU.","","978-1-4244-8039-5","10.1109/ICEICE.2011.5778225","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5778225","CUDA;GPU;Wavelet;surface texture","Graphics processing unit;Wavelet transforms;Convolution;Surface waves;Wavelet analysis;Instruction sets","computer graphic equipment;computer graphics;coprocessors;general purpose computers;instruction sets;multiprocessing systems;multi-threading;parallel algorithms;parallel architectures;wavelet transforms","high-speed parallel wavelet algorithm;CUDA;three-dimensional surface texture analysis;NVIDIA;compute unified device architecture;general purpose parallel programming model;instruction set architecture;GPU;multithread processor;parallel processor;multicore processor;computational horsepower;memory bandwidth;data-parallel computation problems;data-parallel programming model;reconstruction transform speedup","","2","","13","","27 May 2011","","","IEEE","IEEE Conferences"
"Gdarts: A GPU-Based Runtime System for Dataflow Task Programming on Dependency Applications","M. Li; Q. Jiang; H. Lin; H. An","University of Science and Technology of China, Hefei, China; University of Science and Technology of China, Hefei, China; University of Science and Technology of China, Hefei, China; University of Science and Technology of China, Hefei, China","2019 IEEE Intl Conf on Parallel & Distributed Processing with Applications, Big Data & Cloud Computing, Sustainable Computing & Communications, Social Computing & Networking (ISPA/BDCloud/SocialCom/SustainCom)","26 Mar 2020","2019","","","547","552","Massively multithreaded GPUs achieve considerable performance improvements by thousands of processing cores running simultaneously for compute-intensive applications. However, present parallel programming model suffers significant performance degradation on dependency scenarios, where tasks are assigned into multiple thread blocks and the parallelism is limited by inter-block dependencies. Massively multithreaded GPUs achieve considerable performance improvements by thousands of processing cores running simultaneously for compute-intensive applications. However, present parallel programming model suffers significant performance degradation on dependency scenarios, where tasks are assigned into multiple thread blocks and the parallelism is limited by inter-block dependencies. This paper proposes Gdarts, a dataflow runtime system for GPU workloads with data dependencies. Employing asynchronous task programming, Gdarts builds Stream Multiprocessors (SM) as standalone workers towards fine-granular and independent kernels. Meanwhile, it designs a two-level task scheduler to adapt GPU's hierarchical memory environment. Such a scheme, leveraging the hybrid memory resources, fulfills requirements for workload balancing across SMs, as well as flexible priority scheduling. Based on the improved controllability and flexible support fosr kernel scheduling, Gdarts complements the existing GPU with insights of dataflow diagram by two heuristic schedule approaches, node-degree and data-driven priority.","","978-1-7281-4328-6","10.1109/ISPA-BDCloud-SustainCom-SocialCom48970.2019.00083","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9047478","task based execution;dataflow runtime system;schedule;GPU programming","Task analysis;Graphics processing units;Runtime;Programming;Parallel processing;Schedules;Kernel","coprocessors;graphics processing units;multiprocessing systems;multi-threading;parallel programming;scheduling","Gdarts;GPU-based runtime system;dataflow task programming;GPUs;processing cores;compute-intensive applications;parallel programming model;parallelism;dataflow runtime system;data dependencies;asynchronous task programming;two-level task scheduler;kernel scheduling","","","","20","","26 Mar 2020","","","IEEE","IEEE Conferences"
"Divide and conquer skeleton on GPU","F. Baghayeri; H. Deldari; D. Bahrepour","Department of Computer Engineering, Mashhad Branch, Islamic Azad University, Mashhad, Iran; Department of Computer Engineering, Mashhad Branch, Islamic Azad University, Mashhad, Iran; Department of Computer Engineering, Mashhad Branch Islamic Azad University, Mashhad, Iran","2014 International Congress on Technology, Communication and Knowledge (ICTCK)","9 Feb 2015","2014","","","1","6","Parallelism is a suitable approach for speeding up the massive computations of applications, but parallel programming is difficult yet. Algorithmic skeleton is a parallel programming model that provides a high level of abstraction for programmers. This approach uses the pre-defined components to facilitate easier parallel programming. Divide and conquer (DC) is an appropriate parallel pattern for implementation as a skeleton. The solution of the original problem is obtained by dividing it into smaller sub-problems and solving them in parallel. Today, graphics processor unit (GPU) is an attractive computational processor for doing tasks in parallel, because it has a large number of process units. In this paper, divide and conquer skeleton on GPU has been proposed and named OC_GFV.DC_GPU is a divide and conquer skeleton that is implemented on GPU that using a consistent programming interface in C++ for easier parallel programming. Performance of this skeleton has been evaluated by mergesort and sobeledge detection. The results show that obtained speedup at this skeleton is more than 2 on GPU.","","978-1-4799-8021-5","10.1109/ICTCK.2014.7033531","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7033531","Algorithmic Skeleton;Divide and Conquer Skeleton;Graphics Processor Unit(GPU);Programming Interface in C++;Mergesort;Sobel Edge Detection","Skeleton;Graphics processing units;Parallel processing;Parallel programming;Libraries;Computational modeling","C++ language;divide and conquer methods;edge detection;graphics processing units;parallel programming","parallel programming model;parallel pattern;graphics processor unit;computational processor;divide and conquer skeleton;DC_GPU;consistent programming interface;C++;mergesort;sobeledge skeleton","","1","","12","","9 Feb 2015","","","IEEE","IEEE Conferences"
"Task Scheduling Greedy Heuristics for GPU Heterogeneous Cluster Involving the Weights of the Processor","K. Zhang; B. Wu","Sch. of Comput. Sci., Fudan Univ., Shanghai, China; Sch. of Comput. Sci., Fudan Univ., Shanghai, China","2013 IEEE International Symposium on Parallel & Distributed Processing, Workshops and Phd Forum","31 Oct 2013","2013","","","1817","1827","Modern GPUs are gradually used by more and more cluster computing systems as the high performance computing units due to their outstanding computational power, whereas bringing system-level (among different nodes) architectural heterogeneity to cluster. In this paper, based on MPI and CUDA programming model, we aim to investigate task scheduling for GPU heterogeneous cluster by taking into account the system-level heterogeneous characteristics and also involving the weights of the processor (both CPUs and GPUs). At first, based on our GPU heterogeneous cluster, we classify executing tasks to six major classifications according to their parallelism degrees, input data sizes, and processing workloads. Then, aiming to realize the approximately optimal mapping between tasks and computing resources, a task scheduling strategy is presented. In this paper, we present the WSLSA greedy heuristic which can involve the weights of the processor. Besides, we also define two measurement factors for the task assignments. One is the maximum value of total workloads for all task assignments to consider the maximum workloads for the GPU heterogeneity cluster. The other is the distribution of task assignments which can determine the load balance of the task assignments for the GPU heterogeneity cluster. The other is the distribution of task assignments which can determine the load balance of the task assignments for the GPU heterogeneity cluster.","","978-0-7695-4979-8","10.1109/IPDPSW.2013.38","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6651082","Task Scheduling;Greedy Heuristics;GPU Heterogeneous Cluster;WSLSA Greedy Heuristic","Graphics processing units;Kernel;Processor scheduling;Computer architecture;Scheduling;Clustering algorithms","application program interfaces;graphics processing units;greedy algorithms;parallel architectures;scheduling;task analysis;workstation clusters","task scheduling greedy heuristics;GPU heterogeneous cluster;cluster computing systems;high performance computing units;computational power;system-level architectural heterogeneity;MPI;CUDA programming model;system-level heterogeneous characteristics;executing tasks classify;parallelism degrees;data sizes;processing workloads;computing resources;WSLSA greedy heuristic;task assignments;load balance","","2","","27","","31 Oct 2013","","","IEEE","IEEE Conferences"
"Mini-Gunrock: A Lightweight Graph Analytics Framework on the GPU","Yangzihao Wang; S. Baxter; J. D. Owens",NA; NA; NA,"2017 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","24 Aug 2017","2017","","","616","626","Existing GPU graph analytics frameworks are typically built from specialized, bottom-up implementations of graph operators that are customized to graph computation. In this work we describe Mini-Gunrock, a lightweight graph analytics framework on the GPU. Unlike existing frameworks, Mini-Gunrock is built from graph operators implemented with generic transform-based data-parallel primitives. Using this method to bridge the gap between programmability and high performance for GPU graph analytics, we demonstrate operator performance on scale-free graphs with an average 1.5x speedup compared to Gunrock's corresponding operator performance. Mini-Gunrock's graph operators, optimizations, and applications code have 10x smaller code size and comparable overall performance vs. Gunrock.","","978-1-5386-3408-0","10.1109/IPDPSW.2017.116","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7965101","GPU computing;Graph analytics;Programming model;Runtime system","Transforms;Graphics processing units;Kernel;Libraries;Programming;Optimization;Computational modeling","graph theory;graphics processing units;mathematics computing;optimisation;parallel processing","miniGunrock;lightweight graph analytics framework;GPU graph analytics frameworks;graph operators;graph computation;generic transform-based data-parallel primitives;scale-free graphs;optimizations","","","","11","","24 Aug 2017","","","IEEE","IEEE Conferences"
"Programming GPU Clusters with Shared Memory Abstraction in Software","K. I. Karantasis; E. D. Polychronopoulos","Dept. of Comput. Eng. & Inf., Univ. of Patras, Rio, Greece; Dept. of Comput. Eng. & Inf., Univ. of Patras, Rio, Greece","2011 19th International Euromicro Conference on Parallel, Distributed and Network-Based Processing","24 Mar 2011","2011","","","223","230","As many-core graphics processors gain an increasingly important position concerning the advancements on modern highly concurrent processors, we are experiencing the deployment of the first heterogeneous clusters that are based on GPUs. The attempts to match future expectations in computational power and energy saving with hybrid - GPU-based - clusters are expected to grow in the next years, and much of their success will depend on the provision of the appropriate programming tools. In the current paper we propose a programming model for GPU clusters that is based on shared memory abstraction. We give evidence for the applicability of the proposed model under two cases. In the first case we describe an implementation procedure that involves the utilization of Intel Cluster OpenMP, a cluster-enabled OpenMP implementation. Subsequently, we present an extended version of Pleiad, a cluster middleware which is based on the Java platform. The evaluation of these schemes under two characteristic computationally intensive applications on a 4-node multi-GPU cluster, reveals that such approaches can easily enhance existing GPU software development tools, such as CUDA, and they can lead to a significant acceleration of applications that can benefit from many-core GPU clusters.","2377-5750","978-1-4244-9682-2","10.1109/PDP.2011.91","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5739005","GPU Clusters;Software DSM;CUDA;OpenMP;Pleiad","Graphics processing unit;Programming;Middleware;Benchmark testing;Computational modeling;Kernel;Multicore processing","computer graphic equipment;coprocessors;Java;middleware;multiprocessing programs;power aware computing;shared memory systems;software tools","GPU cluster programming;shared memory abstraction;many-core graphics processors;energy saving;programming tools;Intel Cluster OpenMP;cluster middleware;Pleiad;Java platform;4-node multiGPU cluster;GPU software development tools","","8","","27","","24 Mar 2011","","","IEEE","IEEE Conferences"
"Matrix multiplication beyond auto-tuning: Rewrite-based GPU code generation","M. Steuwer; T. Remmelg; C. Dubach","University of Edinburgh, United Kingdom; University of Edinburgh, United Kingdom; University of Edinburgh, United Kingdom","2016 International Conference on Compliers, Architectures, and Sythesis of Embedded Systems (CASES)","17 Nov 2016","2016","","","1","10","Graphics Processing Units (GPUs) are used as general purpose parallel accelerators in a wide range of applications. They are found in most computing systems, and mobile devices are no exception. The recent availability of programming APIs such as OpenCL for mobile GPUs promises to open up new types of applications on these devices. However, producing high performance GPU code is extremely difficult. Subtle differences in device characteristics can lead to large performance variations when different optimizations are applied. As we will see, this is especially true for a mobile GPU such as the ARM Mali GPU which has a very different architecture than desktop-class GPUs. Code optimized and tuned for one type of GPUs is unlikely to achieve the performance potential on another type of GPUs. Auto-tuners have traditionally been an answer to this performance portability challenge. For instance, they have been successful on CPUs for matrix operations, which are used as building blocks in many high-performance applications. However, they are much harder to design for different classes of GPUs, given the wide variety of hardware characteristics. In this paper, we take a different perspective and show how performance portability for matrix multiplication is achieved using a compiler approach. This approach is based on a recently developed generic technique that combines a high-level programming model with a system of rewrite rules. Programs are automatically rewritten in successive steps, where optimizations decision are made.This approach is truly performance portable, resulting in high-performance code for very different types of architectures such as desktop and mobile GPUs. In particular, we achieve a speedup of 1.7x over a state-of-the-art auto-tuner on the ARM Mali GPU.","","978-1-4503-4482-1","10.1145/2968455.2968521","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7745278","","Graphics processing units;Optimization;Mobile communication;Hardware;Instruction sets;Performance evaluation;Registers","graphics processing units;mathematics computing;matrix multiplication;optimising compilers;rewriting systems;software portability","matrix multiplication;rewrite-based GPU code generation;graphics processing units;general purpose parallel accelerators;programming APIs;OpenCL;mobile GPUs;high performance GPU code;ARM Mali GPU;code optimization;auto-tuners;performance portability;compiler approach;high-level programming model;optimizations decision","","4","","25","","17 Nov 2016","","","IEEE","IEEE Conferences"
"GPU-Accelerated Computations for Supersonic Flow Modeling on Hybrid Grids","Z. Tian; J. Lai; F. Yang; H. Li","College of Aerospace Science and Engineering, National University of Defense Technology,Changsha,China; College of Aerospace Science and Engineering, National University of Defense Technology,Changsha,China; College of Aerospace Science and Engineering, National University of Defense Technology,Changsha,China; College of Aerospace Science and Engineering, National University of Defense Technology,Changsha,China","2020 5th International Conference on Mechanical, Control and Computer Engineering (ICMCCE)","13 May 2021","2020","","","1391","1397","With its strong floating-point operation capability and high memory bandwidth in data parallelism, the graphics processing unit (GPU) has been widely used in general-purpose computing. GPU-based computations have been extensively applied in the field of computational fluid dynamics (CFD). This paper aims to design an extremely efficient double-precision GPU-accelerated parallel algorithm for supersonic flow computations on hybrid grids. Compute unified device architecture (CUDA) is used as a general-purpose parallel computing platform and programming model to perform parallel computing codes on GPUs. The cell-centered finite volume method based on unstructured grids is used in the spatial discretization of governing equations, whereas the three-stage explicit Runge-Kutta scheme with second-order accuracy is used for temporal discretization. The turbulence is solved by using the K-ω SST two-equation model. Three test cases are studied to validate the computational accuracy of the proposed algorithm. The numerical results agree well with the experiment data, thereby suggesting that the GPU-accelerated parallel algorithm has good accuracy.","","978-1-6654-2314-4","10.1109/ICMCCE51767.2020.00305","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9421767","graphics processing unit;compute unified device architecture;supersonic flow;hybrid grids;parallel algorithm","Performance evaluation;Computational modeling;Computational fluid dynamics;Graphics processing units;Process control;Life estimation;Programming","computational fluid dynamics;finite volume methods;graphics processing units;grid computing;parallel algorithms;parallel architectures;Runge-Kutta methods;supersonic flow","GPU-accelerated computations;hybrid grids;floating-point operation capability;high memory bandwidth;data parallelism;graphics processing unit;GPU-based computations;computational fluid dynamics;double-precision GPU-accelerated parallel algorithm;supersonic flow computations;compute unified device architecture;programming model;parallel computing codes;cell-centered finite volume method;unstructured grids;three-stage explicit Runge-Kutta scheme;K-ω SST two-equation model;supersonic flow modeling;general-purpose parallel computing platform","","","","30","","13 May 2021","","","IEEE","IEEE Conferences"
"Multimobile Robot Cooperative Localization Using Ultrawideband Sensor and GPU Acceleration","J. Xin; G. Xie; B. Yan; M. Shan; P. Li; K. Gao","Shaanxi Key Laboratory of Complex System Control and Intelligent Information Processing, Xi'an University of Technology, Xi'an 710048, China.; Shaanxi Key Laboratory of Complex System Control and Intelligent Information Processing, Xi'an University of Technology, Xi'an 710048, China (e-mail: guoxie@xaut.edu.cn); Shaanxi Key Laboratory of Complex System Control and Intelligent Information Processing, Xi'an University of Technology, Xi'an 710048, China.; Australian Centre for Field Robotics, The University of Sydney, Sydney, NSW 2006, Australia.; Shaanxi Key Laboratory of Complex System Control and Intelligent Information Processing, Xi'an University of Technology, Xi'an 710048, China.; Shaanxi Key Laboratory of Complex System Control and Intelligent Information Processing, Xi'an University of Technology, Xi'an 710048, China.","IEEE Transactions on Automation Science and Engineering","","2021","PP","99","1","12","To tackle the poor localization accuracy of multimobile robots caused by non-line-of-sight (NLOS) errors in a complex indoor environment and to meet the real-time requirement, this article proposes a multimobile robot cooperative localization system using ultrawideband (UWB) sensor and GPU hardware acceleration. First, a UWB multinode ranging network is established to obtain the relative distance information between robots and anchors. Then, the line-of-sight (LOS) and NLOS errors in distance information are effectively mitigated by using the proposed UWB ranging error mitigation algorithm based on the Bayesian filter. A cooperative particle filter (PF) localization algorithm based on the Gibbs sampling is designed to estimate the position information of each robot at any time. Finally, in order to improve the real-time performance of the collaborative localization system, a parallel Gibbs collaborative localization algorithm that can be accelerated by GPU is proposed considering the characteristics of GPU hardware and CUDA programming model. The experimental results of three TurtleBot2 mobile robots in real scene show that the proposed multimobile robot cooperative localization system using UWB technology can estimate the position information of each robot robustly and accurately, and the localization accuracy is superior to that of the popular extended Kalman filter (EKF) and PF algorithms. It is shown through further evaluations that the proposed parallel algorithm achieves about 3.2 times acceleration effect in the scenarios of three mobile robots. The speed gain is found more significant with more robots, which substantially improves the real-time performance of the cooperative localization system. In the test with seven mobile robots, the speedup is as high as 11.9, that is, the execution time of the algorithm is only 8.39% of that of the original algorithm.","1558-3783","","10.1109/TASE.2021.3117949","National Natural Science Foundation of China(grant numbers:61873200,61873201,U20A20225,61833013); National Key Research and Development Program of China(grant numbers:2018YFB1201500); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9576116","Cooperative localization;GPU acceleration;multimobile robot systems;real scene;real time","Location awareness;Robots;Robot sensing systems;Distance measurement;Real-time systems;Graphics processing units;Wireless sensor networks","","","","","","","IEEE","15 Oct 2021","","","IEEE","IEEE Early Access Articles"
"Vispark: GPU-accelerated distributed visual computing using spark","W. Choi; W. Jeong","School of Electrical and Computer Engineering, Ulsan National Institute of Science and Technology, Ulsan, Republic of Korea; School of Electrical and Computer Engineering, Ulsan National Institute of Science and Technology, Ulsan, Republic of Korea","2015 IEEE 5th Symposium on Large Data Analysis and Visualization (LDAV)","7 Dec 2015","2015","","","125","126","With the growing need of big data processing in diverse application domains, MapReduce (e.g., Hadoop) becomes one of the standard computing paradigms for large-scale computing on a cluster system. Despite of its popularity, the current MapReduce framework suffers from inflexibility and inefficiency inherent from its programming model and system architecture. In order to address these problems, we propose Vispark, a novel extension of Spark for GPU-accelerated MapReduce processing on array-based scientific computing and image processing tasks. Vispark provides an easy-to-use, Python-like high-level language syntax and a novel data abstraction for MapReduce programming on a GPU cluster system. Vispark introduces a programming abstraction for accessing neighbor data in the mapper function, which greatly simplifies many image processing tasks using MapReduce by reducing memory footprints and bypassing the reduce stage. We demonstrate the performance of our prototype system on several visual computing tasks, such as image processing, and K-means clustering.","","978-1-4673-8517-6","10.1109/LDAV.2015.7348080","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7348080","","Graphics processing units;Sparks;Kernel;Programming;Visualization;Arrays;Image processing","Big Data;computer vision;graphics processing units;parallel programming;pattern clustering;software architecture;visual programming","Vispark;GPU-accelerated distributed visual computing;big data processing;Hadoop;large-scale computing;GPU cluster system;system architecture;Spark;GPU-accelerated MapReduce processing;array-based scientific computing;image processing tasks;Python-like high-level language syntax;data abstraction;MapReduce programming;programming abstraction;neighbor data access;memory footprints reduction;K-means clustering","","2","","3","","7 Dec 2015","","","IEEE","IEEE Conferences"
"A Data Communication Scheduler for Stream Programs on CPU-GPU Platform","T. Tang; X. Xu; Y. Lin","Nat. Lab. for Parallel & Distrib. Process., Nat. Univ. of Defense Technol., Changsha, China; Nat. Lab. for Parallel & Distrib. Process., Nat. Univ. of Defense Technol., Changsha, China; Nat. Lab. for Parallel & Distrib. Process., Nat. Univ. of Defense Technol., Changsha, China","2010 10th IEEE International Conference on Computer and Information Technology","16 Sep 2010","2010","","","139","146","In recent years, heterogeneous parallel system have become a focus research area in high performance computing field. Generally, in a heterogeneous parallel system, CPU provides the basic computing environment and special purpose accelerator (GPU in this paper) provides high computing performance. However, the overall performance of the system is prone to be limited by the data communication between the CPU and the GPU. Data communication is typically used to synchronize the array on the CPU and the stream (in AMD's terminology) on the GPU. In many cases, programmers just add data synchronization for each GPU invoking independently. It is easy to program in this manner but much redundant communication may be introduced, which will dramatically degrade the overall performance. To alleviate this problem, based on the stream programming model, we propose a heuristic data communication schedule approach in this paper. By analyzing the state transition of stream/array data pair, relaxing the synchronization strategy conditionally and considering optimization for branch and loop control structure, our approach can significantly reduce the redundant data communication in most cases.","","978-1-4244-7548-3","10.1109/CIT.2010.63","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5578445","GPU;data communication schedule;structural analysis","Graphics processing unit;Data communication;Arrays;Kernel;Streaming media;Schedules","computer graphic equipment;coprocessors;data communication;scheduling","data communication scheduler;stream programs;CPU-GPU platform;heterogeneous parallel system;high performance computing field;stream programming model;synchronization strategy;loop control structure","","","","18","","16 Sep 2010","","","IEEE","IEEE Conferences"
"Performance Analysis of Parallel Programming Paradigms on CPU-GPU Clusters","B. N. Chandrashekhar; H. A. Sanjay; T. Srinivas","Nitte meenakshi Institute of Technology,Department of Information science and Engineering,Benagluru,India,64; Nitte meenakshi Institute of Technology,Department of Information science and Engineering,Benagluru,India,64; Nitte meenakshi Institute of Technology,Department of Information science and Engineering,Benagluru,India,64","2021 International Conference on Artificial Intelligence and Smart Systems (ICAIS)","12 Apr 2021","2021","","","646","651","CPU-GPU based cluster computing in today's modern world encompasses the domain of complex and high-intensity computation. To exploit the efficient resource utilization of a cluster, traditional programming paradigm is not sufficient. Therefore, in this article, the performance parallel programming paradigms like OpenMP on CPU cluster and CUDA on GPU cluster using BFS and DFS graph algorithms is analyzed. This article analyzes the time efficiency to traverse the graphs with the given number of nodes in two different processors. Here, CPU with OpenMP platform and GPU with CUDA platform support multi-thread processing to yield results for various nodes. From the experimental results, it is observed that parallelization with the OpenMP programming model using the graph algorithm does not boost the performance of the CPU processors, instead, it decreases the performance by adding overheads like idling time, inter-thread communication, and excess computation. On the other hand, the CUDA parallel programming paradigm on GPU yields better results. The implementation achieves a speed-up of 187 to 240 times over the CPU implementation. This comparative study assists the programmers provocatively and select the optimum choice among OpenMP and CUDA parallel programming paradigms.","","978-1-7281-9537-7","10.1109/ICAIS50930.2021.9395977","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9395977","Breadth First Search(BFS);Central Processing Unit(CPU);CUDA;Depth First Search(DFS);Graphics Processing Unit(GPU) OpenMP;Performance analysis","Parallel programming;Computational modeling;Graphics processing units;Clustering algorithms;Cluster computing;Performance analysis;Resource management","cluster computing;graph theory;graphics processing units;message passing;multi-threading;parallel architectures;performance evaluation","multithread processing;DFS graph algorithm;BFS graph algorithm;resource utilization;cluster computing;CUDA parallel programming paradigms;CPU processors;OpenMP programming model;parallelization;time efficiency;CPU-GPU clusters;performance analysis","","","","17","","12 Apr 2021","","","IEEE","IEEE Conferences"
"Towards a parallelization and performance optimization of Viola and Jones algorithm in heterogeneous CPU-GPU mobile system","A. Ghorbel; N. Ben Amor; M. Jallouli","Computer and Embedded Systems Laboratory, Ecole Nationale d'Ingénieurs de Sfax (ENIS), Tunisia; Computer and Embedded Systems Laboratory, Ecole Nationale d'Ingénieurs de Sfax (ENIS), Tunisia; Computer and Embedded Systems Laboratory, Ecole Nationale d'Ingénieurs de Sfax (ENIS), Tunisia","2015 15th International Conference on Intelligent Systems Design and Applications (ISDA)","13 Jun 2016","2015","","","528","532","Parallel computing on heterogeneous multiprocessor architecture is a new technique used to tackle the complexity of actual media applications. Such technique is used on an embedded architecture composed of 2ARMs coupled to a GPU. In this paper, an approach for real time Viola and Jones face detection algorithm using CPU-GPU based platform is presented. First, the application is implemented and parallelized on two identical ARM CortexA9 CPUs using tasks and data levels parallelism. This technique does not achieve the timing objectives. To ensure greater performance while reducing energy ratio, we extend our parallelization technique to support a GPU as an accelerator to perform non graphical tasks. OpenCL, the heterogeneous parallel programming model, is used to ensure communication between CPU and GPU.","2164-7151","978-1-4673-8709-5","10.1109/ISDA.2015.7489172","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7489172","Parallel computing;GPU;mobile device","Computer architecture;Neon;Graphics processing units;Acceleration;Hardware;Synchronization;Gray-scale","face recognition;graphics processing units;microprocessor chips;mobile computing;parallel programming","Viola algorithm performance optimization;Jones algorithm performance optimization;heterogeneous CPU-GPU mobile system;parallel computing;heterogeneous multiprocessor architecture;media applications;embedded architecture;face detection algorithm;identical ARM CortexA9 CPU;data level parallelism;task level parallelism;energy ratio reduction;parallelization technique;OpenCL;heterogeneous parallel programming model","","1","","14","","13 Jun 2016","","","IEEE","IEEE Conferences"
"A GPU implementation of tiled belief propagation on Markov Random Fields","H. Eslami; T. Kasampalis; M. Kotsifakou","Department of Computer Science University of Illinois at Urbana-Champaign Urbana, Illinois 61801; Department of Computer Science University of Illinois at Urbana-Champaign Urbana, Illinois 61801; Department of Computer Science University of Illinois at Urbana-Champaign Urbana, Illinois 61801","2013 Eleventh ACM/IEEE International Conference on Formal Methods and Models for Codesign (MEMOCODE 2013)","21 Nov 2013","2013","","","143","146","In the MEMOCODE Design Contest 2013, we are participating with a parallelized version of tiled belief propagation method for stereo matching. The proposed algorithm is implemented in CUDA programming model to leverage parallel processing capabilities of GPUs. In our solution, the original tiled belief propagation algorithm is combined with a number of novel optimizations specific to parallel programs in CUDA. For the given test inputs, the proposed solution runs in 7.96 milliseconds on Nvidia Tesla C2050, achieving acceptable accuracy with respect to the reference code. To the best of authors' knowledge, there is no prior work in optimizing a parallelized version of the tiled belief propagation algorithm.","","978-1-4799-0905-6","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6670953","","Message systems;Tiles;Belief propagation;Graphics processing units;Synchronization;Stereo vision;Parallel processing","belief maintenance;graphics processing units;image matching;Markov processes;optimisation;parallel architectures;stereo image processing","GPU implementation;tiled belief propagation;Markov random fields;MEMOCODE design contest 2013;stereo matching;CUDA programming model;parallel processing capabilities;optimizations;parallel programs;Nvidia Tesla C2050","","","","5","","21 Nov 2013","","","IEEE","IEEE Conferences"
"Exploiting GPUDirect RDMA in Designing High Performance OpenSHMEM for NVIDIA GPU Clusters","K. Hamidouche; A. Venkatesh; A. A. Awan; H. Subramoni; C. -H. Chu; D. K. Panda","Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA","2015 IEEE International Conference on Cluster Computing","29 Oct 2015","2015","","","78","87","GPUDirect RDMA (GDR) brings the high-performance communication capabilities of RDMA networks like InfiniBand (IB) to GPUs (referred to as ""Device""). It enables IB network adapters to directly write/read data to/from GPU memory. Partitioned Global Address Space (PGAS) programming models, such as OpenSHMEM, provide an attractive approach for developing scientific applications with irregular communication characteristics by providing shared memory address space abstractions, along with one-sided communication semantics. However, current approaches and designs of OpenSHMEM on GPU clusters do not take advantage of the GDR features leading to inefficiencies and sub-optimal performance. In this paper, we analyze the performance of various OpenSHMEM operations with different inter-node and intra-node communication configurations (Host-to-Device, Device-to-Device, and Device-to-Host) on GPU based systems. We propose novel designs that ensure ""truly one-sided"" communication for the different inter-/intra-node configurations identified above while working around the hardware limitations. To the best of our knowledge, this is the first work that investigates GDR-aware designs for OpenSHMEM communication operations. Experimental evaluations indicate 2.5X and 7X improvement in point-point communication for intra-node and inter-node, respectively. The proposed framework achieves 2.2µs for an intra-node 8 byte put operation from Host-to-Device, and 3.13µs for an inter-node 8 byte put operation from GPU to remote GPU. With Stencil2D application kernel from SHOC benchmark suite, we observe a 19% reduction in execution time on 64 GPU nodes. Further, for GPULBM application, we are able to improve the performance of the evolution phase by 53% and 45% on 32 and 64 GPU nodes, respectively.","2168-9253","978-1-4673-6598-7","10.1109/CLUSTER.2015.21","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7307568","PGAS;OpenSHMEM;GPU Direct RDMA;CUDA","Graphics processing units;Performance evaluation;Peer-to-peer computing;Runtime;Electronics packaging;Programming;Pipeline processing","application program interfaces;graphics processing units;parallel architectures;shared memory systems","GPUDirect RDMA;GDR;high performance OpenSHMEM;NVIDIA GPU cluster;InfiniBand;IB network;partitioned global address space;PGAS programming model;shared memory address space abstraction;CUDA API","","8","","32","","29 Oct 2015","","","IEEE","IEEE Conferences"
"Designing a unified programming model for heterogeneous machines","M. Garland; M. Kudlur; Y. Zheng","NA; NA; Lawrence Berkeley Nat. Lab., Berkeley, CA, USA","SC '12: Proceedings of the International Conference on High Performance Computing, Networking, Storage and Analysis","25 Feb 2013","2012","","","1","11","While high-efficiency machines are increasingly embracing heterogeneous architectures and massive multithreading, contemporary mainstream programming languages reflect a mental model in which processing elements are homogeneous, concurrency is limited, and memory is a flat undifferentiated pool of storage. Moreover, the current state of the art in programming heterogeneous machines tends towards using separate programming models, such as OpenMP and CUDA, for different portions of the machine. Both of these factors make programming emerging heterogeneous machines unnecessarily difficult. We describe the design of the Phalanx programming model, which seeks to provide a unified programming model for heterogeneous machines. It provides constructs for bulk parallelism, synchronization, and data placement which operate across the entire machine. Our prototype implementation is able to launch and coordinate work on both CPU and GPU processors within a single node, and by leveraging the GASNet runtime, is able to run across all the nodes of a distributed-memory machine.","2167-4337","978-1-4673-0806-9","10.1109/SC.2012.48","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6468503","","Graphics processing units;Programming;Instruction sets;Runtime;Message systems;Parallel processing","distributed memory systems;multi-threading;programming languages","distributed memory machine;GASNet runtime;GPU processors;CPU processors;data placement;Phalanx programming model;CUDA;OpenMP;undifferentiated pool;mental model;contemporary mainstream programming languages;massive multithreading;heterogeneous architectures;high efficiency machines;heterogeneous machines;unified programming model","","19","","25","","25 Feb 2013","","","IEEE","IEEE Conferences"
"A case study of OpenCL on an Android mobile GPU","J. A. Ross; D. A. Richie; S. J. Park; D. R. Shires; L. L. Pollock","Engility Corporation, Chantilly, VA, USA; Brown Deer Technology, Forest Hill, MD, USA; U.S. Army Research Laboratory, APG, MD, USA; U.S. Army Research Laboratory, APG, MD, USA; University of Delaware, Newark, USA","2014 IEEE High Performance Extreme Computing Conference (HPEC)","12 Feb 2015","2014","","","1","6","An observation in supercomputing in the past decade illustrates the transition of pervasive commodity products being integrated with the world's fastest system. Given today's exploding popularity of mobile devices, we investigate the possibilities for high performance mobile computing. Because parallel processing on mobile devices will be the key element in developing a mobile and computationally powerful system, this study was designed to assess the computational capability of a GPU on a low-power, ARM-based mobile device. The methodology for executing computationally intensive benchmarks on a handheld mobile GPU is presented, including the practical aspects of working with the existing Android-based software stack and leveraging the OpenCL-based parallel programming model. The empirical results provide the performance of an OpenCL N-body benchmark and an auto-tuning kernel parameterization strategy. The achieved computational performance of the low-power mobile Adreno GPU is compared with a quad-core ARM, an ×86 Intel processor, and a discrete AMD GPU.","","978-1-4799-6233-4","10.1109/HPEC.2014.7040987","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7040987","handheld GPU;OpenCL;Android;N-body","Graphics processing units;Mobile communication;Androids;Humanoid robots;Performance evaluation;Benchmark testing;Computer architecture","Android (operating system);graphics processing units;mobile computing;parallel programming","Android mobile GPU;supercomputing;pervasive commodity product;mobile computing;parallel processing;mobile device;ARM;handheld mobile GPU;Android-based software stack;parallel programming;OpenCL N-body benchmark;autotuning kernel parameterization","","7","","25","","12 Feb 2015","","","IEEE","IEEE Conferences"
"Pro++: A Profiling Framework for Primitive-Based GPU Programming","N. Bombieri; F. Busato; F. Fummi","Department of Computer Science, University of Verona, Verona, Italy; Department of Computer Science, University of Verona, Verona, Italy; Department of Computer Science, University of Verona, Verona, Italy","IEEE Transactions on Emerging Topics in Computing","2 Sep 2018","2018","6","3","382","394","Parallelizing software applications through the use of existing optimized primitives is a common trend that mediates the complexity of manual parallelization and the use of less efficient directivebased programming models. Parallel primitive libraries allow software engineers to map any sequential code to a target many-core architecture by identifying the most computational intensive code sections and mapping them into one or more existing primitives. On the other hand, the spreading of such a primitivebased programming model and the different graphic processing unit (GPU) architectures has led to a large and increasing number of third-party libraries, which often provide different implementations of the same primitive, each one optimized for a specific architecture. From the developer point of view, this moves the actual problem of parallelizing the software application to selecting, among the several implementations, the most efficient primitives for the target platform. This paper presents Pro++, a profiling framework for GPU primitives that allows measuring the implementation quality of a given primitive by considering the target architecture characteristics. The framework collects the information provided by a standard GPU profiler and combines them into optimization criteria. The criteria evaluations are weighed to distinguish the impact of each optimization on the overall quality of the primitive implementation. This paper shows how the tuning of the different weights has been conducted through the analysis of five of the most widespread existing primitive libraries and how the framework has been eventually applied to improve the implementation performance of two standard and widespread primitives.","2168-6750","","10.1109/TETC.2016.2546554","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7447754","GPUs;performance model;parallel applications","Graphics processing units;Computational modeling;Instruction sets;Computer architecture;Optimization;Measurement;Libraries","graphics processing units;parallel programming;program diagnostics;software architecture;software libraries","third-party libraries;software application;profiling framework;GPU primitives;optimization criteria;primitive-based GPU programming;parallel primitive libraries;computational intensive code sections;parallelization;directive-based programming models;many-core architecture;Pro++;GPU profiler;primitive-based programming model;graphic processing unit architectures","","","","40","IEEE","5 Apr 2016","","","IEEE","IEEE Journals"
"Atmospheric Model Cluster Performance Evaluation on Hybrid MPI/OpenMP/Cuda Programming Model Platform","C. Osthoff; R. P. Souto; P. L. S. Dias; J. Panetta; P. Lopes","LNCC (Nat. Lab. for Sci. Comput.), Petropolis, Brazil; LNCC (Nat. Lab. for Sci. Comput.), Petropolis, Brazil; LNCC (Nat. Lab. for Sci. Comput.), Petropolis, Brazil; Nat. Lab. for Space Res., INPE, Sao Jose dos Campos, Brazil; Nat. Lab. for Space Res., INPE, Sao Jose dos Campos, Brazil","2012 31st International Conference of the Chilean Computer Science Society","2 Jan 2014","2012","","","216","222","This work discuss the parallel performance of a global numerical simulation model, Ocean-Land-Atmosphere Model (OLAM), on a hybrid multicore/GPU cluster environment, under the following programming models: 1) OLAM MPI implementation, on the multicore system, 2) OLAM hybrid MPI/OpenMP, which starts one MPI process on each node of the platform and one OpenMP thread on each core of the node, 3) OLAM hybrid MPI/OpenMP/Cuda implementation, which starts one MPI process on each node of the platform, one OpenMP threads on each core of the node and Cuda kernels on the GPUs. The results shows that the adopted programming model impacts significantly the performance of the application. We show that as we increase the number of cores, the OLAM MPI parallel implementation running one process on each cluster core executes faster than the other implementations.","1522-4902","978-1-4799-2938-2","10.1109/SCCC.2012.32","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6694092","Cluster;Multicore;GPU;Atmospheric Numerical Simulation Model;High Performance Computing","Atmospheric modeling;Graphics processing units;Computational modeling;Numerical models;Multicore processing;Kernel;Performance evaluation","atmospheric techniques;geophysics computing;graphics processing units;message passing;multiprocessing systems;multi-threading;parallel architectures","atmospheric model cluster performance evaluation;hybrid MPI/OpenMP/Cuda programming model platform;parallel performance;global numerical simulation model;ocean-land-atmosphere model;hybrid multicore/GPU cluster environment;programming models;multicore system;MPI process;OpenMP thread;Cuda kernels;OLAM MPI parallel implementation;cluster core","","1","","14","","2 Jan 2014","","","IEEE","IEEE Conferences"
"Performance and Power Efficiency Analysis of the Symmetric Cryptograph on Two Stream Processor Architectures","G. Xu; H. An; G. Liu; P. Yao; M. Xu; W. Han; X. Li; X. Hao","Dept. of Comput. Sci. & Technol., Univ. of Sci. & Technol. of China, Hefei, China; Dept. of Comput. Sci. & Technol., Univ. of Sci. & Technol. of China, Hefei, China; Dept. of Comput. Sci. & Technol., Univ. of Sci. & Technol. of China, Hefei, China; Dept. of Comput. Sci. & Technol., Univ. of Sci. & Technol. of China, Hefei, China; Dept. of Comput. Sci. & Technol., Univ. of Sci. & Technol. of China, Hefei, China; Dept. of Comput. Sci. & Technol., Univ. of Sci. & Technol. of China, Hefei, China; Dept. of Comput. Sci. & Technol., Univ. of Sci. & Technol. of China, Hefei, China; Dept. of Comput. Sci. & Technol., Univ. of Sci. & Technol. of China, Hefei, China","2009 Fifth International Conference on Intelligent Information Hiding and Multimedia Signal Processing","17 Nov 2009","2009","","","917","920","Multimedia and some scientific applications have achieved good performance on the stream processor architecture by employing the stream programming model. In order to find out the way to accelerate the symmetric cryptograph on stream processor, we implement and analyze cryptograph algorithms on different stream processors in this paper. Four cipher algorithms including RC5, AES, TWOFISH and 3DES in ECB model are implemented on three platforms, which are stream processor SPI Storm SP16-G160, NVIDIA GeForce 9800GTX, Intel Core2 dual-core processor E7300. The difference of architecture between two stream processors and the character of programming model are described. When we compare throughput rate of these applications, 9800GTX is shown with 4-30x performance improvement over E7300, SP16 achieves the highest power efficiency and obtains 15-20x increase over E7300 in Gops/Watt.","","978-1-4244-4717-6","10.1109/IIH-MSP.2009.41","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5337159","cryptograph;stream processor;GPU;stream programming model;accelerate;power efficiency","Performance analysis;Cryptography;Streaming media;Computer architecture;Acceleration;Signal processing algorithms;Storms;Multimedia systems;High performance computing;Hardware","computer architecture;cryptography;microcomputers;parallel processing;performance evaluation","performance analysis;power efficiency analysis;symmetric cryptograph;stream processor architecture;multimedia application;scientific application;stream programming model;cryptograph algorithms;cipher algorithms;RC5;AES;TWOFISH;3DES;SPI Storm SP16-G160;NVIDIA GeForce 9800GTX;Intel Core2 dual-core processor E7300","","1","","7","","17 Nov 2009","","","IEEE","IEEE Conferences"
"Dense linear algebra solvers for multicore with GPU accelerators","S. Tomov; R. Nath; H. Ltaief; J. Dongarra","Department of Electrical Engineering and Computer Science, University of Tennessee, Knoxville, USA; Department of Electrical Engineering and Computer Science, University of Tennessee, Knoxville, USA; Department of Electrical Engineering and Computer Science, University of Tennessee, Knoxville, USA; Department of Electrical Engineering and Computer Science, University of Tennessee, Knoxville, USA","2010 IEEE International Symposium on Parallel & Distributed Processing, Workshops and Phd Forum (IPDPSW)","24 May 2010","2010","","","1","8","Solving dense linear systems of equations is a fundamental problem in scientific computing. Numerical simulations involving complex systems represented in terms of unknown variables and relations between them often lead to linear systems of equations that must be solved as fast as possible. We describe current efforts toward the development of these critical solvers in the area of dense linear algebra (DLA) for multicore with GPU accelerators. We describe how to code/develop solvers to effectively use the high computing power available in these new and emerging hybrid architectures. The approach taken is based on hybridization techniques in the context of Cholesky, LU, and QR factorizations. We use a high-level parallel programming model and leverage existing software infrastructure, e.g. optimized BLAS for CPU and GPU, and LAPACK for sequential CPU processing. Included also are architecture and algorithm-specific optimizations for standard solvers as well as mixed-precision iterative refinement solvers. The new algorithms, depending on the hardware configuration and routine parameters, can lead to orders of magnitude acceleration when compared to the same algorithms on standard multicore architectures that do not contain GPU accelerators. The newly developed DLA solvers are integrated and freely available through the MAGMA library.","","978-1-4244-6534-7","10.1109/IPDPSW.2010.5470941","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5470941","Dense Linear Algebra Solvers;GPU Accelerators;Multicore;MAGMA;Hybrid Algorithms","Linear algebra;Multicore processing;Acceleration;Iterative algorithms;Linear accelerators;Linear systems;Equations;Computer architecture;Scientific computing;Numerical simulation","coprocessors;linear algebra;mathematics computing;matrix decomposition;multiprocessing systems;optimisation;parallel programming","dense linear algebra solvers;multicore systems;GPU accelerators;graphics processing unit;hybridization techniques;Cholesky factorization;LU factorization;QR factorization;parallel programming model;optimized BLAS software;LAPACK software;architecture-specific optimization;algorithm-specific optimization;MAGMA library","","117","2","14","","24 May 2010","","","IEEE","IEEE Conferences"
"An Efficient GPU Implementation for Large Scale Individual-Based Simulation of Collective Behavior","U. Erra; B. Frola; V. Scarano; I. Couzin","Dipt. di Mat. e Inf., Univ. della Basilicata, Italy; Dipt. di Mat. e Applicazioni, Univ. di Salerno, Salerno, Italy; Dipt. di Mat. e Applicazioni, Univ. di Salerno, Salerno, Italy; Dept. of Ecology & Evolutionary Biol., Princeton Univ., Princeton, NJ, USA","2009 International Workshop on High Performance Computational Systems Biology","30 Oct 2009","2009","","","51","58","In this work we describe a GPU implementation for an individual-based model for fish schooling. In this model each fish aligns its position and orientation with an appropriate average of its neighbors' positions and orientations. This carries a very high computational cost in the so-called nearest neighbors search. By leveraging the GPU processing power and the new programming model called CUDA we implement an efficient framework which permits to simulate the collective motion of high-density individual groups. In particular we present as a case study a simulation of motion of millions of fishes. We describe our implementation and present extensive experiments which demonstrate the effectiveness of our GPU implementation.","","978-0-7695-3809-9","10.1109/HiBi.2009.11","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5298705","gpu;individual-based model;large scale simulation","Large-scale systems;Biological system modeling;Computational modeling;Marine animals;Educational institutions;Computational systems biology;Birds;Organisms;Graphics;Sorting","artificial life;C language;computer graphics;digital simulation;search problems","large scale individual-based simulation;collective behavior;fish schooling;computational cost;nearest neighbor search;GPU processing power;CUDA programming model;graphics processing unit;collective motion;fish motion simulation","","15","","25","","30 Oct 2009","","","IEEE","IEEE Conferences"
================================================
FILE: notebooks/data/ieee_2.csv
================================================
"Document Title",Authors,"Author Affiliations","Publication Title",Date Added To Xplore,"Publication Year","Volume","Issue","Start Page","End Page","Abstract","ISSN",ISBNs,"DOI",Funding Information,PDF Link,"Author Keywords","IEEE Terms","INSPEC Controlled Terms","INSPEC Non-Controlled Terms","Mesh_Terms",Article Citation Count,Patent Citation Count,"Reference Count","License",Online Date,Issue Date,"Meeting Date","Publisher",Document Identifier
"Experiences with OpenMP, PGI, HMPP and OpenACC Directives on ISO/TTI Kernels","S. Ghosh; T. Liao; H. Calandra; B. M. Chapman","Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; TOTAL E&P R&T USA, LLC, Houston, TX, USA; TOTAL E&P, Pau, France; Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA","2012 SC Companion: High Performance Computing, Networking Storage and Analysis","11 Apr 2013","2012","","","691","700","GPUs are slowly becoming ubiquitous devices in High Performance Computing, as their capabilities to enhance the performance per watt of compute intensive algorithms as compared to multicore CPUs have been identified. The primary shortcoming of a GPU is usability, since vendor specific APIs are quite different from existing programming languages, and it requires a substantial knowledge of the device and programming interface to optimize applications. Hence, lately a growing number of higher level programming models are targeting GPUs to alleviate this problem. The ultimate goal for a high-level model is to expose an easy-to-use interface for the user to offload compute intensive portions of code (kernels) to the GPU, and tune the code according to the target accelerator to maximize overall performance with a reduced development effort. In this paper, we share our experiences of three of the notable high-level directive based GPU programming models - PGI, CAPS and OpenACC (from CAPS and PGI) on an Nvidia M2090 GPU. We analyze their performance and programmability against Isotropic (ISO)/Tilted Transversely Isotropic (TTI) finite difference kernels, which are primary components in the Reverse Time Migration (RTM) application used by oil and gas exploration for seismic imaging of the sub-surface. When ported to a single GPU using the mentioned directives, we observe an average 1.5-1.8x improvement in performance for both ISO and TTI kernels, when compared with optimized multi-threaded CPU implementations using OpenMP.","","978-0-7695-4956-9","10.1109/SC.Companion.2012.95","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6495877","GPGPU;OpenMP;OpenACC;PGI;CAPS;HMPP;ISO;TTI;Finite Difference Stencils;RTM","","finite difference methods;graphics processing units;multiprocessing systems;parallel processing;user interfaces","OpenMP directive;PGI directive;HMPP directive;OpenACC directive;GPU;graphics processing unit;high performance computing;compute intensive algorithm;multicore CPU;vendor specific API;application program interface;programming language;programming interface;easy-to-use user interface;Nvidia M2090 GPU;GPU programming model;isotropic kernel;tilted transversely isotropic kernel;ISO-TTI finite difference kernel;reverse time migration;RTM application","","6","","11","","11 Apr 2013","","","IEEE","IEEE Conferences"
"Evaluating Multi-core and Many-Core Architectures through Parallelizing a High-Order WENO Solver","L. Deng; H. Bai; D. Zhao; F. Wang","China Aerodynamics R&D Center, Comput. Aerodynamics Inst., Mianyang, China; China Aerodynamics R&D Center, Comput. Aerodynamics Inst., Mianyang, China; China Aerodynamics R&D Center, Comput. Aerodynamics Inst., Mianyang, China; Sch. of Comput., Nat. Univ. of Defense Technol., Changsha, China","2016 IEEE Trustcom/BigDataSE/ISPA","9 Feb 2017","2016","","","2167","2174","This paper studies the implementation and optimization of a high-order weighted essentially non-oscillatory (WENO) solver to the solution of the Euler equations on the multi-core and many-core architectures (Intel Ivy Bridge CPU, Intel Xeon Phi 7110P coprocessor and NVIDIA Kepler K20c GPU). The implementation of up to ninth-order accurate WENO schemes is used in the solver. For the GPU platform, both the OpenACC-based and CUDA-based versions of different WENO schemes are developed. To achieve high performance, various optimizatin techniques are used. For Ivy Bridge CPU and MIC, we focus on three categories of optimization techniques: thread parallelism for multi-/many-core scaling, data parallelism to exploit the SIMD mechanism and improving on-chip data reuse, to maximize the performance. Also, we provide an in-depth analysis on the performance differences between Ivy Bridge and MIC. The numerical experiments show that the OpenACC performance can reach up to 84% in contrast to CUDA performance with careful manual optimizations, and the proposed CUDA-based version can achieve a speedup of 9.0 on a Kepler GPU in comparison with the sequential run. We also notice that the speedups of different WENO schemes roughly reach 15.9 and 192.2 on the two Ivy Bridge CPUs and the MIC, respectively. Besides, we conduct a systematic comparison of the three platforms in three aspects: performance, programmability, and power efficiency. Our insights facilitate the programmers to select the right platform with a suitable programming model according to their target applications.","2324-9013","978-1-5090-3205-1","10.1109/TrustCom.2016.0333","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7847216","high-order;WENO solver;Euler equations;performance;programmability;optimization techniques;power efficiency;Ivy Bridge;MIC;GPU;CUDA;OpenACC","Graphics processing units;Mathematical model;Optimization;Programming;Bridges;Microwave integrated circuits;Computer architecture","differential equations;graphics processing units;multiprocessing systems;optimisation;parallel architectures","multicore architecture evaluation;many-core architecture evaluation;high-order WENO solver;high-order weighted essentially nonscillatory solver;Euler equations;Intel Ivy Bridge CPU;Intel Xeon Phi 7110P coprocessor;NVIDIA Kepler K20c GPU;OpenACC-based version;CUDA-based version;optimization techniques;thread parallelism;data parallelism;multicore scaling;many-core scaling;SIMD mechanism;on-chip data reuse improvement;programming model","","1","","22","","9 Feb 2017","","","IEEE","IEEE Conferences"
"A customizable MapReduce framework for complex data-intensive workflows on GPUs","Z. Qiao; Shuwen Liang; H. Jiang; Song Fu","Department of Computer Science and Engineering, University of North Texas, United States of America; Department of Computer Science and Engineering, University of North Texas, United States of America; Department of Computer Science, Arkansas State University, United States of America; Department of Computer Science and Engineering, University of North Texas, United States of America","2015 IEEE 34th International Performance Computing and Communications Conference (IPCCC)","18 Feb 2016","2015","","","1","8","The MapReduce programming model has been widely used in big data and cloud applications. Criticism on its inflexibility when being applied to complicated scientific applications recently emerges. Several techniques have been proposed to enhance its flexibility. However, some of them exert special requirements on applications, while others fail to support the increasingly popular coprocessors, such as Graphics Processing Unit (GPU). In this paper, we propose MR-Graph, a customizable and unified framework for GPU-based MapReduce, which aims to improve the flexibility and performance of MapReduce. MR-Graph addresses the limitations and restrictions of the traditional MapReduce execution paradigm. The three execution modes integrated in MR-Graph facilitates users to write their applications in a more flexible fashion by defining a Map and Reduce function call graph. MR-Graph efficiently explores the memory hierarchy in GPUs to reduce the data transfer overhead between execution stages and accommodate big data applications.We have implemented a prototype of MR-Graph and experimental results show the effectiveness of using MR-Graph for flexible and scalable GPU-based MapReduce computing.","2374-9628","978-1-4673-8590-9","10.1109/PCCC.2015.7410298","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7410298","MapReduce;GPU;Customizable;Data Intensive;Iterative;Recursive","Graphics processing units;Programming;Computational modeling;Data models;Parallel processing;Big data;Computer architecture","Big Data;cloud computing;graph theory;graphics processing units;parallel processing","customizable MapReduce framework;complex data-intensive workflows;MapReduce programming model;big data applications;cloud applications;graphics processing unit;MR-Graph;MapReduce execution paradigm;map and reduce function call graph;memory hierarchy;data transfer overhead;big data applications;GPU-based MapReduce computing","","2","","18","","18 Feb 2016","","","IEEE","IEEE Conferences"
"Human Skin Colour Detection Algorithm Optimization with CUDA","D. Ghorpade; A. D. Thakare","Dept. of Computer Engineering Pimpri Chinchwad College of Engineering, Pune, India; Dept. of Computer Engineering Pimpri Chinchwad College of Engineering, Pune, India","2017 International Conference on Computing, Communication, Control and Automation (ICCUBEA)","13 Sep 2018","2017","","","1","6","This Human Skin Colour detection is analyzed to be a most suitable and strong cue for face detection and face recognition which finds various application in domain like surveillance, face biometrics, gesture recognition, interactive game application and many other. These applications require fast image processing in real time and demands enormously high performance with respect to time and processing speed. Earlier work done on sequential architecture does not provide required capability and can be achieved by parallel programming. As Image processing applications shows high degree of parallelism, they prove excellent source for multi-core platform. We can use GPU multithreaded parallel computing techniques to improve the speed of image processing. The paper proposes a data parallelism programming model for Human Skin Colour Detection algorithm. The objective is to increase the computational speed of the algorithm through data parallelism using CUDA framework. The framework is supported by OpenCV libraries and implemented by GPU (Graphics Processing Unit). The evaluation is done on basis of comparative analysis of serial and parallel programming computing. The pixel based Explicitly Defined Region skin classifier is used and RGB colour space is chosen due to its wider use in storing and processing of digital image data. To gain substantial acceleration in image computations, skin classifier code is off-loaded to GPU having compute capacity of 3.5 and rest of code is executed on CPU. We have tested module on static images, as well as on live camera captured images. SFA standard dataset is utilized to evaluate performance. Speedup of 23.45% was achieved using parallel programming.","","978-1-5386-4008-1","10.1109/ICCUBEA.2017.8464010","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8464010","Human skin colour;GPU;Image processing;CUDA;Parallel processing;Colour space;RGB colour space;Skin classifier","Graphics processing units;Image color analysis;Skin;Instruction sets;Parallel processing;Computational modeling;Kernel","face recognition;graphics processing units;image classification;image colour analysis;multiprocessing systems;multi-threading;object detection","image processing applications;graphics processing unit;OpenCV libraries;pixel based explicitly defined region skin classifier;digital image data storage;SFA standard dataset;live camera captured images;static images;skin classifier code;image computations;RGB colour space;CUDA framework;computational speed;data parallelism programming model;GPU multithreaded parallel computing techniques;multicore platform;parallel programming;processing speed;fast image processing;interactive game application;gesture recognition;face biometrics;face recognition;face detection","","","","20","","13 Sep 2018","","","IEEE","IEEE Conferences"
"A way for accelerating DNA sequences reconstruction problem based on CUDA","Y. Zhong; J. Lin; B. Wang; C. Tao; X. Wen; C. Nian","Computer Science and Engineering Department, Sichuan University Jinjiang College, Penshan 620860, China; Computer Science and Engineering Department, Sichuan University Jinjiang College, Penshan 620860, China; Computer Science and Engineering Department, Sichuan University Jinjiang College, Penshan 620860, China; Computer Science and Engineering Department, Sichuan University Jinjiang College, Penshan 620860, China; Computer Science and Engineering Department, Sichuan University Jinjiang College, Penshan 620860, China; Computer Science and Engineering Department, Sichuan University Jinjiang College, Penshan 620860, China","2014 International Conference on Advances in Computing, Communications and Informatics (ICACCI)","1 Dec 2014","2014","","","151","157","Traditionally, shotgun for DNA sequences alignment is one of the main method of bioinformatics. It is used to break a long DNA sequence into small fragments. This paper introduces a new method to improve the efficiency of DNA sequence reconstruction after shotgun method using construction suffix array based on CUDA programming model. The experimental results show the construction of suffix array using GPU is an more efficient approach on Intel(R) Core(TM) i3-3110K quad-core and NVIDIA GeForce 610M GPU. Consequently, The experiment presents the efficiency of GPU performance compared with CPU performance, and study shows the method is more than 20 times speedup than that of CPU serial implementation.","","978-1-4799-3080-7","10.1109/ICACCI.2014.6968196","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6968196","CUDA;GPU;shotgun method;superstring;DNA sequence reassemble;suffix array;radix sort","DNA;Graphics processing units;Arrays","bioinformatics;DNA;graphics processing units;parallel architectures","DNA sequences reconstruction problem;DNA sequences alignment;bioinformatics;long DNA sequence;DNA sequence reconstruction;shotgun method;construction suffix array;CUDA programming model;Intel Core i3-3110K quadcore;NVIDIA GeForce 610M GPU","","","","13","","1 Dec 2014","","","IEEE","IEEE Conferences"
"Accelerating data clustering on GPU-based clusters under shared memory abstraction","K. I. Karantasis; E. D. Polychronopoulos; G. N. Dimitrakopoulos","High Performance Information Systems Lab, School of Computer Engineering and Informatics, University of Patras, Rio, Greece 26500; High Performance Information Systems Lab, School of Computer Engineering and Informatics, University of Patras, Rio, Greece 26500; High Performance Information Systems Lab, School of Computer Engineering and Informatics, University of Patras, Rio, Greece 26500","2010 IEEE International Conference On Cluster Computing Workshops and Posters (CLUSTER WORKSHOPS)","28 Oct 2010","2010","","","1","5","Many-core graphics processors are playing today an important role in the advancements of modern highly concurrent processors. Their ability to accelerate computation is being explored under several scientific fields. In the current paper we present the acceleration of a widely used data clustering algorithm, K-means, in the context of high performance GPU clusters. As opposed to most related implementation efforts that use MPI to port their target applications on a GPU cluster, our implementation follows the Software Distributed Shared Memory (SDSM) paradigm in order to distribute information and computation across the accelerator cluster. In order to investigate the efficiency of a programming model that offers shared memory abstraction on GPU clusters we present two implementations, one that is based on a SDSM implementation of OpenMP and another that utilizes the Pleiad cluster middleware on top of the Java platform. The first results show that such an implementation is feasible in order to accelerate a broad category of large scale, data intensive applications, among which K-means is a characteristic case.","","978-1-4244-8396-9","10.1109/CLUSTERWKSP.2010.5613079","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5613079","","Graphics processing unit;Clustering algorithms;Programming;Middleware;Acceleration;Graphics","data handling;distributed shared memory systems;message passing;multiprocessing programs;pattern clustering","data clustering;GPU-based clusters;shared memory abstraction;many-core graphics processors;concurrent processors;K-means algorithm;MPI;software distributed shared memory;OpenMP","","6","","24","","28 Oct 2010","","","IEEE","IEEE Conferences"
"Design and evaluation of a parallel k-nearest neighbor algorithm on CUDA-enabled GPU","S. Liang; Y. Liu; C. Wang; L. Jian","Graduate University of Chinese Academy of Sciences, Beijing, 100190, China; Graduate University of Chinese Academy of Sciences, Beijing, 100190, China; Agilent Technologies, Beijing, 100102, China; Graduate University of Chinese Academy of Sciences, Beijing, 100190, China","2010 IEEE 2nd Symposium on Web Society","21 Oct 2010","2010","","","53","60","Recent developments in Graphics Processing Units (GPUs) have enabled inexpensive high performance computing for general-purpose applications. Due to GPU's tremendous computing capability, it has emerged as the co-processor of CPU to achieve a high overall throughput. CUDA programming model provides the programmers adequate C language like APIs to better exploit the parallel power of the GPU. K-nearest neighbor (KNN) is a widely used classification technique and has significant applications in various domains, especially in text classification. The computational-intensive nature of KNN requires a high performance implementation. In this paper, we propose CUKNN, a CUDA-based parallel implementation of KNN. It launches two CUDA kernels, distance calculation kernel and selecting kernel. In the distance calculation kernel, a great number of concurrent CUDA threads are issued, where each thread performs the calculation between the query object and a reference object; in the selecting kernel, threads in a block find the local-k nearest neighbors of the query object concurrently, and then a thread is invoked to find the global-k nearest neighbors out of the queues of local-k neighbors. Various CUDA optimization techniques are applied to maximize the utilization of GPU. We evaluate our implementation by using synthetic dataseis and a real physical simulation dataset. The experimental results demonstrate that CUKNN outperforms the serial KNN on an HP xw8600 workstation significantly, achieving up to 46.7IX speedup on the synthetic dataseis and 42.49X on the physical simulation dataset including I/O cost. It also shows good scalability when varying the number of dimensions of the reference dataset, the number of objects in the reference dataset, and the number of objects in the query dataset.","2158-6993","978-1-4244-6359-6","10.1109/SWS.2010.5607480","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5607480","","Graphics processing unit;Instruction sets;Kernel;Nearest neighbor searches;Computational modeling;Programming;Classification algorithms","C language;computer graphic equipment;coprocessors;optimisation;pattern classification","parallel k-nearest neighbor algorithm;CUDA-enabled GPU;graphics processing units;coprocessor;C language;KNN;classification technique;text classification;parallel implementation;CUDA optimization techniques;query dataset","","12","1","18","","21 Oct 2010","","","IEEE","IEEE Conferences"
"Iterative tensor tracking using GPU for textile fabric defect detection","K. L. Mak; X. W. Tian","Department of Industrial and Manufacturing Systems Engineering, The University of Hong Kong, China; Department of Industrial and Manufacturing Systems Engineering, The University of Hong Kong, China","The 2010 International Conference on Green Circuits and Systems","9 Aug 2010","2010","","","375","380","This paper presents an efficient real-time implementation of an unsupervised textile fabric defect detection algorithm called ITT using the concept of iterative tensor tracking on graphics processing unit (GPU). The algorithm adopts a new local image descriptor, Spatial Histograms of Oriented Gradients (S-HOG), which is shift-invariant, light insensitive and space scalable. For a given textile fabric image, ITT iteratively updates and then analyzes S-HOG using tensor operations, in particular tensor decomposition to detect textile defects. To speedup the calculation required, ITT is implemented on the GPU using the Compute Unified Device Architecture (CUDA) programming model. The respective computational efficiencies of implementing ITT on the GPU and on the CPU are compared by using experiments. The results demonstrate that the computation speed of the former is on average thirty times and ten times faster than that of the later for updating the S-HOG and for detecting defects respectively because of its parallel processing nature.","","978-1-4244-6878-2","10.1109/ICGCS.2010.5543036","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5543036","","Tensile stress;Textiles;Fabrics;Detection algorithms;Graphics;Iterative algorithms;Histograms;Image analysis;Computer architecture;Computational efficiency","computer graphic equipment;coprocessors;fabrics;iterative methods;parallel architectures;production engineering computing;tensors;textiles;tracking","iterative tensor tracking;GPU;textile fabric defect detection;real-time implementation;graphics processing unit;local image descriptor;spatial histograms of oriented gradients;textile fabric image;tensor operations;tensor decomposition;compute unified device architecture programming;computation speed;parallel processing","","1","","9","","9 Aug 2010","","","IEEE","IEEE Conferences"
"An Evaluation of Unified Memory Technology on NVIDIA GPUs","W. Li; G. Jin; X. Cui; S. See","Center for High Performance Comput., Shanghai Jiao Tong Univ., Shanghai, China; Tokyo Inst. of Technol., Tokyo, Japan; Center for High Performance Comput., Shanghai Jiao Tong Univ., Shanghai, China; Center for High Performance Comput., Shanghai Jiao Tong Univ., Shanghai, China","2015 15th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing","9 Jul 2015","2015","","","1092","1098","Unified Memory is an emerging technology which is supported by CUDA 6.X. Before CUDA 6.X, the existing CUDA programming model relies on programmers to explicitly manage data between CPU and GPU and hence increases programming complexity. CUDA 6.X provides a new technology which is called as Unified Memory to provide a new programming model that defines CPU and GPU memory space as a single coherent memory (imaging as a same common address space). The system manages data access between CPU and GPU without explicit memory copy functions. This paper is to evaluate the Unified Memory technology through different applications on different GPUs to show the users how to use the Unified Memory technology of CUDA 6.X efficiently. The applications include Diffusion3D Benchmark, Parboil Benchmark Suite, and Matrix Multiplication from the CUDA SDK Samples. We changed those applications to corresponding Unified Memory versions and compare those with the original ones. We selected the NVIDIA Keller K40 and the Jetson TK1, which can represent the latest GPUs with Keller architecture and the first mobile platform of NVIDIA series with Keller GPU. This paper shows that Unified Memory versions cause 10% performance loss on average. Furthermore, we used the NVIDIA Visual Profiler to dig the reason of the performance loss by the Unified Memory technology.","","978-1-4799-8006-2","10.1109/CCGrid.2015.105","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7152596","Unified Memory;Heterogeneous Computing;CUDA programming model","Graphics processing units;Benchmark testing;Kernel;Programming;Computational modeling;Memory management;Random access memory","graphics processing units;parallel architectures;storage management","unified memory technology;NVIDIA GPUs;CUDA 6.X;CUDA programming model;data management;CPU;programming complexity;single coherent memory;Diffusion3D benchmark;parboil benchmark suite;matrix multiplication;CUDA SDK samples;NVIDIA Keller K40;Jetson TK1;Keller architecture;mobile platform;NVIDIA visual profiler","","27","","21","","9 Jul 2015","","","IEEE","IEEE Conferences"
"Improving Application Performance by Efficiently Utilizing Heterogeneous Many-core Platforms","J. Shen; A. L. Varbanescu; H. Sips","Parallel & Distrib. Syst. Group, Delft Univ. of Technol., Delft, Netherlands; Inf. Inst., Univ. of Amsterdam, Amsterdam, Netherlands; Parallel & Distrib. Syst. Group, Delft Univ. of Technol., Delft, Netherlands","2015 15th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing","9 Jul 2015","2015","","","709","712","Heterogeneous platforms integrating different types of processing units (such as multi-core CPUs and GPUs) are in high demand in high performance computing. Existing studies have shown that using heterogeneous platforms can improve application performance and hardware utilization. However, systematic methods to design, implement, and map applications to efficiently use heterogeneous computing resources are only very few. The goal of my PhD research is therefore to study such heterogeneous systems and propose systematic methods to allow many (classes of) applications to efficiently use them. After 3.5 years of PhD study, my contributions are (1) a thorough evaluation of a suitable programming model for heterogeneous computing, (2) a workload partitioning framework to accelerate parallel applications on heterogeneous platforms, (3) a modelling-based prediction method to determine the optimal workload partitioning, (4) a systematic approach to decide the best mapping between the application and the platform by choosing the best performing hardware configuration (Only-CPU, Only-GPU, or CPU+GPU with the workload partitioning). In the near future, I plan to apply my approach to large-scale applications and platforms to expand its usability and applicability.","","978-1-4799-8006-2","10.1109/CCGrid.2015.44","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7152538","Heterogeneous platforms;Workload partitioning;Hardware configuration;Multi-core CPUs;GPUs;Accelerators","Hardware;Systematics;Computational modeling;Kernel;Graphics processing units;Programming;Predictive models","graphics processing units;multiprocessing systems;performance evaluation","application performance improvement;heterogeneous many-core platforms;multicore CPU;multicore GPU;high-performance computing;hardware utilization improvement;heterogeneous computing resource usage;programming model;parallel applications;modeling-based prediction method;optimal workload partitioning;only-CPU hardware configuration;only-GPU hardware configuration;CPU-plus-GPU hardware configuration;large-scale applications","","1","3","10","","9 Jul 2015","","","IEEE","IEEE Conferences"
"Singular value decomposition on GPU using CUDA","S. Lahabar; P. J. Narayanan","Center for Visual Information Technology, International Institute of Information Technology, Hyderabad, India; Center for Visual Information Technology, International Institute of Information Technology, Hyderabad, India","2009 IEEE International Symposium on Parallel & Distributed Processing","10 Jul 2009","2009","","","1","10","Linear algebra algorithms are fundamental to many computing applications. Modern GPUs are suited for many general purpose processing tasks and have emerged as inexpensive high performance co-processors due to their tremendous computing power. In this paper, we present the implementation of singular value decomposition (SVD) of a dense matrix on GPU using the CUDA programming model. SVD is implemented using the twin steps of bidiagonalization followed by diagonalization. It has not been implemented on the GPU before. Bidiagonalization is implemented using a series of householder transformations which map well to BLAS operations. Diagonalization is performed by applying the implicitly shifted QR algorithm. Our complete SVD implementation outperforms the Matlab and Intel regMath kernel library (MKL) LAPACK implementation significantly on the CPU. We show a speedup of upto 60 over the MATLAB implementation and upto 8 over the Intel MKL implementation on a Intel Dual Core 2.66 GHz PC on NVIDIA GTX 280 for large matrices. We also give results for very large matrices on NVIDIA Tesla S1070.","1530-2075","978-1-4244-3751-1","10.1109/IPDPS.2009.5161058","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5161058","","Singular value decomposition;Linear algebra;Computer applications;Coprocessors;High performance computing;Matrix decomposition;Mathematical model;Kernel;Libraries;MATLAB","computer graphic equipment;linear algebra;matrix algebra;parallel processing;programming languages;singular value decomposition","singular value decomposition;graphics processing unit;high performance coprocessor;CUDA programming model;householder transformation;Intel Math kernel library;Matlab;Intel Dual Core PC;linear algebra algorithm;parallel coprocessor;frequency 2.66 GHz","","61","","25","","10 Jul 2009","","","IEEE","IEEE Conferences"
"CUDA-enabled Hadoop cluster for Sparse Matrix Vector Multiplication","M. Reza; A. Sinha; R. Nag; P. Mohanty","High Performance Computing Lab, School of Computer Science and Engineering, National Institute of Science & Technology, Berhampur-761008, India; High Performance Computing Lab, School of Computer Science and Engineering, National Institute of Science & Technology, Berhampur-761008, India; High Performance Computing Lab, School of Computer Science and Engineering, National Institute of Science & Technology, Berhampur-761008, India; High Performance Computing Lab, School of Computer Science and Engineering, National Institute of Science & Technology, Berhampur-761008, India","2015 IEEE 2nd International Conference on Recent Trends in Information Systems (ReTIS)","3 Sep 2015","2015","","","169","172","Compute Unified Device Architecture (CUDA) is an architecture and programming model that allows leveraging the high compute-intensive processing power of the Graphical Processing Units (GPUs) to perform general, non-graphical tasks in a massively parallel manner. Hadoop is an open-source software framework that has its own file system, the Hadoop Distributed File System (HDFS), and its own programming model, the Map Reduce, in order to accomplish the tasks of storage of very large amount of data and their fast processing in a distributed manner in a cluster of inexpensive hardware. This paper presents a model and implementation of a Hadoop-CUDA Hybrid approach to perform Sparse Matrix Vector Multiplication (SpMV) of very large matrices in a very high performing manner. Hadoop is used for splitting the input matrix into smaller sub-matrices, storing them on individual data nodes and then invoking the required CUDA kernels on the individual GPU-possessing cluster nodes. The original SpMV is done using CUDA. Such an implementation has been seen to improve the performance of the SpMV operation over very large matrices by speedup of around 1.4 in comparison to non-Hadoop, single-GPU CUDA implementation.","","978-1-4799-8349-0","10.1109/ReTIS.2015.7232872","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7232872","Hadoop;MapReduce;SpMV;CUDA;SCOO;GPGPU","Graphics processing units;Sparse matrices;Kernel;Instruction sets;Java;Programming;File systems","data handling;graphics processing units;parallel architectures","CUDA-enabled Hadoop cluster;sparse matrix vector multiplication;compute unified device architecture;programming model;high compute-intensive processing power;graphical processing units;massively parallel manner;open-source software framework;Hadoop distributed file system;Map Reduce;distributed manner;Hadoop-CUDA hybrid approach;input matrix;smaller sub-matrices;data nodes;GPU-possessing cluster nodes","","2","","11","","3 Sep 2015","","","IEEE","IEEE Conferences"
"GREEN Cache: Exploiting the Disciplined Memory Model of OpenCL on GPUs","J. Lee; D. H. Woo; H. Kim; M. Azimi","Intel Corporation, Hillsboro, OR; Google, Inc., Mountain View, CA; School of Computer Science, Georgia Institute of Technology, Atlanta, GA; Platform Architecture Research team in the Microprocessor and Programming Research group","IEEE Transactions on Computers","6 Oct 2015","2015","64","11","3167","3180","As various graphics processing unit architectures are deployed across broad computing spectrum from a hand-held or embedded device to a high-performance computing server, OpenCL becomes the de facto standard programming environment for general-purpose computing on graphics processing units. Unlike its CPU counterpart, OpenCL has several distinct features such as its disciplined memory model, which is partially inherited from conventional 3D graphics programming models. On the other hand, due to ever increasing memory bandwidth pressure and low power requirement, the capacity of on-chip caches in GPUs keeps increasing overtime. Given such trends, we believe that we have interesting programming model/architecture co-optimization opportunities, in particular, how to energy-efficiently utilize large on-chip caches for GPUs. In this paper, as a showcase, we study the characteristics of the OpenCL memory model and propose a technique called GPU Region-aware energy-efficient non-inclusive cache hierarchy, or GREEN cache hierarchy. With the GREEN cache, our simulation results show that we can save 56 percent of dynamic energy in the L1 cache, 39 percent of dynamic energy in the L2 cache, and 50 percent of leakage energy in the L2 cache with practically no performance degradation and off-chip access increases.","1557-9956","","10.1109/TC.2015.2395435","US National Science Foundation(grant numbers:1054830); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7018047","OpenCL;GPU;Cache;OpenCL;GPU;cache","Graphics processing units;Kernel;Computational modeling;Programming;Memory management;Hardware;Training","cache storage;energy conservation;graphics processing units;low-power electronics;power aware computing","disciplined memory model;graphics processing unit architectures;hand-held device;embedded device;high-performance computing server;de facto standard programming environment;general-purpose computing;3D graphics programming models;memory bandwidth;low power requirement;programming architecture;energy efficiency;large on-chip caches;GPU;OpenCL memory model;region-aware energy-efficient noninclusive cache hierarchy;GREEN cache hierarchy;dynamic energy;L1 cache;L2 cache;leakage energy;off-chip access","","7","","40","IEEE","22 Jan 2015","","","IEEE","IEEE Journals"
"Fast CUDA-based codec for height fields","Đ. M. Đurđević; I. I. Tartalja","School of Electrical Engineering, University of Belgrade, Bul. kralja Aleksandra 73, 11120, Serbia; School of Electrical Engineering, University of Belgrade, Bul. kralja Aleksandra 73, 11120, Serbia","2013 21st Telecommunications Forum Telfor (TELFOR)","20 Jan 2014","2013","","","947","954","Following the advances in remote sensing technology in the last decade, the horizontal and vertical scan resolutions for digital terrains have reached the order of a meter and decimeter, respectively. At these resolutions, descriptions of real terrains require very large storage spaces. Efficient storage, transfer, retrieval, and manipulation of such large amounts of data require an efficient compression method. This paper presents a method for fast lossy and lossless compression of regular height fields, which are a commonly used solution for representing surfaces scanned at regular intervals along two axes. The method is suitable for SIMD parallel implementation and thus inherently suitable for modern GPU architectures, which significantly outperform modern CPUs in computation speed, and are already present in home computers. The method allows independent decompression of individual data points, as well as progressive decompression. Even in the case of lossy decompression, the decompressed surface is inherently seamless. The method's efficiency was confirmed through a CUDA implementation of compression and decompression algorithms, and application in a terrain visualization system.","","978-1-4799-1420-3","10.1109/TELFOR.2013.6716388","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6716388","height field;lossy and lossless compression;progressive decompression;SIMD parallelism;GPU friendly algorithm;CUDA programming model;terrain visualization","Graphics processing units;Image coding;Approximation methods;Parallel processing;Data visualization;Vegetation;Educational institutions","codecs;data compression;geophysical image processing;graphics processing units;parallel architectures;remote sensing","CUDA based codec;height fields;horizontal scan resolution;vertical scan resolution;digital terrains;regular height field lossy compression;regular height field lossless compression;SIMD parallel implementation;GPU architecture;terrain visualization system","","","","31","","20 Jan 2014","","","IEEE","IEEE Conferences"
"Unified Cross-Platform Profiling of Parallel C++ Applications","V. Kucher; F. Fey; S. Gorlatch","University of Muenster, Einsteinstr. 62, Muenster, Germany; University of Muenster, Einsteinstr. 62, Muenster, Germany; University of Muenster, Einsteinstr. 62, Muenster, Germany","2018 IEEE/ACM Performance Modeling, Benchmarking and Simulation of High Performance Computer Systems (PMBS)","14 Feb 2019","2018","","","57","62","To address the great variety of available parallel hardware architectures (CPUs, GPUs, etc.), high-performance applications increasingly demand cross-platform portability. While unified programming models like OpenCL or SYCL provide the ultimate portability of code, the profiling of applications in the development process is still done by using different platform-specific tools of the corresponding hardware vendors. We design and implement a unified, cross-platform profiling interface by extending the PACXX framework for unified programming in C++. With our profiling interface, a single tool is used to profile parallel C++ applications across different target platforms. We illustrate and evaluate our uniform profiler using an example application of matrix multiplication for CPU and GPU architectures.","","978-1-7281-0182-8","10.1109/PMBS.2018.8641652","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8641652","C++;parallelism;many-cores;GPU programming;cross-platform;unified programming model;profiling","Kernel;Computer architecture;Hardware;Graphics processing units;Measurement;Tools;C++ languages","C++ language;graphics processing units;matrix multiplication;multiprocessing systems;parallel architectures;parallel programming","unified cross-platform profiling;parallel C++ applications;high-performance applications;parallel hardware architectures;hardware vendors;OpenCL;SYCL;platform-specific tools;PACXX;matrix multiplication;GPU architectures;CPU architectures","","","","16","","14 Feb 2019","","","IEEE","IEEE Conferences"
"Exploiting GPUs to Simulate Complex Systems","F. Messina; G. Pappalardo; C. Santoro","Dipt. di Mat. e Inf., Univ. di Catania, Catania, Italy; Dipt. di Mat. e Inf., Univ. di Catania, Catania, Italy; Dipt. di Mat. e Inf., Univ. di Catania, Catania, Italy","2013 Seventh International Conference on Complex, Intelligent, and Software Intensive Systems","19 Sep 2013","2013","","","535","540","This paper describes GCS (GPU-aware ComplexSim), a simulation framework for complex systems which is capable of executing on GPUs exploiting the CUDA programming model. GCS is based on an architecture similar to a previous work, ComplexSim, which provides simulation functionalities on symmetric multiprocessing (SMP) systems. With the current architecture of GCS, the simulation of the complex system run on GPUs, while tasks related to graph analysis still run on the host, by exploiting the embedded multi-thread engine of ComplexSim. The user code can be provided as a behaviour function, without taking into account issues related to task parallelisation, which are managed by the engine of GCS. In GCS, network data -"" as links and mailboxes -"" are organised as SoA (Structure of Array) to deal with the constraints and optimisation issues related to GPU architecture and the CUDA programming model. Moreover nodes attributes are defined by the user as in the case of ComplexSim, but GCS automatically organises them into SoA. GCS exhibits a significant improvement, in terms of simulation times, if compared to ComplexSim running on a SMP system.","","978-0-7695-4992-7","10.1109/CISIS.2013.97","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6603946","","Graphics processing units;Message systems;Arrays;Instruction sets;Engines;Data models","digital simulation;embedded systems;graphics processing units;large-scale systems;multiprocessing systems;multi-threading;parallel architectures","complex systems;GCS;GPU-aware ComplexSim;simulation framework;CUDA programming model;symmetric multiprocessing;SMP systems;graph analysis;embedded multithread engine;user code;network data;SoA;structure of array;GPU architecture","","12","","29","","19 Sep 2013","","","IEEE","IEEE Conferences"
"Parallelizing the cellular potts model on GPU and multi-core CPU: An OpenCL cross-platform study","C. Yu; B. Yang","School of Computer Science and Engineering, University of Electronic Science and Technology of China, Chengdu, China; School of Computer Science and Engineering, University of Electronic Science and Technology of China, Chengdu, China","2014 11th International Joint Conference on Computer Science and Software Engineering (JCSSE)","26 Jun 2014","2014","","","117","122","In this paper, we present the analysis and development of a cross-platform OpenCL parallelization of the Cellular Potts Model (CPM). In general, the evolution of the CPM is time-consuming. Using data-parallel programming model such as CUDA can accelerate the process, but it is highly dependent on the hardware type and manufacturer. Recently, OpenCL has attracted a lot of attention and been widely used by researchers. OpenCL provides a flexible solution, which allows us to come up with an implementation that can execute on both GPUs and multi-core CPUs regardless of the hardware type and manufacturer. Some optimizations are also made for both GPU and multi-core CPU implementations of the CPM, and we also propose a resource management method, MLBBRM. Experimental results show that the developed optimized algorithms for both GPU and multi-core CPU have an average speedup of about 30× and 8× respectively compared with the single threaded CPU implementation.","","978-1-4799-5822-1","10.1109/JCSSE.2014.6841853","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6841853","Cellular Potts Model;OpenCL;Parallel computing;Cross-platform","Computer science;Software engineering","biology computing;cellular biophysics;graphics processing units;multiprocessing systems;parallel processing;resource allocation","cross-platform OpenCL parallelization;cellular Potts model;CPM;GPU;optimizations;multicore CPU implementations;resource management method;MLBBRM","","3","","17","","26 Jun 2014","","","IEEE","IEEE Conferences"
"Tradeoffs and Considerations in the Design of Accelerators for Database Applications","R. Moussalli","T.J. Watson Res. Center, Accel. Platforms Group, IBM, Yorktown Heights, NY, USA","2017 IEEE 33rd International Conference on Data Engineering (ICDE)","18 May 2017","2017","","","1615","1615","General purpose processors have traditionally been favored over application-specific architectures due to the provided flexibility, standardized and simpler programming model, as well as significant reduction in development time. Fueled by the steady advances in transistor scaling, general purpose CPUs satisfied the performance needs of most applications. While CPUs were becoming ubiquitous, advances in digital storage technologies and sensing devices (cameras, microphones, etc) led to massive and sky-rocketing amounts of data being generated by devices of all scales. Extracting insights out of this Big Data introduces significant opportunities for business intelligence, though the growth of data volumes and complexity of query patterns has been increasing at a startling rate. With Moore's law ending, transistors' shrinking coming to a halt and CPU performance saturating, accelerator technologies are increasingly embraced to augment general purpose CPUs and to address performance concerns. Accelerators diverge from traditional CPU architectures in the way they utilize the available silicon resources. In particular, accelerators maximize the resources available for raw computing (ALUs, Floating Point Units) and push back the burden of correct program semantics and control to higher levels of the stack including the compiler and programming models, while focusing on a selected subset of applications. Accelerators include Application Specific Integrated Circuits (ASICs), Field Programmable Gate Arrays (FPGAs) and General Purpose Graphics Processing Units (GPGPUs), each with their programming model, advantages and challenges. FPGAs enable the deployment of deep custom pipelines, whereas GPGPUs provide hundreds of small processors executing in a massively parallel fashion. Compared to CPUs, accelerators attain higher performance out of the available transistors for a wide range of applications. This talk covers tradeoffs of accelerators (FPGA and GPGPU) specific to a set of database applications, namely XML filtering, spatiotemporal analytics in the context of the Internet of Things, and relational database querying. Tradeoff metrics include programmability, performance, accuracy and energy consumption. While accelerators achieve high speedups for ""hot"" code paths, the attach point of accelerators in a system significantly impacts the end-to-end application performance. As such, system and deployment-level considerations must be made. To this end, I will go over IBM's efforts to facilitate the inclusion and increase the adoption of accelerators. These include (1) the Coherent Accelerator Processor Interface (CAPI), reducing software refactoring from the CPU side as well as CPU-accelerator latency, (2) the ConTutto research platform for acceleration innovation in the memory subsystem, providing very high bandwidth to accelerators, and (3) NVLink®-enabled IBM POWER® processors.","2375-026X","978-1-5090-6543-1","10.1109/ICDE.2017.238","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7930135","accelerator;acceleration;hardware;FPGA;GPU;database;ConTutto;CAPI;NVLink","Program processors;Field programmable gate arrays;Integrated circuit modeling;Trademarks;Databases;Programming;Transistors","Internet of Things;query processing;relational databases;software maintenance;XML","database applications;programming models;application specific integrated circuits;ASIC;field programmable gate arrays;FPGA;general purpose graphics processing units;GPGPU;deep custom pipelines;XML filtering;spatiotemporal analytics;Internet of Things;relational database querying;programmability;energy consumption;deployment-level considerations;coherent accelerator processor interface;CAPI;software refactoring;CPU-accelerator latency;ConTutto research platform;acceleration innovation;memory subsystem;NVLink-enabled IBM POWER processors;compiler;program semantics;floating point units;ALU;raw computing;accelerators;silicon resources;CPU architectures;accelerator technologies;CPU performance saturating;Moore law ending;query patterns;Big Data;sky-rocketing amounts;sensing devices;digital storage technologies;general purpose CPU;transistor scaling;development time;simpler programming model;standardized;flexibility;application-specific architectures;general purpose processors","","2","","","","18 May 2017","","","IEEE","IEEE Conferences"
"Achieving Portability and Performance through OpenACC","J. A. Herdman; W. P. Gaudin; O. Perks; D. A. Beckingsale; A. C. Mallinson; S. A. Jarvis","High Performance Comput., AWE plc, Aldermaston, UK; High Performance Comput., AWE plc, Aldermaston, UK; High Performance Comput., AWE plc, Aldermaston, UK; Dept. of Comput. Sci., Univ. of Warwick, Warwick, UK; Dept. of Comput. Sci., Univ. of Warwick, Warwick, UK; Dept. of Comput. Sci., Univ. of Warwick, Warwick, UK","2014 First Workshop on Accelerator Programming using Directives","9 Apr 2015","2014","","","19","26","OpenACC is a directive-based programming model designed to allow easy access to emerging advanced architecture systems for existing production codes based on Fortran, C and C++. It also provides an approach to coding contemporary technologies without the need to learn complex vendor-specific languages, or understand the hardware at the deepest level. Portability and performance are the key features of this programming model, which are essential to productivity in real scientific applications. OpenACC support is provided by a number of vendors and is defined by an open standard. However the standard is relatively new, and the implementations are relatively immature. This paper experimentally evaluates the currently available compilers by assessing two approaches to the OpenACC programming model: the ""parallel"" and ""kernels"" constructs. The implementation of both of these construct is compared, for each vendor, showing performance differences of up to 84%. Additionally, we observe performance differences of up to 13% between the best vendor implementations. OpenACC features which appear to cause performance issues in certain compilers are identified and linked to differing default vector length clauses between vendors. These studies are carried out over a range of hardware including GPU, APU, Xeon and Xeon Phi based architectures. Finally, OpenACC performance, and productivity, are compared against the alternative native programming approaches on each targeted platform, including CUDA, OpenCL, OpenMP 4.0 and Intel Offload, in addition to MPI and OpenMP.","","978-1-4673-6753-0","10.1109/WACCPD.2014.10","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7081674","","Kernel;Graphics processing units;Computer architecture;Programming;Acceleration;Hardware;Microprocessors","application program interfaces;software performance evaluation;software portability;software standards","OpenMP;Intel Offload;MPI;OpenCL;CUDA;native programming approaches;Xeon Phi based architectures;APU;GPU;OpenACC features;kernels constructs;parallel constructs;OpenACC programming model;open standard;real scientific applications;C++ language;C language;Fortran;production codes;advanced architecture systems;directive-based programming model;portability","","8","","20","","9 Apr 2015","","","IEEE","IEEE Conferences"
"Fast parallel interpolation algorithm using CUDA","Y. Zhao; Q. Qiu; J. Fang; L. Li","Institute of Computing Technology, Chinese Academy of Sciences, Beijing 100190, China; Institute of Computing Technology, Chinese Academy of Sciences, Beijing 100190, China; Institute of Computing Technology, Chinese Academy of Sciences, Beijing 100190, China; Institute of Computing Technology, Chinese Academy of Sciences, Beijing 100190, China","2013 IEEE International Geoscience and Remote Sensing Symposium - IGARSS","27 Jan 2014","2013","","","3662","3665","Interpolation is one time consuming and serial operation in the fields of spatial information processing. While fast processing speed is often required in some real-time interactive scenarios. With the development of Purpose computing on Graphics Processing Units (GPGPU), it provides an opportunity to accelerate some traditional inefficient algorithms with low-cost and low-power compared to clusters. In this paper, we mapped the Inverse distance weighted (IDW) interpolation method to Compute Unified Device Architecture (CUDA) parallel programming model. Taking the advantage of Graphics Processing Unit (GPU) parallel computing, we build two-level indexes on GPU, then clever blocking schemes are used to assign computing task among different threads. After illustrate the parallel interpolation process, we conduct several experiments, the result shows the correctness and high efficiency of our optimized implementation. With larger influence radius and massive data, the performance can obtain dozens of times speedups over a very similar single-threaded CPU implementation.","2153-7003","978-1-4799-1114-1","10.1109/IGARSS.2013.6723624","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6723624","parallel interpolation;GPGPU;CUDA;Inverse distance weighted interpolation","Graphics processing units;Interpolation;Indexes;Tiles;Instruction sets;Binary codes;Real-time systems","graphics processing units;interpolation;mathematics computing;multi-threading;parallel architectures","parallel interpolation algorithm;spatial information processing;processing speed;real-time interactive scenarios;GPGPU;inverse distance weighted interpolation method;IDW interpolation method;compute unified device architecture;CUDA parallel programming model;graphics processing unit parallel computing;GPU parallel computing;two-level indexes;blocking schemes;computing task assignment;multithreading;performance improvement","","","1","9","","27 Jan 2014","","","IEEE","IEEE Conferences"
"Evaluating cache coherent shared virtual memory for heterogeneous multicore chips","B. A. Hechtman; D. J. Sorin","Department of Electrical and Computer Engineering, Duke University, USA; Department of Electrical and Computer Engineering, Duke University, USA","2013 IEEE International Symposium on Performance Analysis of Systems and Software (ISPASS)","15 Jul 2013","2013","","","118","119","Although current homogeneous chips tightly couple the cores with cache-coherent shared virtual memory (CCSVM), this is not the communication paradigm used by any current heterogeneous chip. In this paper, we present a CCSVM design for a CPU/GPU chip, as well as an extension of the pthreads programming model for programming this HMC. We experimentally compare CCSVM/xthreads to a state-of-the-art CPU/GPU chip from AMD that runs OpenCL software. CCSVM's more efficient communication enables far better performance and far fewer DRAM accesses.","","978-1-4673-5779-1","10.1109/ISPASS.2013.6557152","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6557152","","Graphics processing units;Multicore processing;Instruction sets;Programming;Random access memory;Couplings","graphics processing units;integrated circuit design;multi-threading;virtual storage","cache coherent shared virtual memory evaluation;CCSVM design;heterogeneous multicore chips;homogeneous chips;GPU chip;CPU chip;pthreads programming model;HMC;AMD;OpenCL software;DRAM accesses;xthreads","","9","","6","","15 Jul 2013","","","IEEE","IEEE Conferences"
"Fine-Granular Parallel EBCOT and Optimization with CUDA for Digital Cinema Image Compression","F. Wei; Q. Cui; Y. Li","Sch. of Inf. & Commun. Eng., Beijing Univ. of Posts & Telecommun., Beijing, China; Sch. of Inf. & Commun. Eng., Beijing Univ. of Posts & Telecommun., Beijing, China; Sch. of Inf. & Commun. Eng., Beijing Univ. of Posts & Telecommun., Beijing, China","2012 IEEE International Conference on Multimedia and Expo","13 Sep 2012","2012","","","1051","1054","JPEG2000 has been accepted by The Society of Motion Picture and Television Engineers (SMPTE) as the image compression standard for the digital distribution of motion pictures. In JPEG2000, the biggest contribution to the coding performance comes from the Embedded Block Coding with Optimized Truncation (EBCOT), which is also the most time-consuming module by occupying almost 37% of the encoding time. There have been many research activities in the optimization of EBCOT on platforms like FPGA and VLSI, but on Graphics Processing Unit (GPU), a currently popular parallel computing platform in post-production of motion pictures, still few works have been done. This paper proposes a fine-granular parallel EBCOT by re-designing the highly serialized bit-plane coding to a parallel structure where the coding of all bits in a bit-plane could be performed in parallel, then the bit coding tasks can be distributed to the stream processors in GPU by taking advantage of the programming and memory model of CUDA. Experimental results show that our algorithms reveal 3 to 4 times computational speed improvement on an ordinary GPU compared to that on CPU.","1945-788X","978-1-4673-1659-0","10.1109/ICME.2012.115","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6298542","EBCOT;GPU;CUDA;JPEG2000;DCI","Graphics processing unit;Encoding;Image coding;Transform coding;Motion pictures;Instruction sets;Strips","block codes;cinematography;graphics processing units;image coding;image motion analysis;parallel architectures","fine-granular parallel EBCOT;digital cinema image compression;JPEG2000;Society of Motion Picture and Television Engineers;image compression standard;digital distribution;coding performance;embedded block coding with optimized truncation;EBCOT optimization;graphics processing unit;GPU;parallel computing platform;motion picture post-production;bit-plane coding;parallel structure;stream processors;CUDA programming model;CUDA memory model;computational speed improvement","","6","","12","","13 Sep 2012","","","IEEE","IEEE Conferences"
"A real time Breast Microwave Radar imaging reconstruction technique using simt based interpolation","D. Flores-Tapia; S. Pistorius","Division of Medical Physics, CancerCare Manitoba, USA; Division of Medical Physics, CancerCare Manitoba, USA","2010 IEEE International Conference on Image Processing","3 Dec 2010","2010","","","1389","1392","Breast Microwave Radar(BMR) is a novel imaging modality that is capable of producing high contrast images and can detect tumors of at least 4mm. To properly visualize the responses from the breast structures, BMR data sets must be reconstructed. In this paper, a real time BMR image formation technique is proposed. This approach is based on the use of a Single Instruction Multiple Thread(SIMT) interpolation method. By using this programming model, the proposed approach can be implemented on General Purpose Graphic Processing Unit (GPGPU) platform to speed up the reconstruction process. The proposed method yielded promising results when applied to simulated data sets obtained using anatomically accurate numeric phantoms. In average, the proposed approach yielded speed increases of one order of magnitude compared to its CPU counterpart, and two orders of magnitude with respect to current BMR reconstruction techniques.","2381-8549","978-1-4244-7994-8","10.1109/ICIP.2010.5652126","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5652126","Breast microwave radar;GPU;real time image processing","Image reconstruction;Interpolation;Breast;Microwave imaging;Radar imaging;Microwave theory and techniques;Computational modeling","biological organs;computer graphic equipment;coprocessors;image reconstruction;interpolation;medical image processing;microwave imaging;multi-threading;radar imaging;tumours","real time breast microwave radar imaging reconstruction technique;high contrast images;tumors;BMR data sets;BMR image formation technique;single instruction multiple thread interpolation method;programming model;general purpose graphic processing unit platform;simulated data sets;numeric phantoms;CPU;BMR reconstruction techniques;SIMT","","2","","10","","3 Dec 2010","","","IEEE","IEEE Conferences"
"Leveraging Data-Flow Task Parallelism for Locality-Aware Dynamic Scheduling on Heterogeneous Platforms","O. S. Simsek; A. Drebes; A. Pop","Sch. of Comput. Sci., Univ. of Manchester, Manchester, UK; Sch. of Comput. Sci., Univ. of Manchester, Manchester, UK; Sch. of Comput. Sci., Univ. of Manchester, Manchester, UK","2018 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","6 Aug 2018","2018","","","540","549","Writing programs for heterogeneous platforms is challenging, since programmers must deal with multiple programming models, partition work for CPUs and accelerators with different compute capabilities, and manage memory in multiple distinct address spaces. We show that using a task-parallel data-flow programming model, in which parallelism is specified in a platform-neutral description that abstracts in particular from the heterogeneity of the hardware, efficient execution can be carried out by a run-time system at execution time using an appropriate task scheduling and memory allocation scheme. This is achieved through dynamic scheduling of tasks by reducing the dependence exchanges between devices, interleaved execution of tasks and transfer between host and device memory, and load balancing across CPUs and GPUs. Our results show our technique increases the number of tasks offloaded to the GPU and improves data locality of GPU tasks leading to a significant reduction of GPU idle time and thus to substantial improvements of performance.","","978-1-5386-5555-9","10.1109/IPDPSW.2018.00093","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8425460","Task-parallelism;heterogeneous systems;scheduling;memory allocation","Task analysis;Graphics processing units;Dynamic scheduling;Memory management;Processor scheduling;Data transfer","graphics processing units;multiprocessing systems;parallel processing;parallel programming;processor scheduling;resource allocation","locality-aware dynamic scheduling;heterogeneous platforms;multiple programming models;partition work;CPUs;multiple distinct address;task-parallel data-flow programming model;platform-neutral description;run-time system;execution time;appropriate task scheduling;device memory;data locality;GPU tasks;GPU idle time;compute capabilities;data-flow task parallelism","","1","","20","","6 Aug 2018","","","IEEE","IEEE Conferences"
"An Enhanced Profiling Framework for the Analysis and Development of Parallel Primitives for GPUs","N. Bombieri; F. Busato; F. Fummi","Dept. of Comput. Sci., Univ. of Verona, Verona, Italy; Dept. of Comput. Sci., Univ. of Verona, Verona, Italy; Dept. of Comput. Sci., Univ. of Verona, Verona, Italy","2015 IEEE 9th International Symposium on Embedded Multicore/Many-core Systems-on-Chip","12 Nov 2015","2015","","","1","8","Parallelizing software applications through the use of existing optimized % target-oriented primitives is a common trend that mediates the complexity of manual parallelization and the use of less efficient directive-based programming models. Parallel primitive libraries allow software engineers to map any sequential code to a target many-core architecture by identifying the most computational intensive code sections and mapping them into one ore more existing primitives. On the other hand, the spreading of such a primitive-based programming model and the different GPU architectures have led to a large and increasing number of third-party libraries, which often provide different implementations of the same primitive, each one optimized for a specific architecture. From the developer point of view, this moves the actual problem of parallelizing the software application to selecting, among the several implementations, the most efficient primitives for the target platform. This paper presents a profiling framework for GPU primitives, which allows measuring the implementation quality of a given primitive by considering the target architecture characteristics. The framework collects the information provided by a standard GPU profiler and combines them into optimization criteria. The criteria evaluations are weighed to distinguish the impact of each optimization on the overall quality of the primitive implementation. The paper shows how the tuning of the different weights has been conducted through the analysis of five of the most widespread existing primitive libraries and how the framework has been eventually applied to improve the implementation performance of a standard primitive.","","978-1-4799-8670-5","10.1109/MCSoC.2015.16","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7328180","","Graphics processing units;Kernel;Instruction sets;Optimization;Libraries;Synchronization","graphics processing units;parallel programming","profiling framework;software applications parallelization;parallel primitives;GPU;graphics processing unit;directive-based programming models;many-core architecture;primitive-based programming model;GPU profiler","","1","","18","","12 Nov 2015","","","IEEE","IEEE Conferences"
"ST-Accel: A High-Level Programming Platform for Streaming Applications on FPGA","Z. Ruan; T. He; B. Li; P. Zhou; J. Cong","Univ. of California, Los Angeles, Los Angeles, CA, USA; Univ. of California, Los Angeles, Los Angeles, CA, USA; Microsoft Res. Univ. of Sci. & Technol. of China, China; Univ. of California, Los Angeles, Los Angeles, CA, USA; Univ. of California, Los Angeles, Los Angeles, CA, USA","2018 IEEE 26th Annual International Symposium on Field-Programmable Custom Computing Machines (FCCM)","11 Sep 2018","2018","","","9","16","In recent years we have witnessed the emergence of the FPGA in many high-performance systems. This is due to FPGA's high reconfigurability and improved user-friendly programming environment. OpenCL, supported by major FPGA vendors, is a high-level programming platform that liberates hardware developers from having to deal with the complex and error-prone HDL development. While OpenCL exposes a GPU-like programming model, which is well-suited for compute-intensive tasks, in many state-of-art systems that deploy FPGA, we observe that the workloads are streaming-like, which is communication-intensive. This mismatch leads to low throughput and high end-to-end latency. In this paper, we propose ST-Accel, a new high-level programming platform for streaming applications on FPGA. It has the following advantages: (i) ST-Accel adopts the multiprocessing programming model to capture the inherent pipeline-level parallelism of streaming applications while reducing the end-to-end latency. (ii) A message-passing-based host/FPGA communication model is used to avoid the coherency issue of shared memory, thus enabling host/FPGA communication during kernel execution. (iii) ST-Accel provides a high-level abstraction for I/O devices to support direct I/O device access that eliminates the overhead of host CPU and reduces the I/O latency. (iv) ST-Accel enables the decoupled access/execute architecture to maximize the utilization of I/O devices. (v) The host/FPGA communication interface is redesigned to cater to the demands of both latency-critical and throughput-critical scenarios. The experimental results on the Amazon AWS cloud and local machine show that ST-Accel can achieve 1.6X-166X throughput and 1/3 latency for typical streaming workloads when compared to OpenCL.","2576-2621","978-1-5386-5522-1","10.1109/FCCM.2018.00011","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8457626","FPGA;OpenCL;Programming Platform;Streaming","Field programmable gate arrays;Kernel;Programming;Random access memory;Hardware design languages;Acceleration;Throughput","field programmable gate arrays;message passing;multiprocessing programs;parallel programming","high-performance systems;improved user-friendly programming environment;OpenCL;high-level programming platform;GPU-like programming model;ST-Accel;multiprocessing programming model;high-level abstraction;pipeline-level parallelism;message-passing-based host-FPGA communication model;host-FPGA communication interface;error-prone HDL development;streaming applications;end-to-end latency reduction;kernel execution;direct I/O device access;decoupled access-execute architecture;throughput-critical scenarios;Amazon AWS cloud;I/O latency reduction","","11","","28","","11 Sep 2018","","","IEEE","IEEE Conferences"
"Distributed-memory multi-GPU block-sparse tensor contraction for electronic structure","T. Herault; Y. Robert; G. Bosilca; R. J. Harrison; C. A. Lewis; E. F. Valeev; J. J. Dongarra","University of Tennessee,ICL,TN,USA; University of Tennessee,ICL,TN,USA; Stony Brook University,IACS,NY,USA; Stony Brook University,IACS,NY,USA; Sandia Ntl. Lab.,CA,USA; Virignia Tech,Dept. of Chemistry,VA,USA; University of Tennessee,ICL,TN,USA","2021 IEEE International Parallel and Distributed Processing Symposium (IPDPS)","28 Jun 2021","2021","","","537","546","Many domains of scientific simulation (chemistry, condensed matter physics, data science) increasingly eschew dense tensors for block-sparse tensors, sometimes with additional structure (recursive hierarchy, rank sparsity, etc.). Distributed-memory parallel computation with block-sparse tensorial data is paramount to minimize the time-to-solution (e.g., to study dynamical problems or for real-time analysis) and to accommodate problems of realistic size that are too large to fit into the host/device memory of a single node equipped with accelerators. Unfortunately, computation with such irregular data structures is a poor match to the dominant imperative, bulk-synchronous parallel programming model. In this paper, we focus on the critical element of block-sparse tensor algebra, namely binary tensor contraction, and report on an efficient and scalable implementation using the task-focused PaRSEC runtime. High performance of the block-sparse tensor contraction on the Summit supercomputer is demonstrated for synthetic data as well as for real data involved in electronic structure simulations of unprecedented size.","1530-2075","978-1-6654-4066-0","10.1109/IPDPS49936.2021.00062","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9460455","electronic structure;tensor contraction;block-sparse matrix multiplication;distributed memory;multi-GPU nodes;PaRSEC","Tensors;Runtime;Computational modeling;Tools;Data models;Supercomputers;Real-time systems","distributed memory systems;graphics processing units;parallel programming;tensors","dense tensors;distributed-memory parallel computation;block-sparse tensorial data;irregular data structures;block-sparse tensor algebra;binary tensor contraction;electronic structure simulations;distributed-memory multiGPU block-sparse tensor contraction","","","","32","","28 Jun 2021","","","IEEE","IEEE Conferences"
"Hybrid CPU/GPU tasks optimized for concurrency in OpenMP","A. E. Eichenberger; G. . -T. Bercea; A. Bataev; L. Grinberg; J. K. O'Brien",NA; NA; NA; NA; NA,"IBM Journal of Research and Development","13 May 2020","2020","64","3/4","13:1","13:14","Sierra and Summit supercomputers exhibit a significant amount of intranode parallelism between the host POWER9 CPUs and their attached GPU devices. In this article, we show that exploiting device-level parallelism is key to achieving high performance by reducing overheads typically associated with CPU and GPU task execution. Moreover, manually exploiting this type of parallelism in large-scale applications is nontrivial and error-prone. We hide the complexity of exploiting this hybrid intranode parallelism using the OpenMP programming model abstraction. The implementation leverages the semantics of OpenMP tasks to express asynchronous task computations and their associated dependences. Launching tasks on the CPU threads requires a careful design of work-stealing algorithms to provide efficient load balancing among CPU threads. We propose a novel algorithm that removes locks from all task queueing operations that are on the critical path. Tasks assigned to GPU devices require additional steps such as copying input data to GPU devices, launching the computation kernels, and copying data back to the host CPU memory. We perform key optimizations to reduce the cost of these additional steps by tightly integrating data transfers and GPU computations into streams of asynchronous GPU operations. We further map high-level dependences between GPU tasks to the same asynchronous GPU streams to further avoid unnecessary synchronization. Results validate our approach.","0018-8646","","10.1147/JRD.2019.2960245","U.S. Department of Energy(grant numbers:B604142); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8935508","","Task analysis;Graphics processing units;Instruction sets;Parallel processing;Runtime;Scheduling;Delays","","","","","","14","IBM","17 Dec 2019","","","IBM","IBM Journals"
"GPU Accelerated Lanczos Algorithm with Applications","K. K. Matam; K. Kothapalli","Int. Inst. of Inf. Technol., Hyderabad Gachibowli, Hyderabad, India; Int. Inst. of Inf. Technol., Hyderabad Gachibowli, Hyderabad, India","2011 IEEE Workshops of International Conference on Advanced Information Networking and Applications","5 May 2011","2011","","","71","76","Graphics Processing Units provide a large computational power at a very low price which position them as an ubiquitous accelerator. GPGPU is accelerating general purpose computations using GPU's. GPU's have been used to accelerate many Linear Algebra routines and Numerical Methods. Lanczos is an iterative method well suited for finding the extreme eigenvalues and the corresponding eigenvectors of large sparse symmetric matrices. In this paper, we present an implementation of Lanczos Algorithm on GPU using the CUDA programming model and apply it to two important problems : graph bisection using spectral methods, and image segmentation. Our GPU implementation of spectral bisection performs better when compared to both an Intel Math Kernel Library implementation and a Matlab implementation. Our GPU implementation shows a speedup up to 97.3 times over Matlab Implementation and 2.89 times over the Intel Math Kernel Library implementation on a Intel Core i7 920 Processor, which is a quad-core CPU. Similarly, our image segmentation implementation achieves a speed up of 3.27 compared to a multicore CPU based implementation using Intel Math Kernel Library and OpenMP. Through this work, we therefore wish to establish that the GPU may still be a better platform for also highly irregular and computationally intensive applications.","","978-1-61284-829-7","10.1109/WAINA.2011.70","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5763440","GPGPU;Lanczos;graph partitioning;image segmentation;spectral methods","Graphics processing unit;Eigenvalues and eigenfunctions;Image segmentation;Sparse matrices;Kernel;Instruction sets;Symmetric matrices","coprocessors;eigenvalues and eigenfunctions;graph theory;image segmentation;iterative methods;ubiquitous computing","accelerated Lanczos algorithm;graphics processing units;ubiquitous accelerator;GPGPU;general purpose computations;linear algebra;iterative method;eigenvalues;eigenvectors;CUDA programming;graph bisection;image segmentation;multicore CPU;Intel Math Kernel Library;OpenMP","","3","","18","","5 May 2011","","","IEEE","IEEE Conferences"
"Improved Bilinear Interpolation Method for Image Fast Processing","Y. Sa","Guangdong Univ. of Educ., Guangzhou, China","2014 7th International Conference on Intelligent Computation Technology and Automation","8 Jan 2015","2014","","","308","311","Bilinear interpolation algorithm is broadly applied in digital image processing but its calculation speed is very slow. In order to improve its performance in calculation, this paper proposes a graphic processing unit acceleration-based bilinear interpolation parallel It mainly utilizes Wallis transforming independence among various blocks in bilinear interpolation, which is adaptable to characteristics of GPU parallel processing structure. It maps traditional serial bilinear interpolation algorithm to CUDA parallel programming model and optimize thread allocation, memory usage, hardware resources division, etc, to make full use of huge calculation ability. The experiment results show bilinear interpolation parallel algorithm can greatly improve calculation speed with increasing image resolution.","","978-1-4799-6636-3","10.1109/ICICTA.2014.82","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7003545","bilinear interpolation;image processing;GPU;CUDA","Graphics processing units;Interpolation;Instruction sets;Parallel algorithms;Acceleration;Computers","graphics processing units;image resolution;interpolation;parallel algorithms;parallel architectures;parallel programming","digital image processing;performance improvement;graphic processing unit acceleration;Wallis transforming independence;GPU parallel processing structure;serial bilinear interpolation algorithm;CUDA parallel programming model;thread allocation optimization;memory usage optimization;hardware resource division optimization;calculation ability;bilinear interpolation parallel algorithm;calculation speed improvement;image resolution improvement","","7","","11","","8 Jan 2015","","","IEEE","IEEE Conferences"
"Generalizing the Utility of GPUs in Large-Scale Heterogeneous Computing Systems","S. Xiao; W. Feng","Dept. of Electr. & Comput. Eng., Virginia Tech, Blacksburg, VA, USA; Dept. of Electr. & Comput. Eng., Virginia Tech, Blacksburg, VA, USA","2012 IEEE 26th International Parallel and Distributed Processing Symposium Workshops & PhD Forum","20 Aug 2012","2012","","","2554","2557","Graphics Processing Units (GPUs) have been widely used as accelerators in large-scale heterogeneous computing systems. However, current programming models can only support the utilization of local GPUs. When using non-local GPUs, programmers need to explicitly call API functions for data communication across computing nodes. As such, programming GPUs in large-scale computing systems is more challenging than local GPUs since local and remote GPUs have to be dealt with separately. In this work, we propose a virtual OpenCL (VOCL) framework to support the transparent virtualization of GPUs. This framework, based on the OpenCL programming model, exposes physical GPUs as decoupled virtual resources that can be transparently managed independent of the application execution. To reduce the virtualization overhead, we optimize the GPU memory accesses and kernel launches. We also extend the VOCL framework to support live task migration across physical GPUs to achieve load balance and/or quick system maintenance. Our experiment results indicate that VOCL can greatly simplify the task of programming cluster-based GPUs at a reasonable virtualization cost.","","978-1-4673-0974-5","10.1109/IPDPSW.2012.325","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6270892","graphics processing unit (GPU);virtual OpenCL;task migration","Graphics processing unit;Kernel;Optimization;Libraries;Bandwidth;Programming","application program interfaces;graphics processing units","GPU utility;large scale heterogeneous computing systems;graphics processing units;current programming models;API functions;data communication;virtual OpenCL;VOCL;OpenCL programming model;decoupled virtual resources","","2","","14","","20 Aug 2012","","","IEEE","IEEE Conferences"
"VOCL: An optimized environment for transparent virtualization of graphics processing units","S. Xiao; P. Balaji; Q. Zhu; R. Thakur; S. Coghlan; H. Lin; G. Wen; J. Hong; W. -c. Feng","Dept. of Computer Science, Virginia Tech., USA; Math. and Comp. Sci. Div., Argonne National Lab., USA; Accenture Technology Labs, USA; Math. and Comp. Sci. Div., Argonne National Lab., USA; Leadership Comp. Facility, Argonne National Lab., USA; Dept. of Computer Science, Virginia Tech., USA; Shenzhen Inst. of Adv. Tech., Chinese Academy of Sciences, China; Shenzhen Inst. of Adv. Tech., Chinese Academy of Sciences, China; Dept. of Computer Science, Virginia Tech., USA","2012 Innovative Parallel Computing (InPar)","25 Oct 2012","2012","","","1","12","Graphics processing units (GPUs) have been widely used for general-purpose computation acceleration. However, current programming models such as CUDA and OpenCL can support GPUs only on the local computing node, where the application execution is tightly coupled to the physical GPU hardware. In this work, we propose a virtual OpenCL (VOCL) framework to support the transparent utilization of local or remote GPUs. This framework, based on the OpenCL programming model, exposes physical GPUs as decoupled virtual resources that can be transparently managed independent of the application execution. The proposed framework requires no source code modifications. We also propose various strategies for reducing the overhead caused by data communication and kernel launching and demonstrate about 85% of the data write bandwidth and 90% of the data read bandwidth compared to data write and read, respectively, in a native nonvirtualized environment. We evaluate the performance of VOCL using four real-world applications with various computation and memory access intensities and demonstrate that compute-intensive applications can execute with negligible overhead in the VOCL environment.","","978-1-4673-2633-9","10.1109/InPar.2012.6339609","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6339609","Graphics Processing Unit (GPU);Transparent Virtualization;OpenCL","Graphics processing unit;Kernel;Libraries;Programming;Computational modeling","graphics processing units;virtualisation","VOCL;transparent virtualization;graphics processing units;general-purpose computation acceleration;CUDA;local computing node;physical GPU hardware;virtual OpenCL framework;VOCL framework;OpenCL programming model;virtual resources;application execution;data communication;kernel launching;data write bandwidth;data read bandwidth;memory access intensity","","37","1","27","","25 Oct 2012","","","IEEE","IEEE Conferences"
"CUDA-Based Parallel Implementation of IBM Word Alignment Algorithm for Statistical Machine Translation","S. Jing; G. Yan; X. Chen; P. Jin; Z. Guo","Sch. of Comput. Sci., Leshan Normal Univ., Leshan, China; Sch. of Foreign Language, Leshan Normal Univ., Leshan, China; Sch. of Comput. Sci., Leshan Normal Univ., Leshan, China; Sch. of Comput. Sci., Leshan Normal Univ., Leshan, China; Sch. of Comput. Sci., Leshan Normal Univ., Leshan, China","2016 17th International Conference on Parallel and Distributed Computing, Applications and Technologies (PDCAT)","8 Jun 2017","2016","","","189","194","Word alignment is a basic task in natural language processing and it usually serves as the starting point when building a modern statistical machine translation system. However, the state-of-art parallel algorithm for word alignment is still time-consuming. In this work, we explore a parallel implementation of word alignment algorithm on Graphics Processor Unit (GPU), which has been widely available in the field of high performance computing. We use the Compute Unified Device Architecture (CUDA) programming model to re-implement a state-of-the-art word alignment algorithm, called IBM Expectation-Maximization (EM) algorithm. A Tesla K40M card with 2880 cores is used for experiments and execution times obtained with the proposed algorithm are compared with a sequential algorithm and a multi-threads algorithm on an IBM X3850 server, which has two Intel Xeon E7 CPUs (2.0GHz * 10 cores). The best experimental results show a 16.8-fold speedup compared to the multi-threads algorithm and a 234.7-fold speedup compared to the sequential algorithm.","","978-1-5090-5081-9","10.1109/PDCAT.2016.050","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7943355","Word Alignment;GPU;Parallel Computation;Expectation-Maximization Algorithm;CUDA","Graphics processing units;Algorithm design and analysis;Instruction sets;Hidden Markov models;Computational modeling;Kernel;Programming","graphics processing units;language translation;microprocessor chips;multiprocessing systems;natural language processing;optimisation;parallel algorithms;parallel architectures;statistical analysis;word processing","CUDA-based parallel implementation;IBM word alignment algorithm;statistical machine translation;natural language processing;parallel algorithm;graphics processor unit;GPU;high performance computing;compute unified device architecture;CUDA programming model;IBM expectation-maximization;EM algorithm;Tesla K40M card;2880 cores;sequential algorithm;multithreads algorithm;IBM X3850 server;Intel Xeon E7 CPUs","","1","","15","","8 Jun 2017","","","IEEE","IEEE Conferences"
"A new parallel video understanding and retrieval system","K. Liu; T. Zhang; L. Wang","HP Labs China; HP Labs, Palo Alto; HP Labs China","2010 IEEE International Conference on Multimedia and Expo","23 Sep 2010","2010","","","679","684","In this paper, a hybrid parallel computing framework is proposed for video understanding and retrieval. It is a unified computing architecture based on the Map-Reduce programming model, which supports multi-core and GPU architectures. A key task scheduler is designed for the parallelization of computation tasks. The SVM method is used to train models for video understanding purposes. To effectively shorten the training and processing time, the hybrid computing framework is used to train large scale SVM models. The TRECVID database is used as the basic experimental content for video understanding and retrieval. Experiments were conducted on two 8-core servers, each equipped with NVIDIA Quadro FX 4600 graphics card. Results proved that the proposed parallel computing framework works well for the video understanding and retrieval system by speeding up system development and providing better performances.","1945-788X","978-1-4244-7493-6","10.1109/ICME.2010.5583873","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5583873","Parallel computing;map-reduce;multi-core CPU;general purpose GPU;video understanding and retrieval","Support vector machines;Training;Graphics processing unit;Feature extraction;Classification algorithms;Computational modeling;Computer architecture","computer graphic equipment;coprocessors;parallel processing;support vector machines;video retrieval;video signal processing;visual databases","parallel video understanding;video retrieval system;hybrid parallel computing framework;Map-Reduce programming model;GPU architectures;key task scheduler;SVM method;TRECVID database;NVIDIA Quadro FX 4600 graphics card","","5","1","14","","23 Sep 2010","","","IEEE","IEEE Conferences"
"An Efficient Numerical Solution Technique for VLSI Interconnect Equations on Many-Core Processors","G. Doménech-Asensi; T. J. Kazmierski","Dpto. de Electrónica, Tec. de Computadoras y Proyectos, Universidad Politécnica de Cartagena, Cartagena, Spain; Dpt. of Electronics and Computers Science, University of Southampton, Southampton, UK","2019 IEEE International Symposium on Circuits and Systems (ISCAS)","1 May 2019","2019","","","1","5","This paper presents a technique to accelerate transient simulations of analog circuits using an explicit integration method parallelised on a many-core computer. Usual methods used by SPICE-type simulators are based on Newton-Raphson iterations, which are reliable and numerically stable, but require long CPU processing times. However, although the integration time step in explicit methods is smaller than that used in implicit methods, this technique avoids the calculation of time-consuming computations due to the Jacobian matrix inversion. The proposed method uses an explicit integration scheme based on the fourth order Adams-Bashforth formula. The algorithm has been parallelised on a NVIDIA general purpose GPU using the CUDA programming model. As a case study, the RC ladder model of a VLSI interconnect is simulated on a general purpose graphic processing unit and the achieved performance is then evaluated against that of a multiprocessor CPU. The results show that the proposed technique achieves a speedup of one order of magnitude in comparison with implicit integration techniques executed on a CPU.","2158-1525","978-1-7281-0397-6","10.1109/ISCAS.2019.8702085","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8702085","simulation acceleration;state-space technique;GPU;VLSI interconnect","Instruction sets;Mathematical model;Graphics processing units;Computational modeling;Integrated circuit interconnections;Jacobian matrices;Transient analysis","coprocessors;graphics processing units;integration;multiprocessing systems;Newton-Raphson method;parallel architectures;SPICE;VLSI","implicit methods;time-consuming computations;Jacobian matrix inversion;explicit integration scheme;fourth order Adams-Bashforth formula;NVIDIA general purpose GPU;CUDA programming model;RC ladder model;multiprocessor CPU;implicit integration techniques;VLSI interconnect equations;many-core processors;transient simulations;many-core computer;SPICE-type simulators;Newton-Raphson iterations;integration time step;numerical solution technique;integration method;CPU processing times","","2","","17","","1 May 2019","","","IEEE","IEEE Conferences"
"Three-dimensional particle beam simulation using high performance graphics processing hardware","S. J. Cooke","Naval Research Laboratory, Washington DC 20375, USA","2009 IEEE International Conference on Plasma Science - Abstracts","28 Aug 2009","2009","","","1","1","In this paper, a new three- dimensional particle beam simulation using a high performance hardware is introduced. The graphics processing unit (GPU) hardware is highly parallel and has low-cost computational capabilities. The code uses NVIDIA CUDA programming model and a particle trajectory integration steps on the graphics hardware, in a standard 4th-order Runge-Kutta scheme. The model uses mesh less representations for electromagnetic fields, based on either analytic formulas or field expansion techniques, to achieve a high degree of parallelism in the calculations. The author describe potential applications of the code for 3D simulation of vacuum electronic devices, and present details of both the algorithms used and simulation performance results.","0730-9244","978-1-4244-2617-1","10.1109/PLASMA.2009.5227556","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5227556","","Particle beams;Graphics;Hardware;Computational modeling;Concurrent computing;Code standards;Electromagnetic modeling;Electromagnetic fields;Electromagnetic analysis;Parallel processing","electromagnetic fields;microprocessor chips;parallel programming;particle beams;Runge-Kutta methods;solid modelling;three-dimensional displays","three-dimensional particle beam simulation;graphics processing unit hardware;GPU hardware;NVIDIA CUDA programming model;Runge-Kutta scheme;electromagnetic fields;vacuum electronic devices","","","","1","","28 Aug 2009","","","IEEE","IEEE Conferences"
"Evaluation of Medical Imaging Applications using SYCL","Z. Jin; H. Finkel","Argonne National Laboratory,Leadership Computing Facility,Lemont,IL,USA; Argonne National Laboratory,Leadership Computing Facility,Lemont,IL,USA","2019 IEEE International Conference on Bioinformatics and Biomedicine (BIBM)","6 Feb 2020","2019","","","2259","2264","As opposed to the Open Computing Language (OpenCL) programming model in which host and device codes are written in different languages, the SYCL programming model can combine host and device codes for an application in a type-safe way to improve development productivity. In this paper, we chose two medical imaging applications (Heart Wall and Particle Filter) in the Rodinia benchmark suite to study the performance and programming productivity of the SYCL programming model. More specifically, we introduced the SYCL programming model, shared our experience of implementing the applications using SYCL, and compared the performance and programming portability of the SYCL implementations with the OpenCL implementations on an Intel® Xeon® CPU and an Iris® Pro integrated GPU. The results are promising. For the Heart Wall application, the SYCL implementation is on average 15% faster than the OpenCL implementation on the GPU. For the Particle Filter application, the SYCL implementation is 3% slower than the OpenCL implementation on the GPU, but it is 75% faster on the CPU. Using lines of code as an indicator of programming productivity, the SYCL host program reduces the lines of code of the OpenCL host program by 52% and 38% for the Heart Wall and Particle Filter applications, respectively.","","978-1-7281-1867-3","10.1109/BIBM47256.2019.8982983","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8982983","","","biomedical imaging;graphics processing units;multiprocessing systems;parallel architectures;particle filtering (numerical methods);program compilers;software portability","OpenCL implementation;Heart Wall application;SYCL implementation;programming productivity;SYCL host program;OpenCL host program;medical imaging applications;device codes;SYCL programming model;programming portability;open computing language programming model;particle filter application","","3","","19","","6 Feb 2020","","","IEEE","IEEE Conferences"
"Parallel Algorithms for Approximate String Matching with k Mismatches on CUDA","Y. Liu; L. Guo; J. Li; M. Ren; K. Li","Sch. of Comput. Sci. & Technol., Heilongjiang Univ., Harbin, China; Sch. of Comput. Sci. & Technol., Heilongjiang Univ., Harbin, China; Sch. of Comput. Sci. & Technol., Heilongjiang Univ., Harbin, China; Sch. of Comput. Sci. & Technol., Heilongjiang Univ., Harbin, China; Dept. of Comput. Sci., State Univ. of New York, New Paltz, NY, USA","2012 IEEE 26th International Parallel and Distributed Processing Symposium Workshops & PhD Forum","20 Aug 2012","2012","","","2414","2422","Approximate string matching using the k-mismatch technique has been widely applied to many fields such as virus detection and computational biology. The traditional parallel algorithms are all based on multiple processors, which have high costs of computing and communication. GPU has high parallel processing capability, low cost of computing, and less time of communication. To the best of our knowledge, there is no any parallel algorithm for approximate string matching with k mismatches on GPU. With a new parallel programming model based on CUDA, we present three parallel algorithms and their implementations on GPU, namely, the thread parallel algorithm, the block-thread parallel algorithm, and the OPT-block-thread parallel algorithm. The OPT-block thread parallel algorithm can take full advantage of the powerful parallel capability of GPU. Furthermore, it balances the load among the threads and optimizes the execution time with the memory model of GPU. Experimental results show that compared with the traditional sequential algorithm on CPU, our best parallel algorithm on GPU in this paper achieves speedup of 40-80.","","978-1-4673-0974-5","10.1109/IPDPSW.2012.298","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6270613","Approximate string matching;CUDA;GPU;Hamming distance;parallel algorithm","Instruction sets;Graphics processing unit;Parallel algorithms;Hamming distance;Kernel;Complexity theory","graphics processing units;multiprocessing systems;parallel architectures;string matching","approximate string matching;CUDA;k-mismatch technique;multiple processors;GPU;parallel processing;OPT-block-thread parallel algorithm","","13","","12","","20 Aug 2012","","","IEEE","IEEE Conferences"
"ValuePack: Value-based scheduling framework for CPU-GPU clusters","V. T. Ravi; M. Becchi; G. Agrawal; S. Chakradhar","Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; Dept. of Electr. & Comput. Eng., Univ. of Missouri, Columbia, MO, USA; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA; NEC Labs. America, Princeton, NJ, USA","SC '12: Proceedings of the International Conference on High Performance Computing, Networking, Storage and Analysis","25 Feb 2013","2012","","","1","12","Heterogeneous computing nodes are becoming commonplace today, and recent trends strongly indicate that clusters, supercomputers, and cloud environments will increasingly host more heterogeneous resources, with some being massively parallel (e.g., GPU). With such heterogeneous environments becoming common, it is important to revisit scheduling problems for clusters and cloud environments. In this paper, we formulate and address the problem of value-driven scheduling of independent jobs on heterogeneous clusters, which captures both the urgency and relative priority of jobs. Our overall scheduling goal is to maximize the aggregate value or yield of all jobs. Exploiting the portability available from the underlying programming model, we propose four novel scheduling schemes that can automatically and dynamically map jobs onto heterogeneous resources. Additionally, to improve the utilization of massively parallel resources, we also propose heuristics to automatically decide when and which jobs can share a single resource.","2167-4337","978-1-4673-0806-9","10.1109/SC.2012.111","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6468477","","Graphics processing units;Processor scheduling;Delay;Multicore processing;Aggregates;Supercomputers;Torque","cloud computing;graphics processing units;processor scheduling","value-based scheduling framework;ValuePack;CPU-GPU clusters;heterogeneous computing nodes;supercomputers;cloud environments;value-driven scheduling;heterogeneous clusters;parallel resources","","5","","48","","25 Feb 2013","","","IEEE","IEEE Conferences"
"G-Storm: GPU-enabled high-throughput online data processing in Storm","Z. Chen; J. Xu; J. Tang; K. Kwiat; C. Kamhoua","Department of Electrical Engineering and Computer Science, Syracuse University, Syracuse, NY, 13244; Department of Electrical Engineering and Computer Science, Syracuse University, Syracuse, NY, 13244; Department of Electrical Engineering and Computer Science, Syracuse University, Syracuse, NY, 13244; US Air Force Research Lab (AFRL), Rome, NY; US Air Force Research Lab (AFRL), Rome, NY","2015 IEEE International Conference on Big Data (Big Data)","28 Dec 2015","2015","","","307","312","The Single Instruction Multiple Data (SIMD) architecture of Graphic Processing Units (GPUs) makes them perfect for parallel processing of big data. In this paper, we present the design, implementation and evaluation of G-Storm, a GPU-enabled parallel system based on Storm, which harnesses the massively parallel computing power of GPUs for high-throughput online stream data processing. G-Storm has the following desirable features: 1) G-Storm is designed to be a general data processing platform as Storm, which can handle various applications and data types. 2) G-Storm exposes GPUs to Storm applications while preserving its easy-to-use programming model. 3) G-Storm achieves high-throughput and low-overhead data processing with GPUs. We implemented G-Storm based on Storm 0.9.2 and tested it using two different applications: continuous query and matrix multiplication. Extensive experimental results show that compared to Storm, G-Storm achieves over 7x improvement on throughput for continuous query, while maintaining reasonable average tuple processing time. It also leads to 2.3x throughput improvement for the matrix multiplication application.","","978-1-4799-9926-2","10.1109/BigData.2015.7363769","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7363769","","Graphics processing units;Storms;Kernel;Data processing;Programming;Fasteners;Indexes","Big Data;graphics processing units;matrix multiplication;parallel processing","matrix multiplication;continuous query;parallel processing;graphic processing units;SIMD architecture;single instruction multiple data;high-throughput online data processing;GPU;G-Storm","","18","","21","","28 Dec 2015","","","IEEE","IEEE Conferences"
"Iterative Solution on GPU of Linear Systems Arising from the A-V Edge-FEA of Time-Harmonic Electromagnetic Phenomena","A. F. P. Camargos; V. C. Silva; J. Guichon; G. Meunier","Inst. Fed. de Minas Gerais, Formiga, Brazil; Escola Politec., Univ. de Sao Paulo, São Paulo, Brazil; Grenoble Genie Electr. Lab., St. Martin d'Hères, France; Grenoble Genie Electr. Lab., St. Martin d'Hères, France","2014 22nd Euromicro International Conference on Parallel, Distributed, and Network-Based Processing","14 Apr 2014","2014","","","365","371","We present a performance analysis of a parallel implementation to both preconditioned Conjugate Gradient and preconditioned Bi-conjugate Gradient solvers using graphic processing units with CUDA programming model. The solvers were optimized for the solution of sparse systems of equations arising from Finite Element Analysis of electromagnetic phenomena involved in the diffusion of underground currents under time-harmonic current excitation. We used a shifted Incomplete Cholesky factorization as preconditioner. Results show a significant speedup by using the GPU compared to a serial CPU implementation.","2377-5750","978-1-4799-2729-6","10.1109/PDP.2014.95","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6787300","Finite Elements;Graphic Processing Unit;Preconditioner;Incomplete Factorization","Graphics processing units;Linear systems;Mathematical model;Equations;Iterative methods;Finite element analysis;Sparse matrices","computational electromagnetics;conjugate gradient methods;eddy currents;finite element analysis;graphics processing units;iterative methods;linear systems;parallel architectures","iterative solution;GPU;linear systems;A-V edge-FEA;time-harmonic electromagnetic phenomena;preconditioned biconjugate gradient solver;preconditioned conjugate gradient solver;finite element analysis;underground currents;time-harmonic current excitation;shifted incomplete Cholesky factorization;graphic processing unit;sparse systems;eddy currents","","5","","23","","14 Apr 2014","","","IEEE","IEEE Conferences"
"Toward a Portable Programming Environment for Distributed High Performance Accelerators","S. Hirasawa; H. Honda","Japan Sci. & Technol. Agency, Univ. of Electro-Commun., Chofu, Japan; Japan Sci. & Technol. Agency, Univ. of Electro-Commun., Chofu, Japan","2009 Software Technologies for Future Dependable Distributed Systems","13 Jan 2011","2009","","","189","194","Accelerators with little power consumption per computation performance are beginning to widely spread for High Performance Computing use, instead of general-purpose CPUs with much power consumption. They are GPUs, processors of Cell architecture, and FPGA accelerators. While these processors have much higher computation performance than general-purpose CPUs, they need specific programming environment respectively when using them as distributed memory accelerators. We discuss a portable programming environment which can be used in common with distributed memory accelerators in this paper.","","978-0-7695-3572-2","10.1109/STFSSD.2009.32","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4804597","Heterogeneous Programming Model;Distributed Memory;SIMD Accelerator","Probability density function;Data mining;Software","coprocessors;distributed memory systems;field programmable gate arrays;programming environments","portable programming environment;distributed high performance accelerators;power consumption;computation performance;high performance computing;general-purpose CPU;GPU;cell architecture processors;FPGA accelerators;distributed memory accelerators","","1","1","12","","13 Jan 2011","","","IEEE","IEEE Conferences"
"Software technologies coping with memory hierarchy of GPGPU clusters for stencil computations","T. Endo; G. Jin","Global Science Information and Computing Center, Tokyo Institute of Technology/JST-CREST, Japan; Global Science Information and Computing Center, Tokyo Institute of Technology/JST-CREST, Japan","2014 IEEE International Conference on Cluster Computing (CLUSTER)","1 Dec 2014","2014","","","132","139","Stencil computations, which are important kernels for CFD simulations, have been highly successful on GPGPU clusters, due to high memory bandwidth and computation speed of GPU accelerators. However, sizes of the computed domains are limited by small capacity of GPU device memory. In order to support larger domain sizes, we utilize the memory hierarchy of GPGPU clusters; larger host memory is used for maintain large domains. However, it is challenging to achieve all of larger domain sizes, high performance and easiness of program development. Towards this goal, we combine two software technologies. From the aspect of algorithm, we adopt a locality improvement technique called temporal blocking. From the aspect of system software, we developed a MPI/CUDA wrapper library named HHRT, which supports memory swapping and finer grained programming model. With this combination, we demonstrate that our goal is achieved through evaluations on TSUBAME2.5, a petascale GPGPU supercomputer.","2168-9253","978-1-4799-5548-0","10.1109/CLUSTER.2014.6968747","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6968747","","Graphics processing units;Arrays;Performance evaluation;Libraries;Programming;Bandwidth;Supercomputers","application program interfaces;computational fluid dynamics;graphics processing units;message passing;parallel architectures","software technologies;memory hierarchy;GPGPU clusters;stencil computations;kernels;CFD simulations;memory bandwidth;computation speed;GPU accelerators;GPU device memory;program development;locality improvement technique;temporal blocking;MPI/CUDA wrapper library;HHRT;memory swapping;grained programming model;TSUBAME2.5;petascale GPGPU supercomputer","","12","","19","","1 Dec 2014","","","IEEE","IEEE Conferences"
"An Automatic Host and Device Memory Allocation Method for OpenMPC","H. Uchiyama; T. Tsumura; H. Matsuo","Nagoya Inst. of Technol., Nagoya, Japan; Nagoya Inst. of Technol., Nagoya, Japan; Nagoya Inst. of Technol., Nagoya, Japan","2012 Third International Conference on Networking and Computing","31 Jan 2013","2012","","","208","214","The CUDA programming model provides better abstraction for GPU programming. However, it is still hard to write programs with CUDA because both some specific techniques and knowledge about GPU architecture are required. Hence, many programming frameworks for CUDA have been developed. OpenMPC is one of them based on OpenMP. OpenMPC is an easy-to-write framework for programmers familiar with traditional OpenMP, but still requires programmers to use the special directives for utilizing fast device memories. To solve this problem, this paper proposes a method for allocating appropriate device memories automatically. This paper also proposes a method for automatically allocating page locked memory for the data which are transferred between host and device. The evaluation results with several programs show that proposed methods can reduce 52% execution time in maximum.","","978-1-4673-4624-5","10.1109/ICNC.2012.39","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6424565","GPGPU;CUDA;OpenMPC;memory allocation","Graphics processing units;Kernel;Instruction sets;Programming;Resource management;Data transfer;Arrays","graphics processing units;paged storage;parallel architectures;parallel programming;program compilers;program diagnostics;storage allocation","OpenMPC;CUDA programming model;GPU programming abstraction;GPU architecture;programming frameworks;automatic device memory allocation method;automatic page locked memory allocation method;automatic host allocation method;graphics processing unit","","2","","10","","31 Jan 2013","","","IEEE","IEEE Conferences"
"Record Setting Software Implementation of DES Using CUDA","G. Agosta; A. Barenghi; F. De Santis; G. Pelosi","Dipt. di Elettron. e Inf., Politec. di Milano, Milan, Italy; Dipt. di Elettron. e Inf., Politec. di Milano, Milan, Italy; Politec. di Milano, Milan, Italy; Dipt. di Ing. dell'Inf. e Metodi Matematici, Univ. of Bergamo, Dalmine, Italy","2010 Seventh International Conference on Information Technology: New Generations","1 Jul 2010","2010","","","748","755","The increase in computational power of off-the-shelf hardware offers more and more advantageous tradeoffs among efficiency, cost and availability, thus enhancing the feasibility of of cryptanalytic attacks aiming to lower the security of widely used cryptosystems. In this paper we illustrate an GPU-based software implementation of the most efficent variant of Data Encryption Standard (DES), showing the performance of a software breaker which effectively exploits the multi-core Nvidia GT200 graphic architecture. The key point is to assess how well the structure of a symmetric key cipher can fit the GPU programming model and the single instruction multiple data architectural parallelism. The proposed breaker outperforms the fastest general purpose CPU-based implementations by an order of magnitude, and, due to the vast availability of GPUs on the market, the speedup translates into a sound improvement in the cost efficiency of the attack. As opposed to solutions based either on application specific or reconfigurable hardware, the proposed implementation does not require any specific technical knowledge from the attacker in order to be successfully built, once our implementation is available. This turns out in a better cost-availability tradeoff and minimizes the required setup time for such an attack to be mounted.","","978-1-4244-6271-1","10.1109/ITNG.2010.43","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5501641","Brute-force Attacks;DES;GPGPU","Hardware;Costs;Cryptography;Software performance;Availability;Data security;Software standards;Graphics;Computer architecture;Parallel programming","computer graphic equipment;coprocessors;cryptography;parallel architectures","record setting software implementation;DES;data encryption standard;CUDA;off-the-shelf hardware;cryptanalytic attacks;cryptosystems;GPU-based software implementation;software breaker;multicore Nvidia GT200 graphic architecture;symmetric key cipher;GPU programming model;cost-availability tradeoff;single instruction multiple data architectural parallelism","","16","","14","","1 Jul 2010","","","IEEE","IEEE Conferences"
"Optimal loop unrolling for GPGPU programs","G. S. Murthy; M. Ravishankar; M. M. Baskaran; P. Sadayappan","Department of Computer Science and Engineering, The Ohio State University, Columbus, Ohio, USA; Department of Computer Science and Engineering, The Ohio State University, Columbus, Ohio, USA; Department of Computer Science and Engineering, The Ohio State University, Columbus, Ohio, USA; Department of Computer Science and Engineering, The Ohio State University, Columbus, Ohio, USA","2010 IEEE International Symposium on Parallel & Distributed Processing (IPDPS)","24 May 2010","2010","","","1","11","Graphics Processing Units (GPUs) are massively parallel, many-core processors with tremendous computational power and very high memory bandwidth. With the advent of general purpose programming models such as NVIDIA's CUDA and the new standard OpenCL, general purpose programming using GPUs (GPGPU) has become very popular. However, the GPU architecture and programming model have brought along with it many new challenges and opportunities for compiler optimizations. One such classical optimization is loop unrolling. Current GPU compilers perform limited loop unrolling. In this paper, we attempt to understand the impact of loop unrolling on GPGPU programs. We develop a semi-automatic, compile-time approach for identifying optimal unroll factors for suitable loops in GPGPU programs. In addition, we propose techniques for reducing the number of unroll factors evaluated, based on the characteristics of the program being compiled and the device being compiled to. We use these techniques to evaluate the effect of loop unrolling on a range of GPGPU programs and show that we correctly identify the optimal unroll factors. The optimized versions run up to 70 percent faster than the unoptimized versions.","1530-2075","978-1-4244-6443-2","10.1109/IPDPS.2010.5470423","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5470423","Compiler optimizations;Loop Unrolling;GPGPU","Central Processing Unit;Program processors;Optimizing compilers;Concurrent computing;Registers;Computer graphics;Linear programming;Computer science;Power engineering and energy;Power engineering computing","computer graphic equipment;coprocessors;parallel programming;program compilers","optimal loop unrolling;GPGPU programs;graphics processing units;massively parallel many-core processors;programming model;NVIDIA CUDA;OpenCL;general purpose programming;GPU architecture;compiler optimization;GPU compilers","","34","","15","","24 May 2010","","","IEEE","IEEE Conferences"
"Code generation for embedded heterogeneous architectures on android","R. Membarth; O. Reiche; F. Hannig; J. Teich","Department of Computer Science, University of Erlangen-Nuremberg, Germany; Department of Computer Science, University of Erlangen-Nuremberg, Germany; Department of Computer Science, University of Erlangen-Nuremberg, Germany; Department of Computer Science, University of Erlangen-Nuremberg, Germany","2014 Design, Automation & Test in Europe Conference & Exhibition (DATE)","21 Apr 2014","2014","","","1","6","The success of Android is based on its unified Java programming model that allows to write platform-independent programs for a variety of different target platforms. However, this comes at the cost of performance. As a consequence, Google introduced APIs that allow to write native applications and to exploit multiple cores as well as embedded GPUs for compute-intensive parts. This paper proposes code generation techniques in order to target the Renderscript and Filterscript APIs. Renderscript harnesses multi-core CPUs and unified shader GPUs, while the more restricted Filterscript also supports GPUs with earlier shader models. Our techniques focus on image processing applications and allow to target these APIs and OpenCL from a common description. We further supersede memory transfers by sharing the same memory region among different processing elements on HSA platforms. As reference, we use an embedded platform hosting a multi-core ARM CPU and an ARM Mali GPU. We show that our generated source code is faster than native implementations in OpenCV as well as the pre-implemented script intrinsics provided by Google for acceleration on the embedded GPU.","1558-1101","978-3-9815370-2-4","10.7873/DATE.2014.099","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6800300","","Graphics processing units;Kernel;Androids;Humanoid robots;Computer architecture;DSL;Optimization","Android (operating system);application program interfaces;embedded systems;graphics processing units;Java;multiprocessing systems;source code (software)","code generation;embedded heterogeneous architectures;unified Java programming model;platform independent programs;multiple cores;embedded GPU;API;image processing applications;embedded platform;multicore ARM CPU;ARM Mali GPU;generated source code","","1","","11","","21 Apr 2014","","","IEEE","IEEE Conferences"
"A Portable and Fast Stochastic Volatility Model Calibration Using Multi and Many-Core Processors","M. Dixon; J. Lotze; M. Zubair","Dept. of Analytics, Univ. of San Francisco, San Francisco, CA, USA; Xcelerit, Dublin, Ireland; Dept. of Comput. Sci., Old Dominion Univ., Norfolk, VA, USA","2014 Seventh Workshop on High Performance Computational Finance","26 Jan 2015","2014","","","23","28","Financial markets change precipitously and on-demand pricing and risk models must be constantly recalibrated to reduce risk. However, certain classes of models are computationally intensive to robustly calibrate to intraday pricesstochastic volatility models being an archetypal example due to the non-convexity of the objective function. In order to accelerate this procedure through parallel implementation,nancial application developers are faced with an ever growing plethora of low-level high-performance computing frameworks such as OpenMP, OpenCL, CUDA, or SIMD intrinsics, and forced to make a trade-off between performance versus the portability,exibility and modularity of the code required to facilitate rapid in-house model development and productionization.This paper describes the acceleration of stochastic volatility model calibration on multi-core CPUs and GPUs using the Xcelerit platform. By adopting a simple dataow programming model, the Xcelerit platform enables the application developer to write sequential, high-level C++ code, without concern for low-level high-performance computing frameworks. This platform provides the portability,exibility and modularity required by application developers. Speedups of up to 30x and 293x are respectively achieved on an Intel Xeon CPU and NVIDIA Tesla K40 GPU, compared to a sequential CPU implementation. The Xcelerit platform implementation is further shown to be equivalent in performance to a low-level CUDA version. Overall, we are able to reduce the entire calibration process time of the sequential implementation from 6; 189 seconds to 183:8 and 17:8 seconds on the CPU and GPU respectively without requiring the developer to reimplement in low-level high performance computing frameworks.","","978-1-4799-7027-8","10.1109/WHPCF.2014.12","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7016370","Calibration; Stochastic Volatility; GPGPU; C++","Graphics processing units;Calibration;Computational modeling;Stochastic processes;Mathematical model;Optimization;Data models","C++ language;data flow computing;financial data processing;graphics processing units;multiprocessing systems;parallel architectures;pricing;risk management;stock markets","fast stochastic volatility model calibration;multicore processors;many-core processors;financial markets;on-demand pricing model;risk model;risk reduction;objective function nonconvexity;low-level high-performance computing frameworks;OpenMP intrinsic;OpenCL intrinsic;CUDA intrinsic;SIMD intrinsic;multicore CPU;multicore GPU;Xcelerit platform;dataflow programming model;high-level C++ code;sequential code;NVIDIA Tesla K40 GPU;Intel Xeon CPU","","","","16","","26 Jan 2015","","","IEEE","IEEE Conferences"
"On the characterization of OpenCL dwarfs on fixed and reconfigurable platforms","K. Krommydas; W. -c. Feng; M. Owaida; C. D. Antonopoulos; N. Bellas","Department of Computer Science, Virginia Tech, USA; Department of Computer Science, Virginia Tech, USA; Department of Electrical and Computer Engineering, University of Thessaly, Greece; Department of Electrical and Computer Engineering, University of Thessaly, Greece; Department of Electrical and Computer Engineering, University of Thessaly, Greece","2014 IEEE 25th International Conference on Application-Specific Systems, Architectures and Processors","31 Jul 2014","2014","","","153","160","The proliferation of heterogeneous computing platforms presents the parallel computing community with new challenges. One such challenge entails evaluating the efficacy of such parallel architectures and identifying the architectural innovations that ultimately benefit applications. To address this challenge, we need benchmarks that capture the execution patterns (i.e., dwarfs or motifs) of applications, both present and future, in order to guide future hardware design. Furthermore, we desire a common programming model for the benchmarks that facilitates code portability across a wide variety of different processors (e.g., CPU, APU, GPU, FPGA, DSP) and computing environments (e.g., embedded, mobile, desktop, server). As such, we present the latest release of OpenDwarfs, a benchmark suite that currently realizes the Berkeley dwarfs in OpenCL, a vendor-agnostic and open-standard computing language for parallel computing. Using OpenDwarfs, we characterize a diverse set of fixed and reconfigurable parallel platforms: multicore CPUs, discrete and integrated GPUs, Intel Xeon Phi coprocessor, as well as a FPGA. We describe the computation and communication patterns exposed by a representative set of dwarfs, obtain relevant profiling data and execution information, and draw conclusions that highlight the complex interplay between dwarfs' patterns and the underlying hardware architecture of modern parallel platforms.","2160-052X","978-1-4799-3609-0","10.1109/ASAP.2014.6868650","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6868650","OpenDwarfs;benchmarking;evaluation;dwarfs;performance characterization;CPU;FPGA;GPU;OpenCL","Benchmark testing;Field programmable gate arrays;Graphics processing units;Hardware;Computer architecture;Kernel;High definition video","field programmable gate arrays;graphics processing units;multiprocessing systems;parallel architectures;reconfigurable architectures","OpenCL Dwarfs;fixed platforms;reconfigurable platforms;heterogeneous computing platforms;parallel computing community;parallel architectures;future hardware design;OpenDwarfs;Berkeley dwarfs;vendor-agnostic computing language;open-standard computing language;multicore CPU;integrated GPU;discrete GPU;Intel Xeon Phi coprocessor;FPGA;execution information;profiling data;hardware architecture","","14","","14","","31 Jul 2014","","","IEEE","IEEE Conferences"
"Heterogeneous work-stealing across CPU and DSP cores","V. Kumar; A. Sbîrlea; A. Jayaraj; Z. Budimlić; D. Majeti; V. Sarkar","Rice University, Houston, Texas 77005, United States; Rice University, Houston, Texas 77005, United States; Texas Instruments, Dallas, United States; Rice University, Houston, Texas 77005, United States; Rice University, Houston, Texas 77005, United States; Rice University, Houston, Texas 77005, United States","2015 IEEE High Performance Extreme Computing Conference (HPEC)","12 Nov 2015","2015","","","1","6","Due to the increasing power constraints and higher and higher performance demands, many vendors have shifted their focus from designing high-performance computer nodes using powerful multicore general-purpose CPUs, to nodes containing a smaller number of general-purpose CPUs aided by a larger number of more power-efficient special purpose processing units, such as GPUs, FPGAs or DSPs. While offering a lower power-to-performance ratio, unfortunately, such heterogeneous systems are notoriously hard to program, forcing the users to resort to lower-level direct programming of the special purpose processors and manually managing data transfer and synchronization between the parts of the program running on general-purpose CPUs and on special-purpose processors. In this paper, we present HC-K2H, a programming model and runtime system for the Texas Instruments Keystone II Hawking platform, consisting of 4 ARM CPUs and 8 TI DSP processors. This System-on-a-Chip (SoC) offers high floating-point performance with lower power requirements than other processors with comparable performance. We present the design and implementation of a hybrid programming model and work-stealing runtime that allows tasks to be created and executed on both the ARM and DSP, and enables the seamless execution and synchronization of tasks regardless of whether they are running on the ARM or DSP. The design of our programming model and runtime is based on an extension of the Habanero-C programming system. We evaluate our implementation using task-parallel benchmarks on a Hawking board, and demonstrate excellent scaling compared to sequential implementations on a single ARM processor.","","978-1-4673-9286-0","10.1109/HPEC.2015.7322452","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7322452","Habanero;Keystone-II;load balancing;scheduling;work-stealing","Digital signal processing;Runtime;Programming;Program processors;Hardware;Benchmark testing;Multicore processing","digital signal processing chips;low-power electronics;multiprocessing systems;parallel programming;synchronisation;system-on-chip","heterogeneous work-stealing;DSP cores;power constraints;high-performance computer nodes;multicore general-purpose CPU;power-efficient special purpose processing units;GPU;FPGAs;power-to-performance ratio;heterogeneous systems;lower-level direct programming;special purpose processors;data transfer;synchronization;HC-K2H;runtime system;Texas Instruments Keystone II Hawking platform;ARM CPU;DSP processors;system-on-a-chip;SoC;floating-point performance;lower power requirements;hybrid programming model;work-stealing runtime;Habanero-C programming system;parallel programming model","","6","","23","","12 Nov 2015","","","IEEE","IEEE Conferences"
"Efficient Mapping of Graphic Software on DSP","M. Mody; A. Jayaraj; H. Hariyani; A. Balagopalakrishnan; J. Jones; E. Narvaez; S. Govindarajan; P. Shankar; H. Garud","Embedded Processor Business, Texas Instruments Inc; Embedded Processor Business, Texas Instruments Inc; Embedded Processor Business, Texas Instruments Inc; Embedded Processor Business, Texas Instruments Inc; Embedded Processor Business, Texas Instruments Inc; Embedded Processor Business, Texas Instruments Inc; Embedded Processor Business, Texas Instruments Inc; Embedded Processor Business, Texas Instruments Inc; Embedded Processor Business, Texas Instruments Inc","2021 IEEE International Conference on Electronics, Computing and Communication Technologies (CONECCT)","7 Dec 2021","2021","","","1","4","High Performance GPU is critical to render sophisticated user interfaces and general-purpose compute for image and vision processing in the Automotive and Industrial applications. The paper provides an overview of methods that can be used for offloading of part of GPU software (namely shaders) on DSP keeping traditional GPU software programming model intact to improve overall performance in the system. The methods allow efficient and transparent mapping of GPU shaders to DSP without alterations to existing software model. The proposed solution is prototyped in Jacinoto6 Platform of Texas Instruments. Experiments indicate that multiple shader primitives can be efficiently mapped to DSP achieving performance similar to GPU, with exception of trigonometric primitives. This allows DSP to be used as co-processor for graphics rendering applications. Leveraging compute capabilities of dual core C66x DSP in J acinto6 Platform using proposed solution can improve overall GPU Shader performance by up-to 41 % for different shaders corresponding to different use-cases.","2766-2101","978-1-6654-2849-1","10.1109/CONECCT52877.2021.9622613","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9622613","GPu;DSP;GLOPS;Shader;LLVM;OpenGL;Vulkan;Compute Primitives;Jacinto","Computational modeling;Conferences;Graphics processing units;User interfaces;Programming;Rendering (computer graphics);Software","","","","","","12","","7 Dec 2021","","","IEEE","IEEE Conferences"
"An investigation of Unified Memory Access performance in CUDA","R. Landaverde; Tiansheng Zhang; A. K. Coskun; M. Herbordt","Electrical and Computer Engineering Department, Boston University, MA, USA; Electrical and Computer Engineering Department, Boston University, MA, USA; Electrical and Computer Engineering Department, Boston University, MA, USA; Electrical and Computer Engineering Department, Boston University, MA, USA","2014 IEEE High Performance Extreme Computing Conference (HPEC)","12 Feb 2015","2014","","","1","6","Managing memory between the CPU and GPU is a major challenge in GPU computing. A programming model, Unified Memory Access (UMA), has been recently introduced by Nvidia to simplify the complexities of memory management while claiming good overall performance. In this paper, we investigate this programming model and evaluate its performance and programming model simplifications based on our experimental results. We find that beyond on-demand data transfers to the CPU, the GPU is also able to request subsets of data it requires on demand. This feature allows UMA to outperform full data transfer methods for certain parallel applications and small data sizes. We also find, however, that for the majority of applications and memory access patterns, the performance overheads associated with UMA are significant, while the simplifications to the programming model restrict flexibility for adding future optimizations.","","978-1-4799-6233-4","10.1109/HPEC.2014.7040988","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7040988","","Graphics processing units;Benchmark testing;Kernel;Data transfer;Programming;Runtime;Acceleration","electronic data interchange;graphics processing units;parallel architectures;performance evaluation;shared memory systems;storage management","unified memory access performance;CUDA;memory management;CPU;GPU computing;UMA;Nvidia;performance evaluation;programming model simplification;on-demand data transfer;data transfer method;memory access pattern","","46","","10","","12 Feb 2015","","","IEEE","IEEE Conferences"
"Measurement and Analysis of GPU-Accelerated OpenCL Computations on Intel GPUs","A. T. Cherian; K. Zhou; D. Grubisic; X. Meng; J. Mellor-Crummey","Rice University,Dept. of Computer Science; Rice University,Dept. of Computer Science; Rice University,Dept. of Computer Science; Rice University,Dept. of Computer Science; Rice University,Dept. of Computer Science","2021 IEEE/ACM International Workshop on Programming and Performance Visualization Tools (ProTools)","22 Dec 2021","2021","","","26","35","Graphics Processing Units (GPUs) have become a key technology for accelerating node performance in supercomputers, including the US Department of Energy’s forthcoming exascale systems. Since the execution model for GPUs differs from that for conventional processors, applications need to be rewritten to exploit GPU parallelism. Performance tools are needed for such GPU-accelerated systems to help developers assess how well applications offload computation onto GPUs.In this paper, we describe extensions to Rice University’s HPC-Toolkit performance tools that support measurement and analysis of Intel’s DPC++ programming model for GPU-accelerated systems atop an implementation of the industry-standard OpenCL framework for heterogeneous parallelism on Intel GPUs. HPCToolkit supports three techniques for performance analysis of programs atop OpenCL on Intel GPUs. First, HPC-Toolkit supports profiling and tracing of OpenCL kernels. Second, HPCToolkit supports CPU-GPU blame shifting for OpenCL kernel executions—a profiling technique that can identify code that executes on one or more CPUs while GPUs are idle. Third, HPCToolkit supports fine-grained measurement, analysis, and attribution of performance metrics to OpenCL GPU kernels, including instruction counts, execution latency, and SIMD waste. The paper describes these capabilities and then illustrates their application in case studies with two applications that offload computations onto Intel GPUs.","","978-1-6654-1110-3","10.1109/ProTools54808.2021.00009","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9651230","Supercomputers;High performance computing;Performance analysis;Parallel programming","Measurement;Visualization;Parallel programming;Computational modeling;High performance computing;Graphics processing units;Parallel processing","","","","","","25","","22 Dec 2021","","","IEEE","IEEE Conferences"
"XeHPC Ponte Vecchio","D. Blythe","Chief GPU Architect,Intel","2021 IEEE Hot Chips 33 Symposium (HCS)","20 Oct 2021","2021","","","1","34","500X Increase In Compute Performance Scalable Compute & Memory Packaging & Interconnect For Density & Scale Full Software Stack/Programming Model","2573-2048","978-1-6654-1397-8","10.1109/HCS52781.2021.9567038","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9567038","","Computational modeling;Packaging;Software","","","","","","0","","20 Oct 2021","","","IEEE","IEEE Conferences"
"A Case Study of k-means Clustering using SYCL","Z. Jin; H. Finkel","Leadership Computing Facility Argonne National Laboratory,Lemont,IL,USA; Leadership Computing Facility Argonne National Laboratory,Lemont,IL,USA","2019 IEEE International Conference on Big Data (Big Data)","24 Feb 2020","2019","","","4466","4471","As opposed to the OpenCL programming model in which host and device codes are written in two programming languages, the SYCL programming model combines them for an application in a type-safe way to improve development productivity. As a popular cluster analysis algorithm, k-means has been implemented using programming models such as OpenMP, OpenCL, and CUDA. Developing a SYCL implementation of k-means as a case study allows us to have a better understanding of performance portability and programming productivity of the SYCL programming model. Specifically, we explained the k-means benchmark in Rodinia, described our efforts of porting the OpenCL k-means benchmark, and evaluated the performance of the OpenCL and SYCL implementations on the Intel® Haswell, Broadwell, and Skylake processors. We summarized the migration steps from OpenCL to SYCL, compiled the SYCL program using Codeplay and Intel® SYCL compilers, analyzed the SYCL and OpenCL programs using an open-source profiling tool which can intercept OpenCL runtime calls, and compared the performance of the implementations on Intel® CPUs and integrated GPU. The experimental results show that the SYCL version in which the kernels run on the GPU is 2% and 8% faster than the OpenCL version for the two large datasets. However, the OpenCL version is still much faster than the SYCL version on the CPUs. Compared to the Intel® Haswell and Skylake CPUs, running the k-means benchmark on the Intel® Broadwell low-power processor with a CPU and an integrated GPU can achieve the lowest energy consumption. In terms of programming productivity, the lines of code of the SYCL program are 51% fewer than those of the OpenCL program.","","978-1-7281-0858-2","10.1109/BigData47090.2019.9005555","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9005555","","Kernel;Graphics processing units;Programming;Benchmark testing;C++ languages;Productivity","application program interfaces;graphics processing units;parallel programming;pattern clustering;program compilers;programming languages","OpenCL programming model;programming languages;SYCL programming model;cluster analysis algorithm;SYCL program;SYCL compilers;OpenCL runtime calls","","3","","14","","24 Feb 2020","","","IEEE","IEEE Conferences"
"A Validation Testsuite for OpenACC 1.0","C. Wang; R. Xu; S. Chandrasekaran; B. Chapman; O. Hernandez","Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; Comput. Sci. & Math. Div., Oak Ridge Nat. Lab., Oak Ridge, TN, USA","2014 IEEE International Parallel & Distributed Processing Symposium Workshops","4 Dec 2014","2014","","","1407","1416","Directive-based programming models provide high-level of abstraction thus hiding complex low-level details of the underlying hardware from the programmer. One such model is OpenACC that is also a portable programming model allowing programmers to write applications that offload portions of work from a host CPU to an attached accelerator (GPU or a similar device). The model is gaining popularity and being used for accelerating many types of applications, ranging from molecular dynamics codes to particle physics models. It is critical to evaluate the correctness of the OpenACC implementations and determine its conformance to the specification. In this paper, we present a robust and scalable testing infrastructure that serves this purpose. We worked very closely with three main vendors that offer compiler support for OpenACC and assisted them in identifying and resolving compiler bugs helping them improve the quality of their compilers. The testsuite also aims to identify and resolve ambiguities within the OpenACC specification. This testsuite has been integrated into the harness infrastructure of the TITAN machine at Oak Ridge National Lab and is being used for production. The testsuite consists of test cases for all the directives and clauses of OpenACC, both for C and Fortran languages. The testsuite discussed in this paper focuses on the OpenACC 1.0 feature set. The framework of the testsuite is robust enough to create test cases for 2.0 and future releases. This work is in progress.","","978-1-4799-4116-2","10.1109/IPDPSW.2014.158","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6969543","Validation;OpenACC;Compiler","Arrays;Programming;Computer bugs;Vectors;Performance evaluation;Standards;Graphics processing units","C language;formal specification;FORTRAN;graphics processing units;molecular dynamics method;program compilers;program debugging","validation testsuite;OpenACC 1.0;directive-based programming model;high-level of abstraction;programmer;portable programming model;attached accelerator;GPU;molecular dynamics codes;particle physics model;OpenACC implementation;testing infrastructure;compiler support;compiler bugs;OpenACC specification;harness infrastructure;TITAN machine;Oak Ridge National Lab;C language;Fortran language","","7","1","12","","4 Dec 2014","","","IEEE","IEEE Conferences"
"Accelerating the reconstruction of magnetic resonance imaging by three-dimensional dual-dictionary learning using CUDA","J. Li; J. Sun; Y. Song; Y. Xu; J. Zhao","School of Biomedical Engineering, Shanghai Jiao Tong University, China; School of Biomedical Engineering, Shanghai Jiao Tong University, China; School of Biomedical Engineering, Shanghai Jiao Tong University, China; School of Biomedical Engineering, Shanghai Jiao Tong University, China; School of Biomedical Engineering, Shanghai Jiao Tong University, China","2014 36th Annual International Conference of the IEEE Engineering in Medicine and Biology Society","6 Nov 2014","2014","","","2412","2415","An effective way to improve the data acquisition speed of magnetic resonance imaging (MRI) is using under-sampled k-space data, and dictionary learning method can be used to maintain the reconstruction quality. Three-dimensional dictionary trains the atoms in dictionary in the form of blocks, which can utilize the spatial correlation among slices. Dual-dictionary learning method includes a low-resolution dictionary and a high-resolution dictionary, for sparse coding and image updating respectively. However, the amount of data is huge for three-dimensional reconstruction, especially when the number of slices is large. Thus, the procedure is time-consuming. In this paper, we first utilize the NVIDIA Corporation's compute unified device architecture (CUDA) programming model to design the parallel algorithms on graphics processing unit (GPU) to accelerate the reconstruction procedure. The main optimizations operate in the dictionary learning algorithm and the image updating part, such as the orthogonal matching pursuit (OMP) algorithm and the k-singular value decomposition (K-SVD) algorithm. Then we develop another version of CUDA code with algorithmic optimization. Experimental results show that more than 324 times of speedup is achieved compared with the CPU-only codes when the number of MRI slices is 24.","1558-4615","978-1-4244-7929-0","10.1109/EMBC.2014.6944108","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6944108","","Graphics processing units;Dictionaries;Image reconstruction;Matching pursuit algorithms;Acceleration;Magnetic resonance imaging;Instruction sets","biomedical MRI;data acquisition;graphics processing units;image coding;image matching;image reconstruction;iterative methods;learning (artificial intelligence);medical image processing;optimisation;parallel algorithms;singular value decomposition;time-frequency analysis","three-dimensional dual-dictionary learning;data acquisition;magnetic resonance imaging;sampled k-space data;spatial correlation;low-resolution dictionary;high-resolution dictionary;sparse coding;image updating;image reconstruction quality;three-dimensional image reconstruction;Corporation compute unified device architecture programming model;NVIDIA-CUDA programming model;parallel algorithms;graphics processing unit;GPU;orthogonal matching pursuit algorithm;OMP algorithm;k-singular value decomposition;K-SVD algorithm;algorithmic optimization;CPU-only codes;MRI slices","Algorithms;Computer Graphics;Humans;Imaging, Three-Dimensional;Magnetic Resonance Imaging;Models, Theoretical;Signal-To-Noise Ratio","","","12","","6 Nov 2014","","","IEEE","IEEE Conferences"
"Many-Core Accelerated LIBOR Swaption Portfolio Pricing","J. Lotze; P. D. Sutton; H. Lahlou","Xcelerit, Dublin, Ireland; Xcelerit, Dublin, Ireland; Xcelerit, Dublin, Ireland","2012 SC Companion: High Performance Computing, Networking Storage and Analysis","11 Apr 2013","2012","","","1185","1192","This paper describes the acceleration of a MonteCarlo algorithm for pricing a LIBOR swaption portfolio using multi-core CPUs and GPUs. Speedups of up to 305x are achieved on two Nvidia Tesla M2050 GPUs and up to 20.8x on two Intel Xeon E5620 CPUs, compared to a sequential CPU implementation. This performance is achieved by using the Xcelerit platform - writing sequential, high-level C++ code and adopting a simple dataflow programming model. It avoids the complexity involved when using low-level high-performance computing frameworks such as OpenMP, OpenCL, CUDA, or SIMD intrinsics. The paper provides an overview of the Xcelerit platform, details how high performance is achieved through various automatic optimisation and parallelisation techniques, and shows how the tool can be used to implement portable accelerated Monte-Carlo algorithms in finance. It illustrates the implementation of the Monte-Carlo LIBOR swaption portfolio pricer and gives performance results. A comparison of the Xcelerit platform implementation with an equivalent low-level CUDA version shows that the overhead introduced is less than 1.5% in all scenarios.","","978-0-7695-4956-9","10.1109/SC.Companion.2012.143","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6495925","finance;swaption;GPU;GPGPU;derivatives pricing;HPC;CUDA","","C++ language;financial data processing;graphics processing units;investment;Monte Carlo methods;optimisation;parallel programming;pricing","Monte Carlo algorithm;optimisation technique;parallelisation technique;high performance computing framework;dataflow programming model;C++ code;Xcelerit platform;sequential CPU implementation;Intel Xeon E5620 CPU;Nvidia Tesla M2050 GPU;graphics processing unit;multicore CPU;portfolio pricing;many-core accelerated LIBOR swaption portfolio","","6","","15","","11 Apr 2013","","","IEEE","IEEE Conferences"
"Stream Processing on Multi-cores with GPUs: Parallel Programming Models' Challenges","D. A. Rockenbach; C. M. Stein; D. Griebler; G. Mencagli; M. Torquati; M. Danelutto; L. G. Fernandes","School of Technology, Pontifical Catholic University of Rio Grande do Sul (PUCRS) / Laboratory of Advanced Research on Cloud Computing (LARCC), Três de Maio Faculty (SETREM); Laboratory of Advanced Research on Cloud Computing (LARCC), Três de Maio Faculty (SETREM); School of Technology, Pontifical Catholic University of Rio Grande do Sul (PUCRS) / Laboratory of Advanced Research on Cloud Computing (LARCC), Três de Maio Faculty (SETREM); Computer Science Department, University of Pisa (UNIPI); Computer Science Department, University of Pisa (UNIPI); Computer Science Department, University of Pisa (UNIPI); School of Technology, Pontifical Catholic University of Rio Grande do Sul (PUCRS)","2019 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","29 Jul 2019","2019","","","834","841","The stream processing paradigm is used in several scientific and enterprise applications in order to continuously compute results out of data items coming from data sources such as sensors. The full exploitation of the potential parallelism offered by current heterogeneous multi-cores equipped with one or more GPUs is still a challenge in the context of stream processing applications. In this work, our main goal is to present the parallel programming challenges that the programmer has to face when exploiting CPUs and GPUs' parallelism at the same time using traditional programming models. We highlight the parallelization methodology in two use-cases (the Mandelbrot Streaming benchmark and the PARSEC's Dedup application) to demonstrate the issues and benefits of using heterogeneous parallel hardware. The experiments conducted demonstrate how a high-level parallel programming model targeting stream processing like the one offered by SPar can be used to reduce the programming effort still offering a good level of performance if compared with state-of-the-art programming models.","","978-1-7281-3510-6","10.1109/IPDPSW.2019.00137","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8778359","Parallel Programming;GPU;multi core;high performance computing;stream processing;structured parallel programming","Graphics processing units;Parallel processing;Parallel programming;Kernel;Instruction sets;Computational modeling","graphics processing units;multiprocessing systems;parallel programming","programming effort;state-of-the-art programming models;parallel programming models;stream processing paradigm;scientific enterprise applications;data items;data sources;potential parallelism;current heterogeneous multicores;stream processing applications;parallel programming challenges;traditional programming models;parallelization methodology;Mandelbrot Streaming benchmark;heterogeneous parallel hardware;high-level parallel programming model targeting stream processing;CPU;GPU parallelism;PARSEC Dedup application","","1","","24","","29 Jul 2019","","","IEEE","IEEE Conferences"
"A Statistical-Feature ML Approach to IP Traffic Classification Based on CUDA","Z. Chen; R. Chen; Y. Zhang; J. Zhang; J. Xu","Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China; Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China; Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China; Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China; Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China","2016 IEEE Trustcom/BigDataSE/ISPA","9 Feb 2017","2016","","","2235","2239","In modern networks, there exist different applications which generate various different types of network traffic. In order to improve the performance of network management, it is important to identify and classify the internet traffic. The machine learning (ML) technique based on per-flow statistics has been widely used in traffic classification. Different from traditional classification methods, it is insensitive to port number and payload on application level. Our approach in this work is also based on a machine learning method kNN. kNN is a special case of a variable-bandwidth, kernel density ""balloon"" estimator with a uniform kernel [1]. Although there is no time taken for the construction of the classification model using kNN, it is computationally intensive since it relies on searching neighbor among large sets of d-dimensional vectors. The kNN algorithm may have quite expensive classification steps. CUDA (Compute Unified Device Architecture) is a parallel computing platform and programming model invented by NVIDIA. It enables dramatic increases in computing performance by harnessing the power of the graphics processing unit (GPU) [2]. This paper puts forward a CUDA-based kNN algorithm to classify internet traffic. The experimental results show that the peek speed of traffic classification based on GPU improves greatly compared with that based on CPU. Our approach presents a significant speed improvement through GPU, meanwhile, the results demonstrate the potential applicability of GPU in the field of traffic classification.","2324-9013","978-1-5090-3205-1","10.1109/TrustCom.2016.0344","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7847227","Traffic Classification;CUDA;k-Nearest Neighbor;GPU","Graphics processing units;Classification algorithms;Kernel;Training;IP networks;Ports (Computers);Internet","graphics processing units;Internet;learning (artificial intelligence);parallel architectures;pattern classification;telecommunication traffic","statistical-feature ML approach;IP traffic classification;machine learning method;compute unified device architecture;parallel computing platform;NVIDIA;graphics processing unit;CUDA-based kNN algorithm;Internet traffic;GPU","","1","","12","","9 Feb 2017","","","IEEE","IEEE Conferences"
"Image registration techniques using parallel computing in multicore environment and its applications in medical imaging: An overview","S. Saxena; S. Sharma; N. Sharma","School of Biomedical engineering, Indian Institute of Technology (BHU), Varanasi, UP, India; School of Biomedical engineering, Indian Institute of Technology (BHU), Varanasi, UP, India; School of Biomedical engineering, Indian Institute of Technology (BHU), Varanasi, UP, India","2014 International Conference on Computer and Communication Technology (ICCCT)","8 Jan 2015","2014","","","97","104","Image Registration is the key step of Image Processing as it is the process to locate most accurate relative orientation among two or more images, captured at the same or different times by distinguishable or indistinguishable sensors to increase the information content. For speed optimization of Image Registration, There have been developed numerous approaches till now based on CPU platforms, GPU, CUDA Programming Models etc. Purpose of this paper is to provide a comprehensive review of the existing literature available on Image registration methods based on parallel computing in Multi core architecture. Another considerable intention of this paper is to describe the various applications of image registration using parallel computing in Medical imaging as it can be applied for different modalities of medical images.","","978-1-4799-6758-2","10.1109/ICCCT.2014.7001475","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7001475","Image Registration;GPU;CUDA;Parallel Computing;CPU","Image registration;Graphics processing units;Biomedical imaging;Parallel processing;Computational modeling;Histograms;MATLAB","graphics processing units;image registration;medical image processing;parallel architectures","image registration techniques;parallel computing;multicore environment;medical imaging;image processing;information content;speed optimization;CPU platform;GPU;CUDA programming model;multicore architecture;medical images","","3","","70","","8 Jan 2015","","","IEEE","IEEE Conferences"
"Towards Achieving Performance Portability Using Directives for Accelerators","M. G. Lopez; V. V. Larrea; W. Joubert; O. Hernandez; A. Haidar; S. Tomov; J. Dongarra","Comput. Sci. & Math. Div., Oak Ridge Nat. Lab., Oak Ridge, TN, USA; Nat. Center for Comput. Sci., Oak Ridge Nat. Lab., Oak Ridge, TN, USA; Comput. Sci. & Math. Div., Oak Ridge Nat. Lab., Oak Ridge, TN, USA; Comput. Sci. & Math. Div., Oak Ridge Nat. Lab., Oak Ridge, TN, USA; Innovative Comput. Lab., Univ. of Tennessee, Knoxville, TN, USA; Innovative Comput. Lab., Univ. of Tennessee, Knoxville, TN, USA; Innovative Comput. Lab., Univ. of Tennessee, Knoxville, TN, USA","2016 Third Workshop on Accelerator Programming Using Directives (WACCPD)","2 Feb 2017","2016","","","13","24","In this paper we explore the performance portability of directives provided by OpenMP 4 and OpenACC to program various types of node architectures with attached accelerators, both self-hosted multicore and offload multicore/GPU. Our goal is to examine how successful OpenACC and the newer offload features of OpenMP 4.5 are for moving codes between architectures, how much tuning might be required and what lessons we can learn from this experience. To do this, we use examples of algorithms with varying computational intensities for our evaluation, as both compute and data access efficiency are important considerations for overall application performance. We implement these kernels using various methods provided by newer OpenACC and OpenMP implementations, and we evaluate their performance on various platforms including both X86_64 with attached NVIDIA GPUs, self-hosted Intel Xeon Phi KNL, as well as an X86_64 host system with Intel Xeon Phi coprocessors. In this paper, we explain what factors affected the performance portability such as how to pick the right programming model, its programming style, its availability on different platforms, and how well compilers can optimize and target to multiple platforms.","","978-1-5090-6152-5","10.1109/WACCPD.2016.006","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7836577","","Programming;Computer architecture;Computational modeling;Kernel;Writing;Government;Graphics processing units","graphics processing units;multiprocessing systems;parallel architectures;performance evaluation;program compilers","performance portability;OpenMP 4;OpenACC;node architectures;offload multicore-GPU;self-hosted multicore;computational intensities;data access efficiency;X86_64;NVIDIA GPU;KNL;self-hosted Intel Xeon Phi KNL;Intel Xeon Phi coprocessors;programming model;compilers","","16","","29","","2 Feb 2017","","","IEEE","IEEE Conferences"
"Map-reduce as a Programming Model for Custom Computing Machines","J. H. C. Yeung; C. C. Tsang; K. H. Tsoi; B. S. H. Kwan; C. C. C. Cheung; A. P. C. Chan; P. H. W. Leong","Dept. of Comput. Sci. & Eng., Chinese Univ. of Hong Kong, Shatin, China; Dept. of Comput. Sci. & Eng., Chinese Univ. of Hong Kong, Shatin, China; Dept. of Comput. Sci. & Eng., Chinese Univ. of Hong Kong, Shatin, China; Dept. of Comput. Sci. & Eng., Chinese Univ. of Hong Kong, Shatin, China; Hong Kong Sci. & Technol. Park, Cluster Technol. Ltd., Hong Kong, China; Hong Kong Sci. & Technol. Park, Cluster Technol. Ltd., Hong Kong, China; Dept. of Comput. Sci. & Eng., Chinese Univ. of Hong Kong, Shatin, China","2008 16th International Symposium on Field-Programmable Custom Computing Machines","22 Dec 2008","2008","","","149","159","The map-reduce model requires users to express their problem in terms of a map function that processes single records in a stream, and a reduce function that merges all mapped outputs to produce a final result. By exposing structural similarity in this way, a number of key issues associated with the design of custom computing machines including parallelisation; design complexity; software-hardware partitioning; hardware-dependency, portability and scalability can be easily addressed. We present an implementation of a map-reduce library supporting parallel field programmable gate arrays (FPGAs) and graphics processing units (GPUs). Parallelisation due to pipelining, multiple data paths and concurrent execution of FPGA/GPU hardware is automatically achieved. Users first specify the map and reduce steps for the problem in ANSI Cand no knowledge of the underlying hardware or parallelisation is needed. The source code is then manually translated into a pipelined data path which, along with the map-reduce library, is compiled into appropriate binary configurations for the processing units. We describe our experience in developing a number of benchmark problems in signal processing, Monte Carlo simulation and scientific computing as well as report on the performance of FPGA, GPU and heterogeneous systems.","","978-0-7695-3307-0","10.1109/FCCM.2008.19","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4724898","reconfigurable computing;map reduce;hardware/software codesign","Field programmable gate arrays;Hardware;Concurrent computing;Parallel processing;Graphics;Signal processing;Computer science;Scalability;Software libraries;Pipeline processing","computer graphics;field programmable gate arrays;functional languages;Monte Carlo methods;parallel machines","custom computing machines;map-reduce model;map function;parallelisation;design complexity;software-hardware partitioning;hardware-dependency;field programmable gate arrays;graphics processing units;ANSI C;source code;map-reduce library;Monte Carlo simulation","","50","","17","","22 Dec 2008","","","IEEE","IEEE Conferences"
"On the Design of a Demo for Exhibiting rCUDA","C. Reaño; F. Pérez; F. Silla","Univ. Politec. de Valencia, Valencia, Spain; Univ. Politec. de Valencia, Valencia, Spain; Univ. Politec. de Valencia, Valencia, Spain","2015 15th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing","9 Jul 2015","2015","","","1169","1172","CUDA is a technology developed by NVIDIA which provides a parallel computing platform and programming model for NVIDIA GPUs and compatible ones. It takes benefit from the enormous parallel processing power of GPUs in order to accelerate a wide range of applications, thus reducing their execution time. rCUDA (remote CUDA) is a middleware which grants applications concurrent access to CUDA-compatible devices installed in other nodes of the cluster in a transparent way so that applications are not aware of being accessing a remote device. In this paper we present a demo which shows, in real time, the overhead introduced by rCUDA in comparison to CUDA when running image filtering applications. The approach followed in this work is to develop a graphical demo which contains both an appealing design and technical contents.","","978-1-4799-8006-2","10.1109/CCGrid.2015.53","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7152613","GPGPU;CUDA;HPC;virtualization","Graphics processing units;Gray-scale;Servers;Parallel processing;Acceleration;Middleware;Color","graphics processing units;image filtering;middleware;parallel architectures;parallel programming","rCUDA;demo design;NVIDIA;parallel computing platform;programming model;NVIDIA GPU;parallel processing power;remote CUDA;middleware;concurrent access;CUDA-compatible devices;image filtering applications","","","","4","","9 Jul 2015","","","IEEE","IEEE Conferences"
"Heterogeneous tasking on SMP/FPGA SoCs: The case of OmpSs and the Zynq","A. Filgueras; E. Gil; C. Alvarez; D. Jimenez; X. Martorell; J. Langer; J. Noguera","Barcelona Supercomputing Center, Barcelona; Universitat Politecnica de Catalunya, Barcelona; Barcelona Supercomputing Center, Barcelona; Barcelona Supercomputing Center, Barcelona; Barcelona Supercomputing Center, Barcelona; Xilinx Research Lab, Dublin; Xilinx Research Lab, Dublin","2013 IFIP/IEEE 21st International Conference on Very Large Scale Integration (VLSI-SoC)","25 Nov 2013","2013","","","290","291","OmpSs is a directive-based programming model that uses OpenMP-like directives, that allow to execute the tasks annotated on both the SMPs and as FPGA kernels on modern SoC processors, like the Xilinx Zynq platform. OmpSs includes the support for accelerators (MIC, GPUs, FPGAs) and task dependencies, like OpenMP 4.0 will support. In this paper we present our approach for the support of FPGAs and the Zynq SoC, the current status of the implementation, its analysis and performance evaluation.","2324-8440","978-1-4799-0524-9","10.1109/VLSI-SoC.2013.6673293","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6673293","","Field programmable gate arrays;Hardware;Runtime;System-on-chip;Ecosystems;Programming;Software","field programmable gate arrays;system-on-chip","heterogeneous tasking;SMP-FPGA SoC;OmpS;directive-based programming model;OpenMP-like directives;FPGA kernels;SoC processors;Xilinx Zynq platform;MIC;GPU;OpenMP 4.0","","3","","1","","25 Nov 2013","","","IEEE","IEEE Conferences"
"A Compiler-assisted Runtime-prefetching Scheme for Heterogenous Platforms","B. Shou; X. Hou; L. Chen","ICT, Beijing, China; ICT, Beijing, China; ICT, Beijing, China","2011 International Conference on Parallel Architectures and Compilation Techniques","29 Dec 2011","2011","","","215","215","GPGPU has been widely adopted by industry and academia. For real applications on industry, however, the data communications between CPUs and GPUs often dramatically slow down the overall performance. Another difficulty raised by GPGPU is the programming productivity. OpenMP is a high-level programming model widely accepted by industry. A software distributed shared memory system (DSM) is implemented to provide a logic shared memory space and to manage data communications between CPUs and GPUs. The DSM is block-based, and the block size is adjustable based on loop partitioning parameters. In this work, we optimize the DSM system using a compiler-assisted data-prefetching scheme. There is a prefetching thread and a prefetching worker for each sepa rated memory. The prefetching thread looks into the future, applies inter-thread use-def analysis to judge which part of the USE region has already been generated by computing threads and produces prefetching requests. The prefetching worker carries out the prefetching operations.","1089-795X","978-1-4577-1794-9","10.1109/PACT.2011.48","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6113825","","Prefetching;Runtime;Data communication;Kernel;Industries;Programming","distributed shared memory systems;graphics processing units;multiprocessing systems;parallel architectures;program compilers;program control structures;storage management","compiler assisted runtime prefetching scheme;heterogenous platforms;OpenMP;high level programming model;Pthreads;CUDA code;software distributed shared memory system;logic shared memory space;data communications manage;CPU;GPU;DSM;loop partitioning parameters;prefetching thread;prefetching worker;interthread use-def analysis;USE region","","","","","","29 Dec 2011","","","IEEE","IEEE Conferences"
"A Scheduling and Runtime Framework for a Cluster of Heterogeneous Machines with Multiple Accelerators","T. Beri; S. Bansal; S. Kumar","Indian Inst. of Technol. Delhi, New Delhi, India; Indian Inst. of Technol. Delhi, New Delhi, India; Indian Inst. of Technol. Delhi, New Delhi, India","2015 IEEE International Parallel and Distributed Processing Symposium","20 Jul 2015","2015","","","146","155","We present a runtime system for simple and efficient programming of CPU+GPU clusters. The programmer focuses on core logic, while the system undertakes task allocation, load balancing, scheduling, data transfer, etc. Our programming model is based on a shared global address space, made efficient by transaction style bulk-synchronous semantics. This model broadly targets coarse-grained data parallel computation particularly suited to multi-GPU heterogeneous clusters. We describe our computation and communication scheduling system and report its performance ona few prototype applications. For example, parallelization of matrix multiplication or 2D FFT using our system requires the regular CPU/GPU implementations and about 30 lines of additional C code to set up the runtime. Our runtime system achieves a performance of 5.61 TFlop/s while multiplying two square matrices of 1.56 billion elements each over a 10-nodecluster with 20 GPUs. This performance is possible due toa number of critical optimizations working in concert. These include perfecting, pipelining, maximizing overlap between computation and communication, and scheduling efficiently across heterogeneous devices of vastly different capacities.","1530-2075","978-1-4799-8649-1","10.1109/IPDPS.2015.12","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7161504","High Performance Computing;Heterogeneous Architectures;Hybrid CPU-GPU Clusters;Work Stealing;Multi Scheduling","Graphics processing units;Runtime;Kernel;Programming;Message systems;Data transfer;Subscriptions","graphics processing units;parallel processing;resource allocation;scheduling","scheduling framework;runtime framework;heterogeneous machine;accelerator;CPU+GPU cluster programming;graphics processing unit;task allocation;load balancing;data transfer;transaction style bulk-synchronous semantics;high-performance computing","","7","","47","","20 Jul 2015","","","IEEE","IEEE Conferences"
"Evaluating Multi-core and Many-Core Architectures through Accelerating an Alternating Direction Implicit CFD Solver","L. Deng; J. Fang; F. Wang; H. Bai","Comput. Aerodynamics Inst., China Aerodynamics R&D Center, Mianyang, China; Software Institue, Nat. Univ. of Defense Technol., Changsha, China; Software Institue, Nat. Univ. of Defense Technol., Changsha, China; Comput. Aerodynamics Inst., China Aerodynamics R&D Center, Mianyang, China","2016 15th International Symposium on Parallel and Distributed Computing (ISPDC)","24 Apr 2017","2016","","","1","10","In this paper, we accelerate a double-precision alternating direction implicit (ADI) solver for three-dimensional compressible Navier-Stokes equations from our in-house computational fluid dynamics (CFD) software on the latest multi-core and many-core architectures (Intel Ivy Bridge CPU, Intel Xeon Phi 7110P coprocessor and NVIDIA Kepler K20c GPU). For the GPU platform, both the OpenACC-based and the CUDA-based versions of the ADI solver are developed. To achieve high performance, we use a series of optimization techniques. For the Ivy Bridge CPU and Xeon Phi, we focus on three categories of optimization techniques: thread parallelism for multi-/many-core scaling, data parallelism to exploit the SIMD mechanism and improving on-chip data reuse, to maximize the performance. Also, we provide an in-depth analysis on the performance differences between Ivy Bridge and Xeon Phi. Our numerical experiments show that the proposed CUDA-based ADI solver can achieve a speedup of 9.7 on a Kepler GPU in contrast to a single naive serial version and our optimization techniques can improve the performance of the ADI solver by 2.5x on two Ivy Bridge CPUs and 1.7x on the Intel Xeon Phi coprocessor. We also notice that the OpenACC-based version runs around 29% slower than the CUDA-based one with careful manual optimizations. Besides, we systematically evaluate the programmability of the three platforms. Our insights facilitate the programmers to select a right platform with a suitable programming model according to their target applications.","","978-1-5090-4152-7","10.1109/ISPDC.2016.9","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7904262","performance;programmability;optimization techniques;alternating direction implicit;CFD solver;Ivy Bridge;Xeon Phi;GPU;CUDA;OpenACC","Graphics processing units;Mathematical model;Optimization;Instruction sets;Programming;Computer architecture;Bridges","computational fluid dynamics;graphics processing units;microprocessor chips;multiprocessing systems;multi-threading;Navier-Stokes equations;parallel architectures","multicore architectures;many-core architectures;alternating direction implicit CFD solver;double-precision alternating direction implicit solver;ADI solver;three-dimensional compressible Navier-Stokes equations;computational fluid dynamics software;CFD software;Intel Ivy Bridge CPU;Intel Xeon Phi 7110P coprocessor;NVIDIA Kepler K20c GPU;OpenACC;CUDA;optimization techniques;thread parallelism;data parallelism;on-chip data reuse","","","","26","","24 Apr 2017","","","IEEE","IEEE Conferences"
"Characteristic mode analysis of arbitrary electromagnetic structures using FEKO","D. J. Ludick; E. Lezar; U. Jakobus","EM Software & Systems - S.A. (Pty) Ltd, 32 Techno Avenue, Technopark, Stellenbosch, 7600, South Africa; EM Software & Systems - S.A. (Pty) Ltd, 32 Techno Avenue, Technopark, Stellenbosch, 7600, South Africa; EM Software & Systems - S.A. (Pty) Ltd, 32 Techno Avenue, Technopark, Stellenbosch, 7600, South Africa","2012 International Conference on Electromagnetics in Advanced Applications","11 Oct 2012","2012","","","208","211","This paper considers the characteristic mode analysis (CMA) of arbitrary electromagnetic structures using the comprehensive 3D electromagnetic field solver, FEKO [1]. The theory of characteristic modes, as presented in [2], is used to derive the real orthogonal current modes. These modes are obtained by solving a generalised symmetric eigenvalue problem defined by the real and imaginary parts of the Method-of-Moments (MoM) impedance matrix. The research presented in this article discusses the techniques used in FEKO to solve this generalised eigenproblem. Furthermore, paralleli-sation using both distributed and shared memory programming models, as well as GPU computation is considered within the FEKO framework to accelerate the CMA.","","978-1-4673-0335-4","10.1109/ICEAA.2012.6328622","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6328622","","Eigenvalues and eigenfunctions;Moment methods;Runtime;Graphics processing unit;Impedance;Symmetric matrices;Equations","distributed memory systems;eigenvalues and eigenfunctions;electromagnetic field theory;matrix algebra;method of moments;shared memory systems","characteristic mode analysis;arbitrary electromagnetic structures;CMA;comprehensive 3D electromagnetic field solver;real orthogonal current modes;generalised symmetric eigenvalue problem;method-of-moments impedance matrix;MoM impedance matrix;GPU computation;FEKO framework;shared memory programming model","","14","","10","","11 Oct 2012","","","IEEE","IEEE Conferences"
"Efficient parallel CKY parsing using GPUs","Y. Yi; C. Lai; S. Petrov",NA; NA; NA,"Journal of Logic and Computation","18 Jan 2018","2014","24","2","375","393","Low-latency solutions for syntactic parsing are needed if parsing is to become an integral part of user-facing natural language applications. Unfortunately, most state-of-the-art constituency parsers employ large probabilistic context-free grammars for disambiguation, which renders them impractical for real-time use. Meanwhile, Graphics Processor Units (GPUs) have become widely available, offering the opportunity to alleviate this bottleneck by exploiting the fine-grained data parallelism found in the Cocke–Kasami–Younger (CKY) algorithm. In this article, we explore the design space of parallelizing the dynamic programming computations carried out by the CKY algorithm. We use the Compute Unified Device Architecture (CUDA) programming model to reimplement a state-of-the-art parser, and compare its performance on three recent GPUs with different architectural features. Our best results show a 33-fold speedup for the CUDAparser compared to a sequential C implementation.","1465-363X","","10.1093/logcom/exs078","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8200101","CKY parsing;Viterbi parsing;parallel parsing;GPU;CUDA","","","","","","","","","18 Jan 2018","","","OUP","OUP Journals"
"Performance and Portability Studies with OpenACC Accelerated Version of GTC-P","Y. Wei; Y. Wang; L. Cai; W. Tang; B. Wang; S. Ethier; S. See; J. Lin","Center for High Performance Comput., Shanghai Jiao Tong Univ., Shanghai, China; Center for High Performance Comput., Shanghai Jiao Tong Univ., Shanghai, China; Center for High Performance Comput., Shanghai Jiao Tong Univ., Shanghai, China; Princeton Inst. of Comput. Sci. & Eng., Princeton Univ., Princeton, NJ, USA; Princeton Inst. of Comput. Sci. & Eng., Princeton Univ., Princeton, NJ, USA; Princeton Plasma Phys. Lab., Princeton, NJ, USA; Center for High Performance Comput., Shanghai Jiao Tong Univ., Shanghai, China; Center for High Performance Comput., Shanghai Jiao Tong Univ., Shanghai, China","2016 17th International Conference on Parallel and Distributed Computing, Applications and Technologies (PDCAT)","8 Jun 2017","2016","","","13","18","Accelerator-based heterogeneous computing is of paramount importance to High Performance Computing. The increasing complexity of the cluster architectures requires more generic, high-level programming models. OpenACC is a directive-based parallel programming model, which provides performance on and portability across a wide variety of platforms, including GPU, multicore CPU, and many-core processors. GTC-P is a discovery-science-capable real-world application code based on the Particle-In-Cell (PIC) algorithm that is well-established in the HPC area. Several native versions of GTC-P have been developed for supercomputers on TOP500 with different architectures, including Titan, Mira, etc. Motivated by the state-of-art portability, we implemented the first OpenACC version of GTC-P and evaluated its performance portability across NVIDIA GPUs, Intel x86 and OpenPOWER CPUs. In this paper, we also proposed two key optimization methods for OpenACC implementation of PIC algorithm on multicore CPU and GPU including removing atomic operation and taking advantage of shared memory. OpenACC shows both impressive productivity and performance in a perspective of portability and scalability. The OpenACC version achieves more than 90% performance compared with the native versions with only about 300 LOC.","","978-1-5090-5081-9","10.1109/PDCAT.2016.019","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7943324","Gyrokinetic PIC code;GTC-P;OpenACC;CUDA;GPU;OpenPOWER","Graphics processing units;Multicore processing;Instruction sets;Optimization;Acceleration;Scalability","computational complexity;graphics processing units;multiprocessing systems;parallel processing;performance evaluation","GTC-P;accelerator-based heterogeneous computing;high performance computing;cluster architecture complexity;directive-based parallel programming model;multicore CPU;many-core processors;discovery-science-capable real-world application code;particle-in-cell algorithm;PIC algorithm;performance portability;NVIDIA GPUs;Intel x86;OpenPOWER CPUs;optimization methods;OpenACC implementation","","1","","10","","8 Jun 2017","","","IEEE","IEEE Conferences"
"HSAemu - A full system emulator for HSA platforms","J. -H. Ding; W. Hsu; BaiCheng Jeng; S. Hung; Y. Chung","National Tsing Hua University, Hsinchu, 30013, Taiwan; National Taiwan University, Taipei, 10617, Taiwan; National Tsing Hua University, Hsinchu, 30013, Taiwan; National Taiwan University, Taipei, 10617, Taiwan; National Tsing Hua University, Hsinchu, 30013, Taiwan","2014 International Conference on Hardware/Software Codesign and System Synthesis (CODES+ISSS)","4 Dec 2014","2014","","","1","10","Heterogeneous System Architecture (HSA) is an open industry standard designed to support a large variety of data-parallel and task-parallel programming models. Currently, most of HSA hardware and software components are still in development. It is helpful to provide various heterogeneous simulation environments for HSA developers in developing HSA software stacks. This paper presents the design of HSAemu, a full system emulator for the HSA platform, and illustrates how those HSA features are implemented in the simulator. HSAemu provides an infrastructure of heterogeneous simulation environments by supporting required HSA features, including hUMA, hQ and HSAIL. Based on the infrastructure, HSAemu provide two simulation models, FastSim and DeepSim, for high-speed functional emulation and slow cycle-accurate simulation, respectively. In our preliminary experiments, HSAemu helps test a complete HSA software stack and profile system performance. Our case studies show that HSAemu is very useful as a hardware/software co-design tool for heterogeneous systems.","","978-1-4503-3051-0","10.1145/2656075.2656088","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6971842","HSA;GPU simulation;parallel simulation","Graphics processing units;Computational modeling;Kernel;Hardware;Computer architecture;Synchronization","digital simulation;graphics processing units","HSAemu;full-system emulator;HSA platforms;heterogeneous system architecture;open industry standard;data-parallel programming model;task-parallel programming model;HSA hardware components;HSA software components;heterogeneous simulation environments;HSA software stacks;hUMA;hQ;HSAIL;FastSim simulation model;DeepSim simulation model;high-speed functional emulation;slow-cycle-accurate simulation;profile system performance;hardware/software co-design tool","","3","","27","","4 Dec 2014","","","IEEE","IEEE Conferences"
"Evaluation of Performance Portability of Applications and Mini-Apps across AMD, Intel and NVIDIA GPUs","J. Kwack; J. Tramm; C. Bertoni; Y. Ghadar; B. Homerding; E. Rangel; C. Knight; S. Parker","Leadership Computing Facility / Computational Science Division, Argonne National Laboratory,Lemont,IL,USA; Leadership Computing Facility / Computational Science Division, Argonne National Laboratory,Lemont,IL,USA; Leadership Computing Facility / Computational Science Division, Argonne National Laboratory,Lemont,IL,USA; Leadership Computing Facility / Computational Science Division, Argonne National Laboratory,Lemont,IL,USA; Leadership Computing Facility / Computational Science Division, Argonne National Laboratory,Lemont,IL,USA; Leadership Computing Facility / Computational Science Division, Argonne National Laboratory,Lemont,IL,USA; Leadership Computing Facility / Computational Science Division, Argonne National Laboratory,Lemont,IL,USA; Leadership Computing Facility / Computational Science Division, Argonne National Laboratory,Lemont,IL,USA","2021 International Workshop on Performance, Portability and Productivity in HPC (P3HPC)","28 Dec 2021","2021","","","45","56","This paper will evaluate the progress being made on achieving performance portability by a sub-set of ECP applications, or their related mini-apps, across a diverse spectrum of applications domains and approaches to achieving performance portability. The applications or mini-apps evaluated are AMR-Wind, HACC, SW4, GAMESS RI-MP2, XSBench, and TestSNAP. These codes are being redeveloped using the SYCL, OpenMP, RAJA, or Kokkos programming models, or the AMReX framework and in this paper we assess their performance portability across the AMD MI100, Intel Gen9, and NVIDIA A100 GPUs. Since each GPU has different performance characteristics we have utilized the roofline performance model to compute the performance efficiency and evaluate performance portability across the three platforms. The merits of different metrics for quantifying performance portability are considered and a metric based on the standard deviation of roofline efficiencies is proposed as a preferred metric. Finally, observations on developer productivity are made based on the experience gained working with these applications.","","978-1-6654-2439-4","10.1109/P3HPC54578.2021.00008","DOE Office of Science User Facility(grant numbers:DE-AC02-06CHl1357); National Nuclear Security Administration; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9652861","high performance computing;performance portability;performance efficiency;roofline performance analysis;GPU;portable programming model;software framework","Measurement;Productivity;Analytical models;Codes;Computational modeling;Conferences;Graphics processing units","","","","","","40","","28 Dec 2021","","","IEEE","IEEE Conferences"
"A Compiler-Based Tool for Array Analysis in HPC Applications","A. Qawasmeh; B. Chapman; A. Banerjee","Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; Pet. Geo-Services, Houston, TX, USA","2012 41st International Conference on Parallel Processing Workshops","25 Oct 2012","2012","","","454","463","Array region analysis plays a significant role in various optimizations at compile time. Displaying array access information efficiently in HPC applications has been a vital challenge for scientists and developers for the past few years. Dragon array region analysis tool is a powerful and interactive tool that was built on top of the Open UH compiler, an open source C/C++/Fortran compiler, that supports OpenMP and CAF programming models. We have extended the linear-based Region analysis method and the high level IR (WHIRL) of Open UH to visualize the static and interprocedural array region accesses, the frequency of these accesses per access mode, the access mode in which the array is processed, the number of dimensions, the size of each dimension, the total size in bytes allocated to this array statically, and the memory location. We have also defined the access density term which illustrates the frequency of accesses per bytes allocated to these arrays. The information provided enables users to efficiently develop and optimize HPC applications by understanding procedure side effects and finding inefficiencies in defining arrays, which guides to a better memory allocation and cache usage. Moreover, we demonstrate the access density of the portions of arrays that have been accessed, which is crucial to reduce data transfers between host and device when using directive-based GPU programming models.","2332-5690","978-1-4673-2509-7","10.1109/ICPPW.2012.63","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6337513","Analysis tool;Linear-based techniques;Compiler-based tool;Array Region Analysis","Arrays;Optimization;Programming;Data mining;Indexes;Graphics processing unit","application program interfaces;C++ language;cache storage;data visualisation;FORTRAN;graphics processing units;multi-threading;program compilers;public domain software;shared memory systems","compiler-based tool;Dragon array region analysis tool;HPC applications;interactive tool;Open UH compiler;open source C compiler;open source C++ compiler;open source Fortran compiler;OpenMP programming model;CAF programming model;linear-based region analysis method;high level IR;WHIRL;static array region access visualization;interprocedural array region access visualization;memory location;memory allocation;cache usage;data transfer reduction;directive-based GPU programming models;multithreaded programming API","","3","","28","","25 Oct 2012","","","IEEE","IEEE Conferences"
"Exploration of OpenCL for FPGAs using SDAccel and comparison to GPUs and multicore CPUs","L. Kalms; D. Göhringer","Technische Universität Dresden, Dresden, Germany; Technische Universität Dresden, Dresden, Germany","2017 27th International Conference on Field Programmable Logic and Applications (FPL)","5 Oct 2017","2017","","","1","4","Due to energy efficiency, heterogeneous computing is gaining more and more attention. Since FPGA implementations are time consuming, high-level synthesis (HLS) is used to close the productivity gap. OpenCL has become accepted as a good programming model for HLS, due to its portability, good capability of design verification and rich instruction set. This work implements different optimization strategies using OpenCL for a heterogeneous system containing CPU, integrated GPU, GPU and FPGA. Energy efficiency and performance of the architectures are compared using a feature detection algorithm. It is shown how to maximize performance while hitting the maximum memory bandwidth and keeping the resource utilization low for the SDAccel tool from Xilinx. The evaluation shows the great streaming capability of OpenCL for FPGAs. The FPGA achieves a speed up of 62.8 and consumes 49 times less energy for the application in comparison to an optimized single threaded CPU implementation in full HD.","1946-1488","978-9-0903-0428-1","10.23919/FPL.2017.8056847","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8056847","OpenCL;SDAccel;GPU;CPU;FPGA;Energy Efficiency;Performance;Image Processing;Accelerators","Kernel;Field programmable gate arrays;Graphics processing units;Bandwidth;Optimization;Resource management","electronic engineering computing;energy conservation;feature extraction;field programmable gate arrays;graphics processing units;high level synthesis;microprocessor chips;multiprocessing systems;optimisation;power aware computing;public domain software","optimization strategies;integrated GPU;Xilinx;HLS;high-level synthesis;FPGA implementations;heterogeneous computing;SDAccel tool;feature detection algorithm;energy efficiency;heterogeneous system;OpenCL;multicore CPU","","7","","18","","5 Oct 2017","","","IEEE","IEEE Conferences"
"Resource Centered Computing Delivering High Parallel Performance","J. Gustedt; S. Vialle; P. Mercier","INRIA Nancy - Grand Est, Nancy, France; SUPELEC, Metz, France; SUPELEC, Metz, France","2014 IEEE International Parallel & Distributed Processing Symposium Workshops","4 Dec 2014","2014","","","77","88","Modern parallel programming requires a combination of different paradigms, expertise and tuning, that correspond to the different levels in today's hierarchical architectures. To cope with the inherent difficulty, ORWL (ordered read-write locks) presents a new paradigm and toolbox centered around local or remote resources, such as data, processors or accelerators. ORWL programmers describe their computation in terms of access to these resources during critical sections. Exclusive or shared access to the resources is granted through FIFOs and with read-write semantic. ORWL partially replaces a classical runtime and offers a new API for resource centric parallel programming. We successfully ran an ORWL benchmark application on different parallel architectures (a multicore CPU cluster, a NUMA machine, a CPU+GPU cluster). When processing large data we achieved scalability and performance similar to a reference code built on top of MPI+OpenMP+CUDA. The integration of optimized kernels of scientific computing libraries (ATLAS and cuBLAS) has been almost effortless, and we were able to increase performance using both CPU and GPU cores on our hybrid hierarchical cluster simultaneously. We aim to make ORWL a new easy-to-use and efficient programming model and toolbox for parallel developers.","","978-1-4799-4116-2","10.1109/IPDPSW.2014.14","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6969373","resource centered computing;read-write locks;clusters;accelerators;GPU;experiments;performance","Computational modeling;Graphics processing units;Kernel;Computer architecture;Parallel processing;Parallel programming","application program interfaces;graphics processing units;natural sciences computing;parallel architectures;parallel programming","resource centered computing;high parallel performance;ordered read-write locks;ORWL programmers;remote resources;local resources;critical sections;read-write semantic;API;resource centric parallel programming;parallel architectures;MPI+OpenMP+CUDA;scientific computing libraries;CPU cores;GPU cores;hybrid hierarchical cluster;parallel developers","","","","26","","4 Dec 2014","","","IEEE","IEEE Conferences"
"Implementation and Evaluation of One-Sided PGAS Communication in XcalableACC for Accelerated Clusters","A. Tabuchi; M. Nakao; H. Murai; T. Boku; M. Sato","Grad. Sch. of Syst. & Inf. Eng., Univ. of Tsukuba, Tsukuba, Japan; RIKEN Adv. Inst. for Comput. Sci., Kobe, Japan; RIKEN Adv. Inst. for Comput. Sci., Kobe, Japan; Center for Comput. Sci., Univ. of Tsukuba, Tsukuba, Japan; RIKEN Adv. Inst. for Comput. Sci., Kobe, Japan","2017 17th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing (CCGRID)","13 Jul 2017","2017","","","625","634","Clusters equipped with accelerators such as graphics processing unit (GPU) and Many Integrated Core (MIC) are widely used. For such clusters, programmers write programs for their applications by combining MPI with one of the available accelerator programming models. In particular, OpenACC enables programmers to develop their applications easily, but with lower productivity owing to complex MPI programming. XcalableACC (XACC) is a new programming model, which is an ""orthogonal"" integration of a partitioned global address space (PGAS) language XcalableMP (XMP) and OpenACC. While XMP enables distributed-memory programming on both global-view and local-view models, OpenACC allows operations to be offloaded to a set of accelerators. In the local-view model, programmers can describe communication with the coarray features adopted from Fortran 2008, and we extend them to communication between accelerators. We have designed and implemented an XACC compiler for NVIDIA GPU and evaluated its performance and productivity by using two benchmarks, Himeno benchmark and NAS Parallel Benchmarks CG (NPB-CG). The performance of the XACC version with the Himeno benchmark and NPB-CG are over 85% and 97% in the local-view model against the MPI+OpenACC version, respectively. Moreover, using non-blocking communication makes the performance of local-view version over 89% with the Himeno benchmark. From the viewpoint of productivity, the local-view model provides an intuitive form of array assignment statement for communication.","","978-1-5090-6611-7","10.1109/CCGRID.2017.81","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7973750","Accelerator;GPU;Cluster;PGAS;Coarray;OpenACC","Graphics processing units;Programming;Synchronization;Electronics packaging;Syntactics;Benchmark testing;Productivity","distributed memory systems;distributed programming;FORTRAN;graphics processing units;message passing;parallel processing","one-sided PGAS communication;XcalableACC;accelerated clusters;graphics processing unit;many integrated core;MIC;accelerator programming models;OpenACC;complex MPI programming;partitioned global address space;PGAS language XcalableMP;distributed-memory programming;global-view models;local-view models;coarray features;Fortran 2008;XACC compiler;NVIDIA GPU;Himeno benchmark;NAS Parallel Benchmarks CG;NPB-CG;nonblocking communication;array assignment statement","","3","","25","","13 Jul 2017","","","IEEE","IEEE Conferences"
"Complete solution of eight puzzle problem using BFS in CUDA environment","M. Sultana; R. N. Dutta; S. K. Setua","Dept. of CSE, University of Calcutta, Kolkata, India; Dept. of CSE, University of Calcutta, Kolkata, India; Dept. of CSE, University of Calcutta, Kolkata, India","2015 IEEE International WIE Conference on Electrical and Computer Engineering (WIECON-ECE)","31 Mar 2016","2015","","","333","337","The eight puzzle problem is the largest completely solvable problem of n×n sliding puzzle problems. It is combinatorial in nature, but there is a large problem space of 9! /2. Objective of this work is to find the complete solution of eight puzzle problem i.e. examining all the permutations for solvability. Using Breadth First search (BFS) graph traversal we can reach the solution for a definite goal. The parallel algorithm is capable of providing us with much more faster solution using Compute Unified Device Architecture (CUDA). CUDA facility enables us to use best possible available computation power of GPU (Graphics Processing Unit). In this paper, we present fast implementation of common graph operation like breadth-first search to find out complete solution of eight puzzle problem on the GPU using the CUDA programming model. Our implementations exhibit better performance. The availability and spread of GPUs to desktops and laptops make them ideal candidates to accelerate graph operations over the CPU-only implementations.","","978-1-4673-8786-6","10.1109/WIECON-ECE.2015.7443931","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7443931","Eight puzzle problem;Complete Solution;Breadth-first search;GPU;CUDA","Graphics processing units;Arrays;Indexes;Instruction sets;Search problems;Computational modeling","computability;graph theory;graphics processing units;parallel algorithms;parallel architectures;tree searching","eight puzzle problem;sliding puzzle problems;permutations;solvability;breadth first search graph traversal;BFS graph traversal;parallel algorithm;compute unified device architecture;GPU;graphics processing unit;CUDA programming","","","","12","","31 Mar 2016","","","IEEE","IEEE Conferences"
"On the Programmability and Performance of Heterogeneous Platforms","K. Krommydas; T. R. W. Scogland; W. -C. Feng","Dept. of Comput. Sci., Virginia Tech, Blacksburg, VA, USA; Dept. of Comput. Sci., Virginia Tech, Blacksburg, VA, USA; Dept. of Comput. Sci., Virginia Tech, Blacksburg, VA, USA","2013 International Conference on Parallel and Distributed Systems","1 May 2014","2013","","","224","231","General-purpose computing on an ever-broadening array of parallel devices has led to an increasingly complex and multi-dimensional landscape with respect to programmability and performance optimization. The growing diversity of parallel architectures presents many challenges to the domain scientist, including device selection, programming model, and level of investment in optimization. All of these choices influence the balance between programmability and performance. In this paper, we characterize the performance achievable across a range of optimizations, along with their programmability, for multi- and many-core platforms - specifically, an Intel Sandy Bridge CPU, Intel Xeon Phi co-processor, and NVIDIA Kepler K20 GPU - in the context of an n-body, molecular-modeling application called GEM. Our systematic approach to optimization delivers implementations with speed-ups of 194.98×, 885.18×, and 1020.88× on the CPU, Xeon Phi, and GPU, respectively, over the naive serial version. Beyond the speed-ups, we characterize the incremental optimization of the code from naive serial to fully hand-tuned on each platform through four distinct phases of increasing complexity to expose the strengths and weaknesses of the programming models offered by each platform.","1521-9097","978-1-4799-2081-5","10.1109/ICPADS.2013.41","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6808178","performance;programmability;optimization;AVX;GPU;Intel MIC;NVIDIA Kepler K20;Xeon Phi;CUDA;OpenACC","Optimization;Graphics processing units;Vectors;Computer architecture;Programming;Performance evaluation;Mathematical model","coprocessors;general purpose computers;multiprocessing systems;optimisation;parallel architectures;performance evaluation","programmability;heterogeneous platform performance;general-purpose computing;parallel devices;performance optimization;parallel architectures;device selection;optimization investment level;multicore platform;many-core platforms;Intel Sandy Bridge CPU;Intel Xeon Phi coprocessor;NVIDIA Kepler K20 GPU;n-body molecular-modeling application;GEM;incremental optimization;naive serial;programming models","","6","","12","","1 May 2014","","","IEEE","IEEE Conferences"
"Compute Intensive Algorithm on Heterogeneous System: A Case Study about Fourier Transform","A. Galizia; E. Danovaro; G. Ripepi; A. Clematis","Inst. for Appl. Math. & Inf. Technol., Genoa, Italy; Inst. for Appl. Math. & Inf. Technol., Genoa, Italy; Inst. for Appl. Math. & Inf. Technol., Genoa, Italy; Inst. for Appl. Math. & Inf. Technol., Genoa, Italy","2014 22nd Euromicro International Conference on Parallel, Distributed, and Network-Based Processing","14 Apr 2014","2014","","","223","227","Current workstations can offer really amazing raw computational power: up to 10 TFlops on a single machine equipped with multiple CPUs and accelerators as the Intel Xeon Phi or GPU devices. Such results can only be achieved with a massive parallelism of computational devices, thus the actual barrier posed by the exploitation of modern heterogeneous HPC resources is the difficulty in development and/or (performance) efficient porting of software on such architectures. In this paper, we present an experimental study about achievable performance of a widely used, computational intensive application the Fourier Transform, i.e. Discrete Fourier Transform (DFT) and Fast Fourier Transform. We propose an evaluation of the benefits obtained exploiting such resources in terms of performance and programming efforts in the development of the code with a emphasis on the programming approach adopted for code parallelization. With the exception of the interesting performance achieved exploiting GPU for the DFT algorithm, the use state-ofthe- art software libraries provide the best solution since they represent a good compromise to balance programming efforts and performance achievements.","2377-5750","978-1-4799-2729-6","10.1109/PDP.2014.55","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6787277","Complex Heterogeneous System;Parallel Programming Model;Fourier Transform","Graphics processing units;Discrete Fourier transforms;Computer architecture;Programming;Libraries;Hardware","discrete Fourier transforms;fast Fourier transforms;graphics processing units;multiprocessing systems","compute intensive algorithm;heterogeneous system;multiple CPU;multiple accelerators;GPU device;Intel Xeon Phi device;heterogeneous HPC resources;discrete Fourier transform;fast Fourier transform;code parallelization;DFT algorithm;software libraries","","","","10","","14 Apr 2014","","","IEEE","IEEE Conferences"
"VComputeBench: A Vulkan Benchmark Suite for GPGPU on Mobile and Embedded GPUs","N. Mammeri; B. Juurlink",Technische Universität Berlin; Technische Universität Berlin,"2018 IEEE International Symposium on Workload Characterization (IISWC)","13 Dec 2018","2018","","","25","35","GPUs have become immensely important computational units on embedded and mobile devices. However, GPGPU developers are often not able to exploit the compute power offered by GPUs on these devices mainly due to the lack of support of traditional programming models such as CUDA and OpenCL. The recent introduction of the Vulkan API provides a new programming model that could be explored for GPGPU computing on these devices, as it supports compute and promises to be portable across different architectures. In this paper we propose VComputeBench, a set of benchmarks that help developers understand the differences in performance and portability of Vulkan. We also evaluate the suitability of Vulkan as an emerging cross-platform GPGPU framework by conducting a thorough analysis of its performance compared to CUDA and OpenCL on mobile as well as on desktop platforms. Our experiments show that Vulkan provides better platform support on mobile devices and can be regarded as a good cross-platform GPGPU framework. It offers comparable performance and with some low-level optimizations it can offer average speedups of 1.53× and 1.66× compared to CUDA and OpenCL respectively on desktop platforms and 1.59× average speedup compared to OpenCL on mobile platforms. However, while Vulkan's low-level control can enhance performance, it requires a significantly higher programming effort.","","978-1-5386-6780-4","10.1109/IISWC.2018.8573477","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8573477","VComputeBench;Vulkan;SPIR-V;GPGPU;CUDA;OpenCL;Rodinia;Mobile","Graphics processing units;Benchmark testing;Programming;Computational modeling;Performance evaluation;Mobile handsets;Computer architecture","application program interfaces;electronic engineering computing;graphics processing units;optimisation","VComputeBench;Vulkan benchmark suite;computational units;mobile devices;GPGPU developers;traditional programming models;Vulkan API;programming model;GPGPU computing;desktop platforms;platform support;mobile platforms;embedded GPU;cross-platform GPGPU framework;Vulkan low-level control;mobile GPU;low-level optimizations","","2","","34","","13 Dec 2018","","","IEEE","IEEE Conferences"
"Using Graphics Processor Units (GPUs) for Automatic Video Structuring","P. Kehoe; A. F. Smeaton","Dublin City University, Glasnevin, Dublin 9, Ireland.; Dublin City University, Glasnevin, Dublin 9, Ireland.","Eighth International Workshop on Image Analysis for Multimedia Interactive Services (WIAMIS '07)","30 Jul 2007","2007","","","18","18","The rapid pace of development of graphic processor units (GPUs) in recent years in terms of performance and programmability has attracted the attention of those seeking to leverage alternative architectures for better performance than that which commodity CPUs can provide. In this paper, the potential of the GPU in automatically structuring video is examined, specifically in shot boundary detection and representative keyframe selection techniques. We first introduce the programming model of the GPU and outline the implementation of techniques for shot boundary detection and representative keyframe selection on both the CPU and GPU, using histogram comparisons. We compare the approaches and present performance results for both the CPU and GPU. Overall these results demonstrate the significant potential for the GPU in this domain.","","0-7695-2818-X","10.1109/WIAMIS.2007.85","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4279126","","Graphics;Gunshot detection systems;Rendering (computer graphics);Bandwidth;Random access memory;Read-write memory;Histograms;Video compression;Programming profession;Acceleration","digital signal processing chips;image representation;video signal processing","graphics processor units;automatic video structuring;programmability h;alternative architectures;shot boundary detection;representative keyframe selection;programming model;histogram comparisons","","2","","4","","30 Jul 2007","","","IEEE","IEEE Conferences"
"Streaming FFT Asynchronously on Graphics Processor Units","L. Zhao; Z. Shengbing; Z. Meng; Z. Yi","NA; Eng. Res. Center of Embedded Syst. Integration, Northwestern Polytech. Univ. (NWPU), Xi'an, China; Eng. Res. Center of Embedded Syst. Integration, Northwestern Polytech. Univ. (NWPU), Xi'an, China; Sch. of Comput., Northwestern Polytech. Univ. (NWPU), Xi'an, China","2010 International Forum on Information Technology and Applications","11 Nov 2010","2010","1","","308","312","The Fast Fourier Transform (FFT), which charactered in memory-access-intensive, follows a divide-and-conquer strategy, is one of the most important and heavily used kernel in scientific computing. The newest generation of Graphics Processor Units (GPUs) implement a stream architecture besides acting as powerful massively parallel coprocessor. Fouthermore, the intruduction of APIs for general-purpose computation on GPUs mades GPUs an attractive choice for high-performance numerical and scientific computing. In this work we deal with the implementation of the FFT on a novel NVIDIA GPU, using the CUDA programming model. By optimizing the organiztion of signal data, exploiting the memory hierairchy, and associating the stream to different operations, we efficiently overlap kernel execution and data transfer. Our results indicate a significant performance improvement over GPU-based and CPU-based FFT algorithms. The speedup is 18 percent higher than the original GPU-based on average.","","978-1-4244-7622-0","10.1109/IFITA.2010.76","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5635067","FFT;GPUs;stream;asynchronous communication","Graphics processing unit;Instruction sets;Kernel;Graphics;Programming;Memory management","application program interfaces;computer graphic equipment;coprocessors;fast Fourier transforms;general purpose computers;parallel programming","graphics processor units;streaming;FFT;fast Fourier Transform;divide and conquer strategy;stream architecture;parallel coprocessor;API;general purpose computation;GPU;CUDA programming model","","1","","17","","11 Nov 2010","","","IEEE","IEEE Conferences"
"Accelerating SVMs by integrating GPUs into MapReduce clusters","S. Herrero-Lopez","Intelligent Engineering Systems Laboratory, Massachusetts Institute of Technology, Cambridge, 02139, USA","2011 IEEE International Conference on Systems, Man, and Cybernetics","21 Nov 2011","2011","","","1298","1305","The uninterrupted growth of information repositories has progressively lead data-intensive applications, such as MapReduce-based systems, to the mainstream. The MapReduce paradigm has frequently proven to be a simple yet flexible and scalable technique to distribute algorithms across thousands of nodes and petabytes of information. Under these circumstances, classic data mining algorithms have been adapted to this model, in order to run in production environments. Unfortunately, the high latency nature of this architecture has relegated the applicability of these algorithms to batch-processing scenarios. In spite of this shortcoming, the emergence of massively threaded shared-memory multiprocessors, such as Graphics Processing Units (GPU), on the commodity computing market has enabled these algorithms to be executed orders of magnitude faster, while keeping the same MapReduce based model. In this paper, we propose the integration of massively threaded shared-memory multiprocessors into MapReduce-based clusters creating a unified heterogeneous architecture that enables executing Map and Reduce operators on thousands of threads across multiple GPU devices and nodes, while maintaining the built-in reliability of the baseline system. For this purpose, we created a programming model that facilitates the collaboration of multiple CPU cores and multiple GPU devices towards the resolution of a data intensive problem. In order to prove the potential of this hybrid system, we take a popular NP-Hard supervised learning algorithm, the Support Vector Machine (SVM) and show that a 36x - 192x speedup can be achieved on large datasets without changing the model or leaving the commodity hardware paradigm.","1062-922X","978-1-4577-0653-0","10.1109/ICSMC.2011.6083839","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6083839","Multiprocessing;Parallel Algorithms;Pattern Classification","Message systems;Graphics processing unit;Support vector machines;Computer architecture;Parallel processing;Computational modeling;Instruction sets","computational complexity;coprocessors;data mining;learning (artificial intelligence);shared memory systems;support vector machines","SVM;GPU;MapReduce clusters;information repositories;data-intensive applications;MapReduce-based systems;MapReduce paradigm;data mining;massively threaded shared-memory multiprocessors;graphics processing units;programming model;NP-hard supervised learning;support vector machine","","11","","22","","21 Nov 2011","","","IEEE","IEEE Conferences"
"Exploiting bit-level parallelism in GPGPUs: A case study on KeeLoq exhaustive key search attack","G. Agosta; A. Barenghi; G. Pelosi","Dipartimento di Elettronica e Informazione (DEI) Politecnico di Milano, 20133 Milano (MI), Italy; Dipartimento di Elettronica e Informazione (DEI) Politecnico di Milano, 20133 Milano (MI), Italy; Dipartimento di Elettronica e Informazione (DEI) Politecnico di Milano, 20133 Milano (MI), Italy","ARCS 2012","21 Jun 2012","2012","","","1","7","Graphic Processing Units (GPU) are increasingly popular in the field of high-performance computing for their ability to provide computational power for massively parallel problems at a reduced cost. However, the programming model exposed by the GPGPU software development tools is often insufficient to achieve full performance, and a major rethinking of algorithmic choices is needed. In this paper, we showcase such an effect on a case study drawn from the cryptography application domain. The pervasive use of cryptographic primitives in modern embedded systems is a growing trend. Small, efficient cryptosystems have been effectively employed to design and implement keyless password-based access control systems in various wireless authentication applications. The security margin provided by these lightweight ciphers should be accurately examined in light of the speed and area constraints imposed by the target environment. We present a re-design of the ASIC-oriented KEELOQ implementation to perform efficient exhaustive key search attacks while fitting tightly the parallel programming model exposed by modern GPUs. Indeed, the bitslicing technique allows the intrinsic parallelism offered by word-oriented SIMD computations to be effectively exploited. Through proper adaptation of the algorithm implementation to a platform radically different from the one it was designed for, we achieved a ×40 speedup in the computation time with respect to a single-core CPU bruteforce attack, employing only consumer grade hardware. The outstanding speedup obtainable points to a significant weakening of the cipher security margin, since it proves that anyone with off-the-shelf hardware is able to circumvent the security measures in place.","","978-3-00-037922-2","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6222213","","Graphics processing unit;Parallel processing;Registers;Programming;Instruction sets;Computer architecture;Hardware","authorisation;cryptography;embedded systems;graphics processing units;message authentication;parallel programming","bit-level parallelism;KEELOQ exhaustive key search attack;general purpose computing on graphics processing units;high-performance computing;massively parallel problems;programming model;GPGPU software development tools;algorithmic choice thinking;cryptography;cryptographic primitives;embedded systems;cryptosystems;keyless password-based access control systems;wireless authentication applications;lightweight ciphers;ASIC-oriented KEELOQ implementation redesign;parallel programming model;bitslicing technique;word-oriented SIMD computations;single-core CPU bruteforce attack;consumer grade hardware;cipher security margin;off-the-shelf hardware","","","","17","","21 Jun 2012","","","IEEE","IEEE Conferences"
"Study of BDRM Asynchronous Parallel Computing Model Based on Multiple CUDA Streams","X. Sun; L. Da; Y. Li","Navy Underwater Battlefield Environ. Instn., Navy Submarine Acad., Qingdao, China; Navy Underwater Battlefield Environ. Instn., Navy Submarine Acad., Qingdao, China; Navy Underwater Battlefield Environ. Instn., Navy Submarine Acad., Qingdao, China","2014 Seventh International Symposium on Computational Intelligence and Design","9 Apr 2015","2014","1","","181","184","In order to improve the computing speed of ocean acoustic field using the Beam-Displacement Ray-Mode (BDRM) theory, a BDRM parallel computing model based on Compute Unified Device Architecture (CUDA) is designed by virtue of the powerful parallel computing ability of GPU and the character of BDRM theory. The emphasis is how to implement parallel computing of eigen value and eigen function in CUDA programming model. The results of simulation experiment show that the CPU elapsed time increases fast but the GPU elapsed time increases slow with the frequency of the sound source reaching higher. The speedup in blue-water is bigger than that in shallow-water under the same frequency of the sound source. The speedups are 7.84× and 33.36× respectively in shallow-water and blue-water when the frequency of the sound source is 1000Hz. The BDRM parallel computing model based on CUDA has higher computing efficiency than the BDRM serial computing model based on CPU under large scale operations. It could achieve the requirement of fast forecast of ocean acoustic field and engineering application.","","978-1-4799-7005-6","10.1109/ISCID.2014.104","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7064168","CUDA;BDRM;eigenvalue;eigenfunction;acoustic field;parallel computing","Graphics processing units;Computational modeling;Parallel processing;Acoustics;Eigenvalues and eigenfunctions;Oceans;Instruction sets","eigenvalues and eigenfunctions;graphics processing units;parallel architectures;parallel programming","BDRM asynchronous parallel computing model;multiple CUDA stream;beam-displacement ray-mode theory;Compute Unified Device Architecture;GPU parallel computing ability;graphics processing unit;CUDA programming;eigenvalue;eigenfunction;CPU elapsed time;GPU elapsed time;sound source frequency;ocean acoustic field;engineering application;BDRM serial computing model","","2","","11","","9 Apr 2015","","","IEEE","IEEE Conferences"
"Numerical Simulation of Transit-Time Ultrasonic Flowmeters by a Direct Approach","A. Luca; R. Marchiano; J. Chassaing","Ultraflux, Éragny, France; Institut Jean Le Rond d’Alembert, 4 place Jussieu, Sorbonne Universités, UPMC Univ Paris 06, CNRS, UMR 7190, Paris, France; Institut Jean Le Rond d’Alembert, 4 place Jussieu, Sorbonne Universités, UPMC Univ Paris 06, CNRS, UMR 7190, Paris, France","IEEE Transactions on Ultrasonics, Ferroelectrics, and Frequency Control","23 May 2016","2016","63","6","886","897","This paper deals with the development of a computational code for the numerical simulation of wave propagation through domains with a complex geometry consisting in both solids and moving fluids. The emphasis is on the numerical simulation of ultrasonic flowmeters (UFMs) by modeling the wave propagation in solids with the equations of linear elasticity (ELE) and in fluids with the linearized Euler equations (LEEs). This approach requires high performance computing because of the high number of degrees of freedom and the long propagation distances. Therefore, the numerical method should be chosen with care. In order to minimize the numerical dissipation which may occur in this kind of configuration, the numerical method employed here is the nodal discontinuous Galerkin (DG) method. Also, this method is well suited for parallel computing. To speed up the code, almost all the computational stages have been implemented to run on graphical processing unit (GPU) by using the compute unified device architecture (CUDA) programming model from NVIDIA. This approach has been validated and then used for the two-dimensional simulation of gas UFMs. The large contrast of acoustic impedance characteristic to gas UFMs makes their simulation a real challenge.","1525-8955","","10.1109/TUFFC.2016.2545714","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7439838","Numerical simulation;transit-time flowmeters;linear elasticity;Euler equations;discontinuous Galerkin methods;GPU computing;Discontinuous Galerkin methods;Euler equations;graphical processing unit computing;linear elasticity;numerical simulation;transit-time flowmeters","Mathematical model;Acoustics;Solids;Numerical simulation;Propagation;Computational modeling;Transducers","elasticity;flowmeters;Galerkin method;ultrasonic measurement;wave propagation","numerical simulation;transit-time ultrasonic flowmeters;computational code;wave propagation;complex geometry;solids;moving fluids;linear elasticity;linearized Euler equations;nodal discontinuous Galerkin method;graphical processing unit;compute unified device architecture programming model;NVIDIA;acoustic impedance characteristic","Computer Simulation;Image Processing, Computer-Assisted;Rheology;Ultrasonics","21","","51","IEEE","23 Mar 2016","","","IEEE","IEEE Journals"
"GPGPU implementation of fractal image coding","O. Alvarado-Nava; H. M. Chablé Martínez; E. Rodríguez-Martínez","Departamento de Electrónica, Divisi ón de Ciencias Básicas e Ingeniería, Universidad Autónoma Metropolitana, Unidad Azcapotzalco, México D.F., México; Departamento de Electrónica, Divisi ón de Ciencias Básicas e Ingeniería, Universidad Autónoma Metropolitana, Unidad Azcapotzalco, México D.F., México; Departamento de Electrónica, Divisi ón de Ciencias Básicas e Ingeniería, Universidad Autónoma Metropolitana, Unidad Azcapotzalco, México D.F., México","3rd IEEE International Work-Conference on Bioinspired Intelligence","2 Oct 2014","2014","","","106","110","The programming model of general propose computing on graphic processing units (GPGPU) offers great efficiency for applications acceleration. This feature is granted by the ability of partitioning a sequential application into smaller subproblems with high computing requirements; those subproblems can be executed in parallel by a graphics processing unit (GPU) and partial results can be transferred to main memory where the central processing unit (CPU) collects and presents them. On the other hand, Fractal Image Coding (FIC) is a lossy compression technique with promising features, however it has been relegated due to its large coding time. The present article propose a parallel implementation of FIC on a GPGPU system which achieves an acceleration on coding time of about 129 times.","","978-1-4799-6174-0","10.1109/IWOBI.2014.6913947","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6913947","Fractal Image Compression;GPGPU;GPU;Parallel Computing","Graphics processing units;Image coding;Instruction sets;Fractals;Image resolution;Central Processing Unit;Acceleration","fractals;graphics processing units;image coding","GPGPU implementation;fractal image coding;programming model;applications acceleration;partitioning;sequential application;high computing requirements;central processing unit;CPU;FIC;lossy compression technique;parallel implementation;graphic processing units","","2","","15","","2 Oct 2014","","","IEEE","IEEE Conferences"
"Self-Adaptive OmpSs Tasks in Heterogeneous Environments","J. Planas; R. M. Badia; E. Ayguadé; J. Labarta","Barcelona Supercomput. Center, Univ. Politec. de Catalunya, Barcelona, Spain; Artificial Intell. Res. Inst. (IIIA), Barcelona Supercomput. Center, Barcelona, Spain; Barcelona Supercomput. Center, Univ. Politec. de Catalunya, Barcelona, Spain; Barcelona Supercomput. Center, Univ. Politec. de Catalunya, Barcelona, Spain","2013 IEEE 27th International Symposium on Parallel and Distributed Processing","29 Jul 2013","2013","","","138","149","As new heterogeneous systems and hardware accelerators appear, high performance computers can reach a higher level of computational power. Nevertheless, this does not come for free: the more heterogeneity the system presents, the more complex becomes the programming task in terms of resource management. OmpSs is a task-based programming model and framework focused on the runtime exploitation of parallelism from annotated sequential applications. This paper presents a set of extensions to this framework: we show how the application programmer can expose different specialized versions of tasks (i.e. pieces of specific code targeted and optimized for a particular architecture) and how the system can choose between these versions at runtime to obtain the best performance achievable for the given application. From the results obtained in a multi-GPU system, we prove that our proposal gives flexibility to application's source code and can potentially increase application's performance.","1530-2075","978-1-4673-6066-1","10.1109/IPDPS.2013.53","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6569807","multi-gpu management;heterogeneous architectures;parallel programming models;scheduling techniques","Runtime;Graphics processing units;Programming;Computer architecture;Reliability;Proposals;Kernel","graphics processing units;parallel programming;resource allocation;scheduling;source coding","self-adaptive OmpSs tasks;heterogeneous environments;heterogeneous systems;hardware accelerators;high performance computers;task-based programming model;resource management;computational power;runtime parallelism exploitation;sequential applications;application programmer;multiGPU system;application source code;application performance","","34","","25","","29 Jul 2013","","","IEEE","IEEE Conferences"
"Design and Performance Evaluation of Image Processing Algorithms on GPUs","I. K. Park; N. Singhal; M. H. Lee; S. Cho; C. Kim","Inha University, Incheon; Samsung Electronics Co., Ltd., Suwon; Inha University, Incheon; Samsung Electronics Co., Ltd., Suwon; NVIDIA Corporation, Seoul","IEEE Transactions on Parallel and Distributed Systems","29 Nov 2010","2011","22","1","91","104","We construe key factors in design and evaluation of image processing algorithms on the massive parallel graphics processing units (GPUs) using the compute unified device architecture (CUDA) programming model. A set of metrics, customized for image processing, is proposed to quantitatively evaluate algorithm characteristics. In addition, we show that a range of image processing algorithms map readily to CUDA using multiview stereo matching, linear feature extraction, JPEG2000 image encoding, and nonphotorealistic rendering (NPR) as our example applications. The algorithms are carefully selected from major domains of image processing, so they inherently contain a variety of subalgorithms with diverse characteristics when implemented on the GPU. Performance is evaluated in terms of execution time and is compared to the fastest host-only version implemented using OpenMP. It is shown that the observed speedup varies extensively depending on the characteristics of each algorithm. Intensive analysis is conducted to show the appropriateness of the proposed metrics in predicting the effectiveness of an application for parallel implementation.","1558-2183","","10.1109/TPDS.2010.115","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5477417","GPU;CUDA;image processing;parallel implementation;GPGPU.","Algorithm design and analysis;Image processing;Concurrent computing;Computer architecture;Graphics processing unit;Parallel programming;Computer vision;Scattering;Parallel processing","computer graphic equipment;coprocessors;feature extraction;image coding;performance evaluation","image processing algorithms;massive parallel graphics processing units;compute unified device architecture programming model;performance evaluation;multiview stereo matching;linear feature extraction;JPEG2000 image encoding;nonphotorealistic rendering;OpenMP;execution time","","90","2","38","IEEE","3 Jun 2010","","","IEEE","IEEE Journals"
"Software Pipelined Execution of Stream Programs on GPUs","A. Udupa; R. Govindarajan; M. J. Thazhuthaveetil","Dept. of Comput. Sci. & Autom., Indian Inst. of Sci., Bangalore; Dept. of Comput. Sci. & Autom., Indian Inst. of Sci., Bangalore; Dept. of Comput. Sci. & Autom., Indian Inst. of Sci., Bangalore","2009 International Symposium on Code Generation and Optimization","5 May 2009","2009","","","200","209","The StreamIt programming model has been proposed to exploit parallelism in streaming applications on general purpose multi-core architectures. This model allows programmers to specify the structure of a program as a set of filters that act upon data, and a set of communication channels between them. The StreamIt graphs describe task, data and pipeline parallelism which can be exploited on modern graphics processing units (GPUs), as they support abundant parallelism in hardware. In this paper, we describe the challenges in mapping StreamIt to GPUs and propose an efficient technique to software pipeline the execution of stream programs on GPUs. We formulate this problem - both scheduling and assignment of filters to processors - as an efficient integer linear program (ILP), which is then solved using ILP solvers. We also describe a novel buffer layout technique for GPUs which facilitates exploiting the high memory bandwidth available in GPUs. The proposed scheduling utilizes both the scalar units in GPU, to exploit data parallelism, and multiprocessors, to exploit task and pipeline parallelism. Further it takes into consideration the synchronization and bandwidth limitations of GPUs, and yields speedups between 1.87X and 36.83X over a single threaded CPU.","","978-0-7695-3576-0","10.1109/CGO.2009.20","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4907664","CUDA;GPU Programming;Software Pipelining;Stream Programming","Pipelines;Filters;Processor scheduling;Bandwidth;Parallel programming;Application software;Computer architecture;Programming profession;Communication channels;Graphics","linear programming;parallel programming;pipeline processing","software pipelined execution;stream programs;StreamIt programming model;multi-core architectures;StreamIt graphs;graphics processing units;integer linear program;high memory bandwidth","","60","2","23","","5 May 2009","","","IEEE","IEEE Conferences"
"Exploring Memory Persistency Models for GPUs","Z. Lin; M. Alshboul; Y. Solihin; H. Zhou",North Carolina State University; North Carolina State University; University of Central Florida; North Carolina State University,"2019 28th International Conference on Parallel Architectures and Compilation Techniques (PACT)","7 Nov 2019","2019","","","311","323","Given its high integration density, high speed, byte addressability, and low standby power, non-volatile or persistent memory is expected to supplement/replace DRAM as main memory. Through persistency programming model (which defines durability ordering of stores) and durable transaction constructs, the programmer can provide recoverable data structure (RDS) which allows programs to recover to a consistent state after a failure. While persistency models have been well studied for CPUs, they have been neglected for graphics processing units (GPUs). Considering the importance of GPUs as a dominant accelerator for high performance computing, we investigate persistency models for GPUs. GPU applications exhibit substantial differences with CPUs applications, hence in this paper we adapt, re-architect, and optimize CPU persistency models for GPUs. We design a pragma-based compiler scheme for expressing persistency model for GPUs. We identify that the thread hierarchy in GPUs offers intuitive scopes to form epochs and durable transactions. We find that undo logging produces significant performance overheads. We propose to use idempotency analysis to reduce both logging frequency and the size of logs. Through both real-system and simulation evaluations, we show low overheads of our proposed architecture support.","2641-7936","978-1-7281-3613-4","10.1109/PACT.2019.00032","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8891613","GPU;Memory Persistency","Graphics processing units;Instruction sets;Adaptation models;Nonvolatile memory;Kernel;Bandwidth;Random access memory","data structures;DRAM chips;graphics processing units;microprocessor chips;parallel processing;program compilers","memory persistency models;GPUs;high integration density;low standby power;persistent memory;persistency programming model;persistency model;high performance computing;CPU persistency models;durable transactions;byte addressability;nonvolatile memory;recoverable data structure;graphics processing units;DRAM;pragma-based compiler scheme","","4","","28","","7 Nov 2019","","","IEEE","IEEE Conferences"
"HadoopCL2: Motivating the Design of a Distributed, Heterogeneous Programming System With Machine-Learning Applications","M. Grossman; M. Breternitz; V. Sarkar","Department of Computer Science, 6100 Main St., Rice University, Houston, TX; AMD Research, 7171 Southwest Parkway, Austin, TX; Department of Computer Science, 6100 Main St., Rice University, Houston, TX","IEEE Transactions on Parallel and Distributed Systems","11 Feb 2016","2016","27","3","762","775","Machine learning (ML) algorithms have garnered increased interest as they demonstrate improved ability to extract meaningful trends from large, diverse, and noisy data sets. While research is advancing the state-of-the-art in ML algorithms, it is difficult to drastically improve the real-world performance of these algorithms. Porting new and existing algorithms from single-node systems to multi-node clusters, or from architecturally homogeneous systems to heterogeneous systems, is a promising optimization technique. However, performing optimized ports is challenging for domain experts who may lack experience in distributed and heterogeneous software development. This work explores how challenges in ML application development on heterogeneous, distributed systems shaped the development of the HadoopCL2 (HCL2) programming system. ML applications guide this work because they exhibit features that make application development difficult: large & diverse datasets, complex algorithms, and the need for domain-specific knowledge. The goal of this work is a general, MapReduce programming system that outperforms existing programming systems. This work evaluates the performance and portability of HCL2 against five ML applications from the Mahout ML framework on two hardware platforms. HCL2 demonstrates speedups of greater than 20x relative to Mahout for three computationally heavy algorithms and maintains minor performance improvements for two I/O bound algorithms.","1558-2183","","10.1109/TPDS.2015.2414943","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7064791","MapReduce;heterogeneous;distributed;programming model;GPU;auto-scheduling","Programming;Performance evaluation;Vectors;Java;Kernel;Object oriented modeling;Computational modeling","data handling;distributed programming;learning (artificial intelligence);optimisation;parallel processing;software engineering","distributed programming system;heterogeneous programming system;machine-learning applications;optimization technique;distributed software development;heterogeneous software development;ML application development;HadoopCL2 programming system;HCL2 programming system;domain-specific knowledge;MapReduce programming system;Mahout ML framework;I/O bound algorithms","","6","","16","IEEE","20 Mar 2015","","","IEEE","IEEE Journals"
"Running High Performance Linpack on CPUGPU clusters","D. Tomić; D. Ogrizović","Hewlett-Packard Croatia, Zagreb, Croatia; Center for advanced computing and modeling / Faculty of Maritime Studies, Rijeka, Croatia","2012 Proceedings of the 35th International Convention MIPRO","16 Jul 2012","2012","","","400","404","A trend is developing in High-Performance Computing with cluster nodes built of general purpose CPUs and GPU accelerators. The common name of these systems is CPUGPU clusters. High Performance Linpack (HPL) benchmarking of High Performance Clusters consisting of nodes with both CPUs and GPUs is still a challenging task and deserves a high attention. In order to make HPL on such clusters more efficient, a multi-layered programming model consisting of at least Message Passing Interface (MPI), Multiprocessing (MP) and Streams Programming (Streams) needs to be utilized. Besides multi-layered programming model, it is crucial to deploy a right load-balancing scheme if someone wants to run HPL efficiently on CPUGPU systems. That means, besides the highest possible utilization rate, both fast and slow processors needs to receive appropriate portion of load, in order to avoid faster resources waiting on slower to finish their jobs. Moreover, in HPC clusters on Cloud, one has to take into account not only computing nodes of different processing power, but also a communication links of different speed between nodes as well. For this reasons we propose a load balancing method based on a semidefinite optimization. We hope that this method, coupled with a multi-layered programming, can perform a HPL benchmark on CPUGPU clusters and HPC Cloud systems more efficiently than methods used today.","","978-953-233-068-7","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6240677","","Benchmark testing;Graphics processing unit;Programming;Symmetric matrices;Load management;Optimization;Clustering algorithms","application program interfaces;benchmark testing;graphics processing units;message passing;multiprocessing systems;parallel programming;performance evaluation;resource allocation","high performance Linpack;CPUGPU clusters;high-performance computing;general purpose CPU;GPU accelerators;HPL benchmarking;multilayered programming model;least message passing interface;multiprocessing;stream programming;load-balancing scheme;processing power;load balancing method;semidefinite optimization","","2","","10","","16 Jul 2012","","","IEEE","IEEE Conferences"
"OpenMP 4.5 compiler optimization for GPU offloading","E. Tiotto; B. Mahjour; W. Tsang; X. Xue; T. Islam; W. Chen",NA; NA; NA; NA; NA; NA,"IBM Journal of Research and Development","15 May 2020","2020","64","3/4","14:1","14:11","Ability to efficiently offload computational workloads to graphic processing units (GPUs) is critical for the success of hybrid CPU–GPU architectures, such as the Summit and Sierra supercomputing systems. OpenMP 4.5 is a high-level programming model that enables the development of architecture- and accelerator-independent applications. This article describes aspects of the OpenMP implementation in the IBM XL C/C++ and XL Fortran OpenMP compilers that aid programmers to achieve performance objectives. This includes an interprocedural static analysis the XL optimizer uses to specialize code generation of the OpenMP distribute parallel do loop within the dynamic context of a target region, and other compiler optimizations designed to reduce the overhead of data transferred to an offloaded target region. We introduce the heuristic used at runtime to select optimal grid sizes for offloaded target team constructs. These tuned heuristics lead to an average improvement of 2× in the runtime of several target regions in the SPEC ACCEL V1.2 benchmark suite. In addition to performance enhancement, this article also presents an advanced diagnostic feature implemented in the XL Fortran compiler to aid in debugging OpenMP applications offloaded to accelerators.","0018-8646","","10.1147/JRD.2019.2962428","CORAL; U.S. Department of Energy(grant numbers:B604142); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8943339","","Graphics processing units;Runtime;Programming;Context;Computer architecture;Optimization","","","","","","11","IBM","25 Dec 2019","","","IBM","IBM Journals"
"A Runtime Library for Platform-Independent Task Parallelism","P. E. Hadjidoukas; E. Lappas; V. V. Dimakopoulos","Dept. of Comput. Sci., Univ. of Ioannina, Ioannina, Greece; Dept. of Comput. Sci., Univ. of Ioannina, Ioannina, Greece; Dept. of Comput. Sci., Univ. of Ioannina, Ioannina, Greece","2012 20th Euromicro International Conference on Parallel, Distributed and Network-based Processing","15 Mar 2012","2012","","","229","236","With the increasing diversity of computing systems and the rapid performance improvement of commodity hardware, heterogeneous clusters become the dominant platform for low-cost, high-performance computing. Grid-enabled and heterogeneous implementations of MPI establish it as the de facto programming model for these environments. On the other hand, task parallelism provides a natural way for exploiting their hierarchical architecture. This hierarchy has been further extended with the advent of general-purpose GPU devices. In this paper we present the implementation of an MPI-based task library for heterogeneous and GPU clusters. The library offers an intuitive programming interface for multilevel task parallelism with transparent data management and load balancing. We discuss design and implementation issues regarding heterogeneity support and report performance results on heterogeneous cluster computing environments.","2377-5750","978-1-4673-0226-5","10.1109/PDP.2012.89","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6169554","task parallelism;heterogeneous computing;runtime support;message passing","Graphics processing unit;Kernel;Programming;Parallel processing;Libraries;Central Processing Unit;Computer architecture","application program interfaces;data handling;graphics processing units;message passing;parallel processing;resource allocation","runtime library;platform-independent task parallelism;computing system;commodity hardware;heterogeneous cluster computing environment;high-performance computing;Grid-enabled MPI implementation;heterogeneous MPI implementation;message passing interface;de facto programming model;general-purpose GPU device;graphics processing unit;intuitive programming interface;transparent data management;load balancing;MPI-based task library;multilevel task parallelism","","6","","22","","15 Mar 2012","","","IEEE","IEEE Conferences"
"Parallel Computing Experiences with CUDA","M. Garland; S. Le Grand; J. Nickolls; J. Anderson; J. Hardwick; S. Morton; E. Phillips; Y. Zhang; V. Volkov","NVIDIA; NVIDIA; NVIDIA; Iowa State University and Ames Laboratory; TechniScan Medical Systems; Hess; University of California, Davis; University of California, Davis; University of California, Berkeley","IEEE Micro","19 Sep 2008","2008","28","4","13","27","The CUDA programming model provides a straightforward means of describing inherently parallel computations, and NVIDIA's Tesla GPU architecture delivers high computational throughput on massively parallel problems. This article surveys experiences gained in applying CUDA to a diverse set of problems and the parallel speedups over sequential codes running on traditional CPU architectures attained by executing key computations on the GPU.","1937-4143","","10.1109/MM.2008.57","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4626815","","Parallel processing;Programming profession;Parallel programming;Concurrent computing;Computer architecture;Computer graphics;Kernel;Throughput;Central Processing Unit","coprocessors;parallel processing","parallel computing;CUDA programming model;NVIDIA;Tesla GPU architecture;sequential codes","","291","10","22","IEEE","19 Sep 2008","","","IEEE","IEEE Magazines"
"An Initial Assessment of NVSHMEM for High Performance Computing","C. Hsu; N. Imam; A. Langer; S. Potluri; C. J. Newburn","Oak Ridge National Laboratory Oak Ridge TN,Computing & Computational Sciences,USA; Oak Ridge National Laboratory Oak Ridge TN,Computing & Computational Sciences,USA; NVIDIA Corporation,Compute Software,Santa Clara, CA,USA; NVIDIA Corporation,Compute Software,Santa Clara, CA,USA; NVIDIA Corporation,Compute Software,Santa Clara, CA,USA","2020 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","28 Jul 2020","2020","","","1","10","High Performance Computing has been a driving force behind important tasks such as scientific discovery and deep learning. It tends to achieve performance through greater concurrency and heterogeneity, where the underlying complexity of richer topologies is managed through software abstraction.In this paper, we present our initial assessment of NVSHMEM, an experimental programming library that supports the Partitioned Global Address Space programming model for NVIDIA GPU clusters. NVSHMEM offers several concrete advantages. One is that it reduces overheads and software complexity by allowing communication and computation to be interleaved vs. separating them into different phases. Another is that it implements the OpenSHMEM specification to provide efficient finegrained one-sided communication, streamlining away overheads due to tag matching, wildcards, and unexpected messages which have compounding effect with increasing concurrency. It also offers ease of use by abstracting away low-level configuration operations that are required to enable low-overhead communication and direct loads and stores across processes.We evaluated NVSHMEM in terms of usability, functionality, and scalability by running two math kernels, matrix multiplication and Jacobi solver, on the 27,648-GPU Summit supercomputer. Our exercise of NVSHMEM at scale contributed to making NVSHMEM more robust and preparing it for production release.","","978-1-7281-7445-7","10.1109/IPDPSW50202.2020.00104","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9150438","high Performance Computing (HPC);CUDA;openSHMEM;scalability","Graphics processing units;Programming;Kernel;Message systems;Jacobian matrices;Electronics packaging","application program interfaces;graphics processing units;matrix multiplication;message passing;parallel programming;software libraries;software performance evaluation","NVIDIA GPU clusters;Partitioned Global Address Space programming model;experimental programming library;software abstraction;deep learning;scientific discovery;driving force;high Performance Computing;low-overhead communication;one-sided communication;software complexity;NVSHMEM","","1","","8","","28 Jul 2020","","","IEEE","IEEE Conferences"
"Accelerating a C++ CFD Code with OpenACC","J. Kraus; M. Schlottke; A. Adinetz; D. Pleiter","NVIDIA GmbH, Wurselen, Germany; RWTH Aachen Univ., Aachen, Germany; Forschungszentrum Jυlich, Julich, Germany; Forschungszentrum Jυlich, Julich, Germany","2014 First Workshop on Accelerator Programming using Directives","9 Apr 2015","2014","","","47","54","Todays HPC systems are increasingly utilizing accelerators to lower time to solution for their users and reduce power consumption. To utilize the higher performance and energy efficiency of these accelerators, application developers need to rewrite at least parts of their codes. Taking the C++ flow solver ZFS as an example, we show that the directive-based programming model allows one to achieve good performance with reasonable effort, even for mature codes with many lines of code. Using OpenACC directives permitted us to incrementally accelerate ZFS, focusing on the parts of the program that are relevant for the problem at hand. The two new OpenACC 2.0 features, unstructured data regions and atomics, are required for this. OpenACC's interoperability with existing GPU libraries via the host_data use_device construct allowed to use CUDAaware MPI to achieve multi-GPU scalability comparable to the CPU version of ZFS. Like many other codes, the data structures of ZFS have been designed with traditional CPUs and their relatively large private caches in mind. This leads to suboptimal memory access patterns on accelerators, such as GPUs. We show how the texture cache on NVIDIA GPUs can be used to minimize the performance impact of these suboptimal patterns without writing platform specific code. For the kernel most affected by the memory access pattern, we compare the initial array of structures memory layout with a structure of arrays layout.","","978-1-4673-6753-0","10.1109/WACCPD.2014.11","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7081677","","Graphics processing units;Acceleration;Computer architecture;Microprocessors;Programming;Kernel","application program interfaces;C++ language;computational fluid dynamics;graphics processing units;message passing;open systems;parallel architectures","C++ flow solver;CFD code;computational fluid dynamics;OpenACC interoperability;directive-based programming model;CUDA aware MPI;NVIDIA GPU","","16","","21","","9 Apr 2015","","","IEEE","IEEE Conferences"
"Accelerating bootstrapping in FHEW using GPUs","M. S. Lee; Y. Lee; J. H. Cheon; Y. Paek","Dept. of Mathematical Sciences, Seoul National University, Korea; Dept. of Electrical and Computer Engineering and Inter-University Semiconductor Research Center (ISRC), Seoul National University, Korea; Dept. of Mathematical Sciences, Seoul National University, Korea; Dept. of Electrical and Computer Engineering and Inter-University Semiconductor Research Center (ISRC), Seoul National University, Korea","2015 IEEE 26th International Conference on Application-specific Systems, Architectures and Processors (ASAP)","10 Sep 2015","2015","","","128","135","Recently, the usage of GPU is not limited to the jobs associated with graphics and a wide variety of applications take advantage of the flexibility of GPUs to accelerate the computing performance. Among them, one of the most emerging applications is the fully homomorphic encryption (FHE) scheme, which enables arbitrary computations on encrypted data. Despite much research effort, it cannot be considered as practical due to the enormous amount of computations, especially in the bootstrapping procedure. In this paper, we accelerate the performance of the recently suggested fast bootstrapping method in FHEW scheme using GPUs, as a case study of a FHE scheme. In order to optimize, we explored the reference code and carried out profiling to find out candidates for performance acceleration. Based on the profiling results, combined with more flexible tradeoff method, we optimized the bootstrapping algorithm in FHEW using GPU and CUDA's programming model. The empirical result shows that the bootstrapping of FHEW ciphertext can be done in less than 0.11 second after optimization.","2160-052X","978-1-4799-1925-3","10.1109/ASAP.2015.7245720","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7245720","","Graphics processing units;Encryption;Acceleration;Libraries;Noise;Polynomials","cryptography;graphics processing units;parallel programming","bootstrapping algorithm;FHEW scheme;fully homomorphic encryption scheme;GPU;graphics processing unit;performance acceleration;fast bootstrapping method;CUDA programming model;Compute Unified Device Architecture;FHEW ciphertext bootstrapping","","7","","26","","10 Sep 2015","","","IEEE","IEEE Conferences"
================================================
FILE: notebooks/data/ieee_3.csv
================================================
"Document Title",Authors,"Author Affiliations","Publication Title",Date Added To Xplore,"Publication Year","Volume","Issue","Start Page","End Page","Abstract","ISSN",ISBNs,"DOI",Funding Information,PDF Link,"Author Keywords","IEEE Terms","INSPEC Controlled Terms","INSPEC Non-Controlled Terms","Mesh_Terms",Article Citation Count,Patent Citation Count,"Reference Count","License",Online Date,Issue Date,"Meeting Date","Publisher",Document Identifier
"MR-Graph: A Customizable GPU MapReduce","Z. Qiao; S. Liang; H. Jiang; S. Fu","Dept. of Comput. Sci. & Eng., Univ. of North Texas, Denton, TX, USA; Dept. of Comput. Sci. & Eng., Univ. of North Texas, Denton, TX, USA; Dept. of Comput. Sci., Arkansas State Univ., AR, USA; NA","2015 IEEE 2nd International Conference on Cyber Security and Cloud Computing","7 Jan 2016","2015","","","417","422","The MapReduce programming model has been widely used in Big Data and Cloud applications. Criticism on its inflexibility when being applied to complicated scientific applications recently emerges. Several techniques have been proposed to enhance its flexibility. However, some of them exert special requirements on applications, while others fail to support the increasingly popular coprocessors, such as Graphics Processing Unit (GPU). In this paper, we propose MR-Graph, a customizable and unified framework for GPU-based MapReduce, which aims to improve the flexibility, scalability and performance of MapReduce. MR-Graph addresses the limitations and restrictions of the traditional MapReduce execution paradigm. The three execution modes integrated in MR-Graph facilitates users to write their applications in a more flexible fashion by defining a Map and Reduce function call graph. MR-Graph efficiently explores the memory hierarchy in GPUs to reduce the data transfer overhead between execution stages and accommodate big data applications. We have implemented a prototype of MR-Graph and experimental results show the effectiveness of using MR-Graph for flexible and scalable GPU-based MapReduce computing.","","978-1-4673-9300-3","10.1109/CSCloud.2015.49","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7371516","MapReduce;GPU;Configurable;Flexible;Iterative;Recursive","Graphics processing units;Programming;Parallel processing;Computational modeling;Big data;Cloud computing;Data models","graphics processing units;parallel programming","MR-Graph framework;GPU MapReduce;MapReduce programming model;graphics processing unit;MapReduce execution paradigm;memory hierarchy;Big Data applications","","","","15","","7 Jan 2016","","","IEEE","IEEE Conferences"
"Performance Optimization of Top-k Queries on GPU","T. Luo; G. -Z. Sun; G. Chen","Key Lab. on High Performance Comput., Anhui Province Univ. of Sci. & Technol. of China, Hefei, China; Key Lab. on High Performance Comput., Anhui Province Univ. of Sci. & Technol. of China, Hefei, China; Key Lab. on High Performance Comput., Anhui Province Univ. of Sci. & Technol. of China, Hefei, China","2011 Fourth International Symposium on Parallel Architectures, Algorithms and Programming","12 Jan 2012","2011","","","9","13","With the development of web search engines, the concern on real-time performance of Top-k queries has attracted more and more attention. The author studies implement of classic algorithm - No Random Access Algorithm in order to optimize performance of Top-k queries on GPU. We give a novel GPU algorithm by using the features of CUDA's programming model. Experiment results show that an implementation of the algorithm on one GPU runs more than 7000 times faster than a single core implementation on a latest CPU.","2168-3042","978-1-4577-1808-3","10.1109/PAAP.2011.11","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6128467","GPU;performance optimization;top-k queries","Graphics processing unit;Instruction sets;Upper bound;Programming;Algorithm design and analysis;Optimization;Vectors","graphics processing units;optimisation;parallel architectures;parallel programming;performance evaluation;query processing","performance optimization;top-k queries;GPU;Web search engines;classic algorithm;no random access algorithm;CUDA programming model","","1","","15","","12 Jan 2012","","","IEEE","IEEE Conferences"
"Towards an Effective Unified Programming Model for Many-Cores","A. L. Varbanescu; P. Hijma; R. van Nieuwpoort; H. Bal","Comput. Syst. Group, Vrije Univ. Amsterdam, Amsterdam, Netherlands; Comput. Syst. Group, Vrije Univ. Amsterdam, Amsterdam, Netherlands; Comput. Syst. Group, Vrije Univ. Amsterdam, Amsterdam, Netherlands; Comput. Syst. Group, Vrije Univ. Amsterdam, Amsterdam, Netherlands","2011 IEEE International Symposium on Parallel and Distributed Processing Workshops and Phd Forum","1 Sep 2011","2011","","","681","692","Building an effective programming model for many-core processors is challenging. On the one hand, the increasing variety of platforms and their specific programming models force users to take a hardware-centric approach not only for implementing parallel applications, but also for designing them. This approach diminishes portability and, eventually, limits performance. On the other hand, to effectively cope with the increased number of large-scale workloads that require parallelization, a portable, application-centric programming model is desirable. Such a model enables programmers to focus first on extracting and exploiting parallelism from their applications, as opposed to generating parallelism for specific hardware, and only second on platform-specific implementation and optimizations. In this paper, we first present a survey of programming models designed for programming three families of many-cores: general purpose many-cores (GPMCs), graphics processing units (GPUs), and the Cell/B.E.. We analyze the usability of these models, their ability to improve platform programmability, and the specific features that contribute to this improvement. Next, we also discuss two types of generic models: parallelism-centric and application-centric. We also analyze their features and impact on platform programmability. Based on this analysis, we recommend two application-centric models (OmpSs and OpenCL) as promising candidates for a unified programming model for many-cores and we discuss potential enhancements for them.","1530-2075","978-1-61284-425-1","10.1109/IPDPS.2011.210","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6008837","","Programming;Parallel processing;Computer architecture;Data models;Concurrent computing;Computational modeling;Productivity","application program interfaces;computer graphic equipment;coprocessors;multiprocessing systems","unified programming model;many-core processors;application-centric programming model;parallelism generation;general purpose many-cores;GPMC;graphics processing units;GPU;Cell/B.E;parallelism-centric model;OmpS;OpenCL;multicore processors;many-core accelerators","","7","","26","","1 Sep 2011","","","IEEE","IEEE Conferences"
"Lit: A high performance massive data computing framework based on CPU/GPU cluster","Y. Zhai; E. Mbarushimana; W. Li; J. Zhang; Y. Guo","Beijing Engineering Research Center of Massive Language Information Processing and Cloud Computing Application, School of Computer Science, Beijing Institute of Technology, China 100081; Beijing Engineering Research Center of Massive Language Information Processing and Cloud Computing Application, School of Computer Science, Beijing Institute of Technology, China 100081; Science and Technology on Complex Systems Simulation Laboratory, Beijing, China; Science and Technology on Complex Systems Simulation Laboratory, Beijing, China; Beijing Engineering Research Center of Massive Language Information Processing and Cloud Computing Application, School of Computer Science, Beijing Institute of Technology, China 100081","2013 IEEE International Conference on Cluster Computing (CLUSTER)","9 Jan 2014","2013","","","1","8","Big data processing is receiving significant amount of interest as an important technology to reveal the information behind the data, such as trends, characteristics, etc. MapReduce is considered as the most efficient distributed parallel data processing framework. However, some high-end applications, especially some scientific analyses have both data-intensive and computation-intensive features. Current big data processing techniques like Hadoop are not designed for computation-intensive applications, thus have insufficient computation power. In this paper, we presented Lit, a high performance massive data computing framework based on CPU/GPU cluster. Lit integrated GPU with Hadoop to improve the computational power of each node in the cluster. Since the architecture and programming model of GPU is different from CPU, Lit provided an annotation based approach to automatically generate CUDA codes from Hadoop codes. Lit hided the complexity of programming on CPU/GPU cluster by providing extended compiler and optimizer. To utilize the simplified programming, scalability and fault tolerance benefits of Hadoop and combine them with the high performance computation power of GPU, Lit extended the Hadoop by applying a GPUClassloader to detect the GPU, generate and compile CUDA codes, and invoke the shared library. Our experimental results show that Lit can achieve an average speedup of 1x to 3x on three typical applications over Hadoop.","2168-9253","978-1-4799-0898-1","10.1109/CLUSTER.2013.6702614","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6702614","","Graphics processing units;Computational modeling;Handheld computers;Data models;Load modeling;Semantics","Big Data;fault tolerant computing;graphics processing units;parallel architectures;program compilers","Lit;high performance massive data computing framework;CPU cluster;GPU cluster;Big Data processing;MapReduce;distributed parallel data processing framework;data-intensive feature;computation-intensive feature;programming model;annotation based approach;CUDA code generation;Hadoop codes;extended compiler;extended optimizer;fault tolerance;high performance computation power;GPUClassloader;GPU detection;CUDA code compiling","","6","1","19","","9 Jan 2014","","","IEEE","IEEE Conferences"
"LOOG: Improving GPU Efficiency With Light-Weight Out-Of-Order Execution","K. Iliakis; S. Xydis; D. Soudris","National Technical University of Athens, Zografou, Greece; National Technical University of Athens, Zografou, Greece; National Technical University of Athens, Zografou, Greece","IEEE Computer Architecture Letters","10 Jan 2020","2019","18","2","166","169","GPUs are one of the most prevalent platforms for accelerating general-purpose workloads due to their intuitive programming model, computing capacity, and cost-effectiveness. GPUs rely on massive multi-threading and fast context switching to overlap computations with memory operations. Among the diverse GPU workloads, there exists a class of kernels that fail to maintain a sufficient number of active warps to hide the latency of memory operations, and thus suffer from frequent stalling. We observe that these kernels will benefit from increased levels of Instruction-Level Parallelism and we propose a novel architecture with lightweight Out-Of-Order execution capability. To minimize hardware overheads, we carefully design our extension to highly re-use the existing micro-architectural structures. We show that the proposed architecture outperforms traditional platforms by 15 to 46 percent on average for low occupancy kernels, with an area overhead of 0.74 to 3.94 percent. Finally, we prove the potential of our proposal as a GPU u-arch alternative, by providing a 5 percent speedup over a wide collection of 63 general-purpose kernels with as little as 0.74 percent area overhead.","1556-6064","","10.1109/LCA.2019.2951161","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8890662","GPGPU;Out-of-Order execution;micro-architecture","Graphics processing units;Kernel;Registers;Radio access technologies;Copper;Radio frequency;Out of order","graphics processing units;multi-threading;parallel architectures;storage management","light-weight out-of-order execution;out-of-order execution capability;GPU u-arch;general-purpose kernels;area overhead;low occupancy kernels;hardware overheads;instruction-level parallelism;stalling;active warps;GPU workloads;memory operations;massive multithreading;cost-effectiveness;intuitive programming model;general-purpose workloads;GPU efficiency;LOOG","","","","18","IEEE","4 Nov 2019","","","IEEE","IEEE Journals"
"Template matching of aerial images using GPU","N. Nazneen; M. Shafiq; A. Hameed","KICSIT, Rawalpindi, Pakistan; CESAT, Islamabad, Pakistan; CESAT, Islamabad, Pakistan","2016 13th International Bhurban Conference on Applied Sciences and Technology (IBCAST)","10 Mar 2016","2016","","","206","212","During the last decade, processor architectures have emerged with hundreds and thousands of high speed processing cores in a single chip. These cores can work in parallel to share a work load for faster execution. This paper presents performance evaluations on such multicore and many-core devices by mapping a computationally expensive correlation kernel of a template matching process using various programming models. The work builds a base performance case by a sequential mapping of the algorithm on an Intel processor. In the second step, the performance of the algorithm is enhanced by parallel mapping of the kernel on a shared memory multicore machine using OpenMP programming model. Finally, the Normalized Cross-Correlation (NCC) kernel is scaled to map on a many-core K20 GPU using CUDA programming model. In all steps, the correctness of the implementation of algorithm is taken care by comparing computed data with reference results from a high level implementation in MATLAB. The performance results are presented with various optimization techniques for MATLAB, Sequential, OpenMP and CUDA based implementations. The results show that GPU based implementation achieves 32x and 5x speed-ups respectively to the base case and multicore implementations respectively. Moreover, using inter-block sub-sampling on an 8-bit 4000×4000 reference gray-scale image achieves the execution time upto 2.8sec with an error growth less than 20% for the selected templates of size 96×96.","2151-1411","978-1-4673-9127-6","10.1109/IBCAST.2016.7429878","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7429878","","Graphics processing units;MATLAB;Kernel;Computational modeling;Correlation;Instruction sets;Multicore processing","graphics processing units;image matching;parallel programming;shared memory systems","template matching;aerial image matching;graphics processing unit;multicore devices;many-core devices;correlation kernel mapping;sequential mapping;parallel mapping;shared memory multicore machine;OpenMP programming model;normalized cross-correlation kernel;NCC kernel;many-core K20 GPU;CUDA programming model;Compute Unified Device Architecture;Matlab;inter-block sub-sampling","","","","13","","10 Mar 2016","","","IEEE","IEEE Conferences"
"Sparse Matrix Formats Evaluation and Optimization on a GPU","M. R. Hugues; S. G. Petiton","TOTAL Exploration & Production, Pau, France; Lab. d'Inf. Fondamentale de Lille, CNRS/LIFL, Lille, France","2010 IEEE 12th International Conference on High Performance Computing and Communications (HPCC)","27 Sep 2010","2010","","","122","129","The data parallel programming model comes back with massive multicore architectures. The GPU is one of these and offers important possibilities to accelerate linear algebra. However, the irregular structure of sparse matrix operations generates problems with this programming model to obtain efficient performance. This depends on the used format to store values and the matrix structure. The sparse matrix-vector product (SpMV) is one of the most used kernel in scientific computing and is the main performance source of iterative methods. We propose an evaluation and optimization of several sparse formats for the SpMV kernel which have succeeded at the time of data parallel computer. This study is realized by analyzing the performances following the distribution of the non zeros values in the matrix to determine the best and the worst reachable value. The results show that all sparse formats converge to the same efficiency and perform poorly with a strong distribution of elements.","","978-1-4244-8335-8","10.1109/HPCC.2010.85","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5581446","Sparse Format;SpMV;GPU;Many-Core;Data Parallel Programming","Arrays;Sparse matrices;Graphics processing unit;Indexes;Instruction sets;Artificial neural networks;Finite element methods","computer graphic equipment;coprocessors;iterative methods;multiprocessing systems;parallel programming;sparse matrices","sparse matrix format evaluation;GPU;sparse matrix format optimization;data parallel programming model;massive multicore;linear algebra;sparse matrix vector product;iterative method;SpMV kernel","","10","","14","","27 Sep 2010","","","IEEE","IEEE Conferences"
"Beyond the Socket: NUMA-Aware GPUs","U. Milic; O. Villa; E. Bolotin; A. Arunkumar; E. Ebrahimi; A. Jaleel; A. Ramirez; D. Nellans","Barcelona Supercomputing Center (BSC), Universitat Politècnica de Catalunya (UPC); NVIDIA; NVIDIA; Arizona State University; NVIDIA; NVIDIA; Google; NVIDIA","2017 50th Annual IEEE/ACM International Symposium on Microarchitecture (MICRO)","11 Apr 2019","2017","","","123","135","GPUs achieve high throughput and power efficiency by employing many small single instruction multiple thread (SIMT) cores. To minimize scheduling logic and performance variance they utilize a uniform memory system and leverage strong data parallelism exposed via the programming model. With Moore’s law slowing, for GPUs to continue scaling performance (which largely depends on SIMT core count) they are likely to embrace multi-socket designs where transistors are more readily available. However when moving to such designs, maintaining the illusion of a uniform memory system is increasingly difficult. In this work we investigate multi-socket non-uniform memory access (NUMA) GPU designs and show that significant changes are needed to both the GPU interconnect and cache architectures to achieve performance scalability. We show that application phase effects can be exploited allowing GPU sockets to dynamically optimize their individual interconnect and cache policies, minimizing the impact of NUMA effects. Our NUMA-aware GPU outperforms a single GPU by $1.5 \times, 2.3 \times$, and $3.2 \times$ while achieving 89%, 84%, and 76% of theoretical application scalability in 2, 4, and 8 sockets designs respectively. Implementable today, NUMA-aware multi-socket GPUs may be a promising candidate for scaling GPU performance beyond a single socket.CCS CONCEPTS• Computing methodologies → Graphics processors; • Computer systems organization → Single instruction, multiple data;","2379-3155","978-1-4503-4952-9","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8686671","Graphics Processing Units;Multi-socket GPUs;NUMA Systems","Graphics processing units;Bandwidth;Programming;Runtime;Sockets;Transistors;Throughput","cache storage;graphics processing units;integrated circuit design;multiprocessing systems;multi-threading;power aware computing","multisocket nonuniform memory access GPU designs;cache architectures;performance scalability;application phase effects;GPU sockets;individual interconnect;cache policies;NUMA effects;single GPU;scaling GPU performance;single socket;high throughput;power efficiency;single instruction multiple thread cores;scheduling logic;performance variance;uniform memory system;programming model;Moore's law slowing;scaling performance;SIMT core count;multisocket designs;NUMA-aware multisocket GPU;strong data parallelism","","","","63","","11 Apr 2019","","","IEEE","IEEE Conferences"
"A Branch-and-Bound algorithm using multiple GPU-based LP solvers","X. Meyer; B. Chopard; P. Albuquerque","Dept. of Computer Science, University of Geneva, Switzerland; Dept. of Computer Science, University of Geneva, Switzerland; Institute for Informatics & Telecommunications, University of Applied Sciences of Western Switzerland, Geneva, Switzerland","20th Annual International Conference on High Performance Computing","17 Apr 2014","2013","","","129","138","The Branch-and-Bound (B&B) method is a well-known optimization algorithm for solving integer linear programming (ILP) models in the field of operations research. It is part of software often employed by businesses for finding solutions to problems such as airline scheduling problems. It operates according to a divide-and-conquer principle by building a tree-like structure with nodes that represent linear programming (LP) problems. A LP solver commonly used to process the nodes is the simplex method. Nowadays its sequential implementation can be found in almost all commercial ILP solvers. In this paper, we present a hybrid CPU-GPU implementation of the B&B algorithm. The B&B tree is managed by the CPU, while the revised simplex method is mainly a GPU implementation, relying on the CUDA technology of NVIDIA. The CPU manages concurrently multiple instances of the LP solver. The principal difference with a sequential implementation of the B&B algorithm pertains to the LP solver, provided that the B&B tree is managed with the same strategy. We thus compared our GPU-based implementation of the revised simplex to a well-known open-source sequential solver, named CLP, of the COIN-OR project. For given problem densities, we measured a size threshhold beyond which our GPU implementation outperformed its sequential counterpart.","1094-7256","978-1-4799-0730-4","10.1109/HiPC.2013.6799105","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6799105","","Graphics processing units;Linear programming;Indexes;Mathematical model;Standards;Central Processing Unit;Equations","graphics processing units;integer programming;linear programming;public domain software;scheduling;travel industry;tree searching","branch-and-bound algorithm;multiple GPU-based LP solver;B&B method;optimization algorithm;integer linear programming model;ILP model;operations research;airline scheduling problem;divide-and-conquer principle;tree-like structure;LP problem;hybrid CPU-GPU implementation;B&B algorithm;B&B tree;simplex method;CUDA technology;NVIDIA;sequential implementation;GPU-based implementation;open-source sequential solver;CLP;COIN-OR project","","4","","33","","17 Apr 2014","","","IEEE","IEEE Conferences"
"Early evaluation of directive-based GPU programming models for productive exascale computing","S. Lee; J. S. Vetter","Oak Ridge Nat. Lab., Oak Ridge, TN, USA; Oak Ridge Nat. Lab., Georgia Inst. of Technol., Atlanta, GA, USA","SC '12: Proceedings of the International Conference on High Performance Computing, Networking, Storage and Analysis","25 Feb 2013","2012","","","1","11","Graphics Processing Unit (GPU)-based parallel computer architectures have shown increased popularity as a building block for high performance computing, and possibly for future Exascale computing. However, their programming complexity remains as a major hurdle for their widespread adoption. To provide better abstractions for programming GPU architectures, researchers and vendors have proposed several directive-based GPU programming models. These directive-based models provide different levels of abstraction, and required different levels of programming effort to port and optimize applications. Understanding these differences among these new models provides valuable insights on their applicability and performance potential. In this paper, we evaluate existing directive-based models by porting thirteen application kernels from various scientific domains to use CUDA GPUs, which, in turn, allows us to identify important issues in the functionality, scalability, tunability, and debuggability of the existing models. Our evaluation shows that directive-based models can achieve reasonable performance, compared to hand-written GPU codes.","2167-4337","978-1-4673-0806-9","10.1109/SC.2012.51","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6468490","","Graphics processing units;Programming;Computational modeling;Optimization;Data models;Computer architecture;Kernel","graphics processing units;parallel architectures;parallel programming;software performance evaluation","directive-based GPU programming model early evaluation;productive exascale computing;graphics processing unit-based parallel computer architectures;high performance computing;exascale computing;programming complexity;GPU architecture programming;abstraction levels;performance potential;programming effort levels;CUDA GPUs;hand-written GPU codes;program scalability;program functionality;program tunability;program debuggability","","40","","25","","25 Feb 2013","","","IEEE","IEEE Conferences"
"GAGM: Genome assembly on GPU using mate pairs","A. Jain; A. Garg; K. Paul","Dept. of Computer Science and Engineering, IIT Delhi, New Delhi, India; Dept. of Computer Science and Engineering, IIT Delhi, New Delhi, India; Dept. of Computer Science and Engineering, IIT Delhi, New Delhi, India","20th Annual International Conference on High Performance Computing","17 Apr 2014","2013","","","176","185","Genome fragment assembly has long been a time and computation intensive problem in the field of bioinformatics. Many parallel assemblers have been proposed to accelerate the process but there hasn't been any effective approach proposed for GPUs. Also with the increasing power of GPUs, applications from various research fields are being parallelized to take advantage of the massive number of “cores” available in GPUs. In this paper we present the design and development of a GPU based assembler (GAGM) for sequence assembly using Nvidia's GPUs with the CUDA programming model. Our assembler utilizes the mate pair reads produced by the current NGS technologies to build paired de Bruijn graph. Every paired read is broken into paired k-mers and l-mers. Every paired k-mer represents a vertex and paired l-mers are mapped as edges. Contigs are formed by grouping the regions of graph which can be unambiguously connected. We present parallel algorithms for k - mer extraction, paired de Bruijn graph construction and grouping of edges. We have benchmarked GAGM on four bacterial genomes. Our results show that the design on GPU is effective in terms of time as well as the quality of assembly produced.","1094-7256","978-1-4799-0730-4","10.1109/HiPC.2013.6799107","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6799107","parallel processing;bioinformatics;GPU;genome assembly","Graphics processing units;Genomics;Bioinformatics;Benchmark testing;DNA;Encoding","biocomputing;graph theory;graphics processing units;parallel algorithms;parallel architectures;program assemblers","GAGM;mate pairs;genome fragment assembly;bioinformatics;parallel assemblers;GPU based assembler;sequence assembly;CUDA programming model;NGS technologies;paired read;paired k-mers;paired l-mers;vertex;parallel algorithms;k-mer extraction;paired de Bruijn graph construction;edge grouping;bacterial genomes","","6","","31","","17 Apr 2014","","","IEEE","IEEE Conferences"
"Task Scheduling for GPU Heterogeneous Cluster","K. Zhang; B. Wu","Sch. of Comput. Sci., Fudan Univ., Shanghai, China; Sch. of Comput. Sci., Fudan Univ., Shanghai, China","2012 IEEE International Conference on Cluster Computing Workshops","20 Nov 2012","2012","","","161","169","Modern GPUs are gradually used by more and more cluster computing systems as the high performance computing units due to their outstanding computational power, whereas bringing node-level architectural heterogeneity to cluster. In this paper, based on MPI and CUDA programming model, we aim to investigate task scheduling for GPU heterogeneous cluster by taking into account the node-level heterogeneous characteristics. At first, based on our GPU heterogeneous cluster, we classify executing tasks to six major classifications according to their parallelism degrees, input data sizes, and processing workloads. Then, aiming to realize optimal mapping between tasks and computing resources, a task scheduling strategy is presented. The strategy consists of two key algorithms. The first is packing task algorithm (PTA) used to pack multiple tasks into a single task, such packing provides us a way of task classification converting according to the characteristic of computing resources. The second is system-level scheduling algorithm(SLSA) used to distribute parallel and sequential tasks to corresponding nodes, to maintain the load balance.","","978-0-7695-4844-9","10.1109/ClusterW.2012.20","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6355860","Task Scheduling;GPU Heterogeneous Cluster;PTA Algorithm;SLSA Algorithm","Graphics processing units;Kernel;Processor scheduling;Scheduling;Clustering algorithms;Computer architecture","application program interfaces;graphics processing units;message passing;parallel architectures;pattern classification;pattern clustering;resource allocation;scheduling","task scheduling strategy;GPU heterogeneous cluster;cluster computing systems;high performance computing units;node-level architectural heterogeneity;MPI;CUDA programming model;node-level heterogeneous characteristics;parallelism degrees;input data sizes;processing workloads;packing task algorithm;PTA;task classification;system-level scheduling algorithm;SLSA;parallel tasks;sequential tasks;load balance","","4","2","25","","20 Nov 2012","","","IEEE","IEEE Conferences"
"Parallelized computation for Edge Histogram Descriptor using CUDA on the Graphics Processing Units (GPU)","A. A. Mohammadabadi; A. Chalechale; H. Heidari","Department of Computer Engineering, Razi University, Kermanshah, Iran; Department of Computer Engineering, Razi University, Kermanshah, Iran; Department of Computer Engineering, Razi University, Kermanshah, Iran","The 17th CSI International Symposium on Computer Architecture & Digital Systems (CADS 2013)","20 Jan 2014","2013","","","9","14","Most image processing algorithms are inherently parallel, so multithreading processors are suitable in such applications. In huge image databases, image processing takes very long time for run on a single core processor because of single thread execution of algorithms. GPU is more common in most image processing applications due to multithread execution of algorithms, programmability and low cost. In this paper we show how to implement the MPRG-7 Edge Histogram Descriptor in parallel using CUDA programming model on a GPU. The Edge Histogram Descriptor describes the distribution of various types of edges with a histogram that can be a tool for image matching. This feature is applied to search images from a database which are similar to a query image. We evaluated the retrieval of the proposed technique using recall, precision, and average precision measures. Experimental results showed that parallel implementation led to an average speed up of 14.74×over the serial implementation. The average precision and the average recall of presented method are 67.02% and 55.00% respectively.","2325-937X","978-1-4799-0565-2","10.1109/CADS.2013.6714231","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6714231","content based image retrieval;CUDA;edge histogram descriptor;GPU","Image edge detection;Graphics processing units;Instruction sets;Feature extraction;Histograms;Image retrieval;Kernel","edge detection;graphics processing units;image matching;image retrieval;multi-threading;parallel architectures;visual databases","parallelized computation;MPRG-7 edge histogram descriptor;CUDA programming model;graphics processing unit;GPU;image processing algorithm;multithreading processors;image database;image matching;image searching;query image;recall measures;average precision measures","","","","11","","20 Jan 2014","","","IEEE","IEEE Conferences"
"Implementation and Performance Analysis of a Parallel Oil Reservoir Simulator Tool Using a CG Method on a GPU-Based System","L. Ismail; J. Abou-Kassem; B. Qamar","Comput. & Software Eng., UAE Univ., Al-Ain, United Arab Emirates; Dept. of Chem. & Pet. Eng., UAE Univ., Al-Ain, United Arab Emirates; HPGCL Res. Lab., UAE Univ., Al-Ain, United Arab Emirates","2014 UKSim-AMSS 16th International Conference on Computer Modelling and Simulation","23 Feb 2015","2014","","","375","380","An oil reservoir simulator is a crucial tool used by petroleum engineering to analyze reservoir conditions. To increase its performance, we implement a parallel version of the tool on a Graphic Processing Unit (GPU), using Computer Unified Device Architecture (CUDA) programming model and the Single Instruction Multiple Threads (SIMT). This paper presents our parallel implementation and performance analysis for 1-D, 2-D, and 3-D oil-phase reservoirs. The implementation and the performance evaluation reveal the gains and the losses achieved by the parallelization of a reservoir simulator on a Graphics Processing Unite (GPU) system. The performance results show that despite the interdependency between the different computational parts of the Conjugate Gradient (CG) method used as a linear solver in the parallel reservoirs, a speedup of 26 can be easily obtained for an oil reservoir simulator using 15 streaming multiprocessors (SMs), compared to a sequential CPU execution. The parallel execution scales well with grid dimensionality.","","978-1-4799-4922-9","10.1109/UKSim.2014.113","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7046095","Oil Reservoir Simulator; Conjugate Gradient (CG) Method; GPU; High Performance Computing","Reservoirs;Graphics processing units;Sparse matrices;Vectors;Instruction sets;Memory management;Clustering algorithms","conjugate gradient methods;graphics processing units;hydrocarbon reservoirs;multiprocessing systems;parallel programming","parallel oil reservoir simulator tool;CG method;conjugate gradient method;GPU based system;graphics processing unit;computer unified device architecture;CUDA programming model;single instruction multiple threads;SIMT;linear solver;streaming multiprocessors;sequential CPU execution;grid dimensionality","","1","","40","","23 Feb 2015","","","IEEE","IEEE Conferences"
"GPU accelerate parallel Odd-Even merge sort: An OpenCL method","K. Zhang; J. Li; G. Chen; B. Wu","School of Computer Science, Fudan University, Shanghai 201203, China; School of Computer Science, Fudan University, Shanghai 201203, China; School of Computer Science, Fudan University, Shanghai 201203, China; School of Computer Science, Fudan University, Shanghai 201203, China","Proceedings of the 2011 15th International Conference on Computer Supported Cooperative Work in Design (CSCWD)","21 Jul 2011","2011","","","76","83","Odd-Even merge sort is a basic problem in computer supported cooperative work in design area. However, it is not effective because of the high complexity O(nlg2n) in CPU platform. In this paper, we present a novel implementation based on the OpenCL programming model on recent GPU (Graphic Processing Unit). Our implementation was based on Knuth's algorithm and do some change. Due to limitations of OpenCL, we utilize a flag variable to make it avoid the direct backward control flow. As results, our implementation achieves 18× speedups compared with the CPU C++ STL quick sort. And it gets almost linear speedup for next generations of GPU because of the complete parallelism in each iteration process. Meanwhile, our approach makes the odd-even merge sort effectively in practice because of the high performance. Furthermore, the approach used in this paper for cooperating thousands of processing units to parallel process can also be used in other cooperation areas.","","978-1-4577-0387-4","10.1109/CSCWD.2011.5960058","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5960058","GPGPU;GPU;Odd-Even Merge Sort;OpenCL","Graphics processing unit;Sorting;Arrays;Computational modeling;Complexity theory;Instruction sets","computer graphic equipment;coprocessors;iterative methods","GPU accelerate parallel odd even merge sort;computer supported cooperative work;OpenCL programming model;graphic processing unit;Knuth algorithm;direct backward control flow;CPU C++ STL quick sort;parallel process;processing units;iteration process","","5","2","35","","21 Jul 2011","","","IEEE","IEEE Conferences"
"GPU Acceleration of Clustered DPCM for Lossless Compression of Hyperspectral Images","J. Li; J. Wu; G. Jeon","School of Electronic Engineering, Xidian University, Xi'an, China; School of Electronic Engineering, Xidian University, Xi'an, China; School of Electronic Engineering, Xidian University, Xi'an, China","IEEE Transactions on Industrial Informatics","14 Feb 2020","2020","16","5","2906","2916","With the development of remote sensing technology, spatial and spectral resolutions of hyperspectral images have become increasingly dense. In order to overcome difficulties in the storage, transmission, and manipulation of hyperspectral images, an effective compression algorithm is requisite. The clustered differential pulse code modulation (C-DPCM), which is a prediction-based hyperspectral image lossless compression algorithm, can achieve a relatively high compression ratio, but its efficiency still requires improvement. This paper presents a parallel implementation of the C-DPCM algorithm on graphics processing units (GPUs) with the compute unified device architecture, which is a parallel computing platform and programming model developed by NVIDIA. Three optimization strategies are utilized to implement the C-DPCM algorithm in parallel, including a version that uses shared memory and registers, a version that employs multistream, and a version that uses multi-GPU. In addition, we studied how to assign all classes to each GPU to minimize the processing time. Finally, we reduced the compression time from approximately half an hour to an hour to several seconds, with almost no loss in accuracy.","1941-0050","","10.1109/TII.2019.2893437","National Natural Science Foundation of China(grant numbers:61775175,61771378); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8613877","Clustered differential pulse code modulation (C-DPCM);compute unified device architecture (CUDA);graphics processing unit (GPU);hyperspectral image lossless compression","Image coding;Hyperspectral imaging;Prediction algorithms;Graphics processing units;Correlation;Bit rate","data compression;differential pulse code modulation;geophysical image processing;graphics processing units;image coding;parallel architectures;remote sensing","hyperspectral images;remote sensing technology;spatial resolutions;spectral resolutions;effective compression algorithm;clustered differential pulse code modulation;prediction-based hyperspectral image lossless compression;compression ratio;parallel implementation;C-DPCM algorithm;compute unified device architecture;parallel computing platform;programming model;compression time;GPU acceleration;clustered DPCM","","4","","30","IEEE","16 Jan 2019","","","IEEE","IEEE Journals"
"A parallel design of computer Go engine on CUDA-enabled GPU","Q. Zhang; Z. Liu","School of Software Beijing University of Posts and Telecommunications, Beijing, China; School of Software Beijing University of Posts and Telecommunications, Beijing, China","2011 IEEE International Conference on Cloud Computing and Intelligence Systems","13 Oct 2011","2011","","","85","88","With the rapid growth of Graphics Processing Unit (GPU) processing capability, using GPU as a coprocessor to assist the CPU in parallel computing has become indispensable. CUDA (Compute Unified Device Architecture) programming model also gives C/C++ language support which makes programming easily. This paper details how to design an engine of computer Go with Monte-Carlo algorithm which is based on GPU with Fermi architecture. We analyze the characteristics of Monte-Carlo algorithm, combined with the CUDA architecture features, divide the algorithm into various sub-modules for GPU computing fast and easily.","2376-595X","978-1-61284-204-2","10.1109/CCIS.2011.6045037","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6045037","Parallelization;CUDA;Monte-Carlo","Graphics processing unit;Games;Monte Carlo methods;Computers;Instruction sets;Engines;Computational modeling","C++ language;computer graphic equipment;coprocessors;Monte Carlo methods;parallel processing","parallel design;computer Go engine;CUDA enabled GPU;graphics processing unit;parallel computing;compute unified device architecture;C++ language support;C language support;Monte-Carlo algorithm;Fermi architecture","","","","7","","13 Oct 2011","","","IEEE","IEEE Conferences"
"Advanced genetic algorithm to solve MINLP problems over GPU","A. Munawar; M. Wahib; M. Munetomo; K. Akama","Graduate School of Information, Science and Technology, Hokkaido University, Sapporo, Japan; Graduate School of Information, Science and Technology, Hokkaido University, Sapporo, Japan; Information Systems Design Laboratory, Information Initiative Center, Hokkaido University, Sapporo, Japan; Information Systems Design Laboratory, Information Initiative Center, Hokkaido University, Sapporo, Japan","2011 IEEE Congress of Evolutionary Computation (CEC)","14 Jul 2011","2011","","","318","325","In this paper we propose a many-core implementation of evolutionary computation for GPGPU (General-Purpose Graphic Processing Unit) to solve non-convex Mixed Integer Non-Linear Programming (MINLP) and non-convex Non Linear Programming (NLP) problems using a stochastic algorithm. Stochastic algorithms being random in their behavior are difficult to implement over GPU like architectures. In this paper we not only succeed in implementation of a stochastic algorithm over GPU but show considerable speedups over CPU implementations. The stochastic algorithm considered for this paper is an adaptive resolution approach to genetic algorithm (arGA), developed by the authors of this paper. The technique uses the entropy measure of each variable to adjust the intensity of the genetic search around promising individuals. Performance is further improved by hybridization with adaptive resolution local search (arLS) operator. In this paper, we describe the challenges and design choices involved in parallelization of this algorithm to solve complex MINLPs over a commodity GPU using Compute Unified Device Architecture (CUDA) programming model. Results section shows several numerical tests and performance measurements obtained by running the algorithm over an nVidia Fermi GPU. We show that for difficult problems we can obtain a speedup of up to 20x with double precision and up to 42x with single precision.","1941-0026","978-1-4244-7835-4","10.1109/CEC.2011.5949635","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5949635","Adaptive Resolution Genetic Algorithm;Parallel Genetic Algorithms;General-Purpose computation on Graphics Processing Units (GPGPU);Compute Unified Device Architecture (CUDA)","Graphics processing unit;Genetic algorithms;Kernel;Stochastic processes;Entropy;Algorithm design and analysis;Genetics","computer graphic equipment;coprocessors;genetic algorithms;integer programming;nonlinear programming;parallel algorithms;parallel architectures;stochastic processes","advanced genetic algorithm;MINLP problems;evolutionary computation;GPGPU;general-purpose graphic processing unit;many-core implementation;nonconvex mixed integer nonlinear programming;stochastic algorithm;GPU like architectures;CPU implementations;adaptive resolution local search operator;parallelization;compute unified device architecture programming model;nVidia Fermi GPU","","10","","28","","14 Jul 2011","","","IEEE","IEEE Conferences"
"Hybrid CPU and GPU Computation to Detect Lung Nodule in Computed Tomography Images","I. W. B. Sentana; N. Jawas; A. E. Wardani","Department of Information, Systems Bali State Polytechnic, J1. Raya Bukit Jimbaran, Badung, Bali, Indonesia; Department of Computer, System STMIK STIKOM, Bali Jalan Raya Puputan No. 86, Renon, Denpasar, Indonesia; Radiology Unit, Airlangga university, Hospital Jalan Mayjen Dr. Moestopo No. 6–8, Surabaya, Indonesia","2018 Third International Conference on Informatics and Computing (ICIC)","1 Aug 2019","2018","","","1","6","Lung Nodule is a white patch on the thorax medical image, usually used as an early marker of lung cancer. Although there were some research deals with lung nodule detection, but none of those researches tailoring Graphical Processing Unit (GPU) to assist the computing process. This research aims to produce algorithms that can detect lung nodules automatically in CT images, by utilizing a combination of hybrid computing between Central Processing Unit (CPU) and Graphical Processing Unit. The framework used is Compute Unified Device Architecture, which consists of platform and programming model. The algorithm consists of several steps: read dicom and data normalization, lung segmentation, candidate nodule extraction, and classification. Normalization is required to facilitate calculation by changing the data type ui16 to ui8. Furthermore, segmentation is used to separate the lung parts with other organs, where at this stage the Otsu Algorithm and Moore Neighborhood Tracing (MNT) are used. The next step is Lung Nodule Extraction, which aims to find the nodule candidate. The last step is a classification that utilizes the Support Vector Machine (SVM) to distinguish which one is nodule or not. The algorithm successfully detects near round nodules that are free-standing or not attached to other parts of organs. After undergoing ground truth tests, it was found that under some conditions, the algorithm has not been able to distinguish nodules and other strokes that resemble nodules. While in terms of computing speed is found a very surprising result because overall single CPU computing provides better results compared to hybrid CPU and GPU computing.","","978-1-5386-6921-1","10.1109/IAC.2018.8780573","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8780573","Lung Nodule;Hybrid Computing;GPU and CPU;CT images","Lung;Graphics processing units;Support vector machines;Computed tomography;Central Processing Unit;Kernel;Classification algorithms","cancer;computerised tomography;image segmentation;lung;medical image processing;support vector machines","compute unified device architecture;Otsu algorithm;graphical processing unit;central processing unit;hybrid CPU computing;lung nodule extraction;hybrid computing;CT images;lung nodules;computing process;lung nodule detection;lung cancer;thorax medical image;computed tomography;GPU computation;GPU computing;round nodules;lung segmentation;data normalization","","1","","18","","1 Aug 2019","","","IEEE","IEEE Conferences"
"GPU-Accelerated High-Throughput Online Stream Data Processing","Z. Chen; J. Xu; J. Tang; K. A. Kwiat; C. A. Kamhoua; C. Wang","Department of Electrical Engineering and Computer Science, Syracuse University, Syracuse, NY; Department of Electrical Engineering and Computer Science, Syracuse University, Syracuse, NY; Department of Electrical Engineering and Computer Science, Syracuse University, Syracuse, NY; US Air Force Research Lab (AFRL), Rome, NY; US Air Force Research Lab (AFRL), Rome, NY; InterDigital, Inc, King of Prussia, PA","IEEE Transactions on Big Data","1 Jun 2018","2018","4","2","191","202","The Single Instruction Multiple Data (SIMD) architecture of Graphic Processing Units (GPUs) makes them perfect for parallel processing of big data. In this paper, we present the design, implementation and evaluation of G-Storm, a GPU-enabled parallel system based on Storm, which harnesses the massively parallel computing power of GPUs for high-throughput online stream data processing. G-Storm has the following desirable features: 1) G-Storm is designed to be a general data processing platform as Storm, which can handle various applications and data types. 2) G-Storm exposes GPUs to Storm applications while preserving its easy-to-use programming model. 3) G-Storm achieves high-throughput and low-overhead data processing with GPUs. 4) G-Storm accelerates data processing further by enabling Direct Data Transfer (DDT), between two executors that process data at a common GPU. We implemented G-Storm based on Storm 0.9.2 and tested it using three different applications, including continuous query, matrix multiplication and image resizing. Extensive experimental results show that 1) Compared to Storm, G-Storm achieves over 7χ improvement on throughput for continuous query, while maintaining reasonable average tuple processing time. It also leads to 2.3χ and 1.3χ throughput improvements on the other two applications, respectively. 2) DDT significantly reduces data processing time.","2332-7790","","10.1109/TBDATA.2016.2616116","Air Force Office of Scientific Research(grant numbers:FA9550-16-1-0077); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7587437","Stream data processing;GPU;parallel computing;big data infrastructure","Graphics processing units;Storms;Fasteners;Programming;Computer architecture;Big data","Big Data;graphics processing units;matrix multiplication;parallel architectures;query processing","low-overhead data processing;parallel processing;big data;image resizing;matrix multiplication;continuous query;easy-to-use programming;GPU-enabled parallel system;G-Storm;storm applications;direct data transfer;tuple processing time;online stream data processing;GPU-accelerated high-throughput;parallel computing;graphic processing units;single instruction multiple data architecture","","7","","37","IEEE","10 Oct 2016","","","IEEE","IEEE Journals"
"Poster: GPU Accelerated Ultrasonic Tomography Using Propagation and Backpropagation Method","P. D. Bello; Y. Jin; E. Lu",NA; NA; NA,"2012 SC Companion: High Performance Computing, Networking Storage and Analysis","11 Apr 2013","2012","","","1447","1447","This paper develops implementation strategy and method to accelerate the propagation and backpropagation (PBP) tomographic imaging algorithm using Graphic Processing Units (GPUs). The Compute Unified Device Architecture (CUDA) programming model is used to develop our parallelized algorithm since the CUDA model allows the user to interact with the GPU resources more efficiently than traditional shader methods. The results show an improvement of more than 80x when compared to the C/C++ version of the algorithm, and 515x when compared to the MATLAB version while achieving high quality imaging for both cases. We test different CUDA kernel configurations in order to measure changes in the processing-time of our algorithm. By examining the acceleration rate and the image quality, we develop an optimal kernel configuration that maximizes the throughput of CUDA implementation for the PBP method.","","978-0-7695-4956-9","10.1109/SC.Companion.2012.249","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6496032","Medical Imaging;Ultrasonic Tomography;GPU;CUDA;Parallel Computing","","","","","","","","","11 Apr 2013","","","IEEE","IEEE Conferences"
"A Compute Unified System Architecture for Graphics Clusters Incorporating Data Locality","C. Muller; S. Frey; M. Strengert; C. Dachsbacher; T. Ertl",Visualisierungsinstitut der Universität Stuttgart; Visualisierungsinstitut der Universität Stuttgart; Visualisierungsinstitut der Universität Stuttgart; Visualisierungsinstitut der Universität Stuttgart; Visualisierungsinstitut der Universität Stuttgart,"IEEE Transactions on Visualization and Computer Graphics","12 May 2009","2009","15","4","605","617","We present a development environment for distributed GPU computing targeted for multi-GPU systems, as well as graphics clusters. Our system is based on CUDA and logically extends its parallel programming model for graphics processors to higher levels of parallelism, namely, the PCI bus and network interconnects. While the extended API mimics the full function set of current graphics hardware-including the concept of global memory-on all distribution layers, the underlying communication mechanisms are handled transparently for the application developer. To allow for high scalability, in particular for network-interconnected environments, we introduce an automatic GPU-accelerated scheduling mechanism that is aware of data locality. This way, the overall amount of transmitted data can be heavily reduced, which leads to better GPU utilization and faster execution. We evaluate the performance and scalability of our system for bus and especially network-level parallelism on typical multi-GPU systems and graphics clusters.","1941-0506","","10.1109/TVCG.2008.188","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4653488","GPU computing;graphics clusters;parallel programming.;Distributed/network graphics;Graphics Systems;Computer Graphics;Computing Methodologies;Concurrent Programming;Programming Techniques;Software/Software Engineering;Concurrent;distributed;and parallel languages;Language Classifications;Programming Languages Software;Graphics processors;Hardware Architecture;Computing Methodologies","Computer architecture;Graphics;Parallel processing;Concurrent computing;Distributed computing;Hardware;Parallel programming;Scalability;Power generation;Rendering (computer graphics)","computer graphics;coprocessors;parallel programming","compute unified system architecture;graphics clusters;data locality;distributed GPU computing;multi-GPU systems;parallel programming model;graphics processors;PCI bus;network interconnects;graphics hardware;communication mechanism;network-interconnected environment;automatic GPU-accelerated scheduling;GPU utilization;network-level parallelism","","17","","23","","17 Oct 2008","","","IEEE","IEEE Journals"
"Exploring Compiler Optimization Opportunities for the OpenMP 4.× Accelerator Model on a POWER8+GPU Platform","A. Hayashi; J. Shirako; E. Tiotto; R. Ho; V. Sarkar",NA; NA; NA; NA; NA,"2016 Third Workshop on Accelerator Programming Using Directives (WACCPD)","2 Feb 2017","2016","","","68","78","While GPUs are increasingly popular for high-performance computing, optimizing the performance of GPU programs is a time-consuming and non-trivial process in general. This complexity stems from the low abstraction level of standard GPU programming models such as CUDA and OpenCL: programmers are required to orchestrate low-level operations in order to exploit the full capability of GPUs. In terms of software productivity and portability, a more attractive approach would be to facilitate GPU programming by providing high-level abstractions for expressing parallel algorithms.OpenMP is a directive-based shared memory parallel programming model and has been widely used for many years. From OpenMP 4.0 onwards, GPU platforms are supported by extending OpenMP's high-level parallel abstractions with accelerator programming. This extension allows programmers to write GPU programs in standard C/C++ or Fortran languages, without exposing too many details of GPU architectures.However, such high-level parallel programming strategies generally impose additional program optimizations on compilers, which could result in lower performance than fully hand-tuned code with low-level programming models. To study potential performance improvements by compiling and optimizing high-level GPU programs, in this paper, we 1) evaluate a set of OpenMP 4.× benchmarks on an IBM POWER8 and NVIDIA Tesla GPU platform and 2) conduct a comparable performance analysis among hand-written CUDA and automatically-generated GPU programs by the IBM XL and clang/LLVM compilers.","","978-1-5090-6152-5","10.1109/WACCPD.2016.011","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7836582","Parallel programming","Graphics processing units;Optimization;Kernel;Instruction sets;Programming;Performance evaluation","C++ language;FORTRAN;graphics processing units;optimisation;parallel algorithms;parallel architectures;parallel programming;program compilers;shared memory systems;software portability","clang/LLVM compilers;IBM XL compilers;NVIDIA Tesla GPU platform;IBM POWER8 platform;FORTRAN languages;C/C++ languages;accelerator programming;directive-based shared memory parallel programming;parallel algorithms;high-level abstractions;software portability;software productivity;OpenCL;CUDA;GPU programming models;high-performance computing;POWER8+GPU platform;OpenMP 4.x accelerator model;compiler optimization","","4","1","26","","2 Feb 2017","","","IEEE","IEEE Conferences"
"GPu-based framework for interactive visualization of SAR data","M. Lambers; A. Kolb; H. Nies; M. Kalkuhl","Institute for Vision and Graphics, University of Siegen, Germany; Institute for Vision and Graphics, University of Siegen, Germany; Center for Sensorsystems (ZESS), University of Siegen, Germany; Department of Simulation, University of Siegen, Germany","2007 IEEE International Geoscience and Remote Sensing Symposium","7 Jan 2008","2007","","","4076","4079","Synthetic aperture radar data presents specific problems for interactive visualization. The high amount of multiplicative speckle noise has to be reduced. The high dynamic range of the amplitude data must be mapped to the lower dynamic range of display devices in a way that makes image features appropriately visible. In addition to interactive navigation in the data, it is desirable to allow interactive selection of despeckling and dynamic range reduction methods and adjustment of their parameters. Graphics processing units (GPUs) can be seen as ubiquitous parallel coprocessors with extreme computational power. In this paper, we propose a GPU-based framework for interactive visualization of SAR data. Data management techniques are used to make full use of the GPU. We reworked well-known despeckling and dynamic range reduction techniques for the GPU programming model and implemented them in our framework. Both navigation in large data sets and adjustment of processing parameters are fully interactive.","2153-7003","978-1-4244-1211-2","10.1109/IGARSS.2007.4423745","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4423745","","Data visualization;Dynamic range;Navigation;Speckle;Noise reduction;Displays;Graphics;Coprocessors;Concurrent computing;Pervasive computing","coprocessors;data visualisation;geophysical signal processing;image denoising;interactive systems;radar signal processing;speckle;synthetic aperture radar","GPU based framework;interactive SAR data visualization;synthetic aperture radar;multiplicative speckle noise reduction;interactive despeckling selection;dynamic range reduction;graphics processing unit;parallel coprocessors;data management techniques;GPU programming model;large dataset navigation;processing parameter adjustment","","4","1","8","","7 Jan 2008","","","IEEE","IEEE Conferences"
"A Dynamically Balanced OpenMP-CUDA Implementation of PDE-Based Contrast Source Inversion for Microwave Imaging","N. Geddert; I. Jeffrey","Department of Electrical and Computer Engineering, University of Manitoba, Winnipeg, Canada; Department of Electrical and Computer Engineering, University of Manitoba, Winnipeg, Canada","2018 18th International Symposium on Antenna Technology and Applied Electromagnetics (ANTEM)","13 Dec 2018","2018","","","1","2","An implementation of a PDE-based Contrast Source Inversion (CSI) algorithm using a hybrid Open MP-CUDA parallel programming model is presented for the acceleration of microwave imaging. The CSI algorithm uses a time-harmonic discontinuous Galerkin method forward solver. The programming model ensures high computational throughput by dynamically balancing the amount of work performed on the GPU and CPU. The resulting implementation is capable of substantial speed-up, bringing the computational performance to near real-time. Implementation and optimization details are discussed; results show GPU acceleration alone gives a speedup of at least 5 times.","2473-3555","978-1-5386-1338-2","10.1109/ANTEM.2018.8572994","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8572994","Graphics processing unit (GPU);Open MP;hybrid parallel programming;contrast source inversion;microwave imaging","Graphics processing units;Acceleration;Programming;Computational modeling;Magnetic resonance imaging;Magnetic domains","Galerkin method;graphics processing units;Maxwell equations;microwave imaging;parallel architectures;parallel programming","microwave imaging;CSI algorithm;time-harmonic discontinuous Galerkin method;high computational throughput;computational performance;GPU acceleration;dynamically balanced OpenMP-CUDA implementation;PDE-based Contrast Source Inversion algorithm;hybrid Open MP-CUDA parallel programming model","","1","","9","","13 Dec 2018","","","IEEE","IEEE Conferences"
"Using graphics devices in reverse: GPU-based Image Processing and Computer Vision","J. Fung; S. Mann","NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, California, USA; University of Toronto, Dept. of Electrical and Computer Engineering, 10 King's College Road, Mailstop. B540, Ontario, Canada","2008 IEEE International Conference on Multimedia and Expo","26 Aug 2008","2008","","","9","12","Graphics and vision are approximate inverses of each other: ordinarily graphics processing units (GPUs) are used to convert ldquonumbers into picturesrdquo (i.e. computer graphics). In this paper, we discuss the use of GPUs in approximately the reverse way: to assist in ldquoconverting pictures into numbersrdquo (i.e. computer vision). For graphical operations, GPUs currently provide many hundreds of gigaflops of processing power. This paper discusses how this processing power is being harnessed for image processing and computer vision, thereby providing dramatic speedups on commodity, readily available graphics hardware. A brief review of algorithms mapped to the GPU by using the graphics API for vision is presented. The NVIDIA CUDA programming model is then introduced as a way of expressing program parallelism without the need for graphics expertise.","1945-788X","978-1-4244-2570-9","10.1109/ICME.2008.4607358","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4607358","GPU;Graphics Processing Unit;Computer Vision;Image Processing","Graphics;Hardware;Computer architecture;Computer vision;Programming;Acceleration;Pattern recognition","application program interfaces;computer graphics;computer vision;coprocessors;image processing equipment","computer vision;graphics processing units;computer graphics;graphics API;NVIDIA CUDA programming model;program parallelism;GPU-based image processing","","49","","32","","26 Aug 2008","","","IEEE","IEEE Conferences"
"Parallel AMG solver for three dimensional unstructured grids using GPU","K. R. Tej; N. Sivadasan; V. Sharma; R. Banerjee","Dept. of Computer Science and Engineering, Indian Institute of Technology Hyderabad, Hyderabad, India; Dept. of Computer Science and Engineering, Indian Institute of Technology Hyderabad, Hyderabad, India; Dept. of Mechanical Engineering, Indian Institute of Technology Hyderabad, Hyderabad, India; Dept. of Mechanical Engineering, Indian Institute of Technology Hyderabad, Hyderabad, India","2014 21st International Conference on High Performance Computing (HiPC)","4 Jun 2015","2014","","","1","10","Graphics Processing Units (GPUs) have evolved over the years from being graphics accelerator to scalable coprocessor. We implement an algebraic multigrid solver for three dimensional unstructured grids using GPU. Such a solver has extensive applications in Computational Fluid Dynamics (CFD). Using a combination of vertex coloring, optimized memory representations, multi-grid and improved coarsening techniques, we obtain considerable speedup in our parallel implementation. Our solver provides significant acceleration for solving pressure Poisson equations, which is the most time consuming part while solving Navier-Stokes equations. In our experimental study, we solve pressure Poisson equations for flow over lid driven cavity and for laminar flow past square cylinder. Our implementation achieves 915 times speed up for the lid driven cavity problem on a grid of size 2.6 million and a speed up of 1020 times for the laminar flow past square cylinder problem on a grid of size 1.7 million, compared to serial non-multigrid implementations. For our implementation, we used NVIDIA's CUDA programming model.","1094-7256","978-1-4799-5976-1","10.1109/HiPC.2014.7116899","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7116899","GPU Computing;Computational Fluid Dynamics;Multigrid Flow Solver;Gauss-Seidel;Navier-Stokes","Graphics processing units;Image color analysis;Instruction sets;Smoothing methods;Kernel;Mathematical model;Computational fluid dynamics","computational fluid dynamics;external flows;graphics processing units;laminar flow;Navier-Stokes equations;parallel architectures;parallel programming;Poisson equation","parallel AMG solver;three-dimensional unstructured grids;GPU;graphics processing units;graphics accelerator;scalable co-processor;algebraic multigrid solver;computational fluid dynamics;CFD;vertex coloring;optimized memory representations;improved coarsening techniques;parallel implementation;pressure Poisson equations;Navier-Stokes equations;laminar flow;lid driven cavity problem;square cylinder problem;NVIDIA CUDA programming model","","1","","37","","4 Jun 2015","","","IEEE","IEEE Conferences"
"Evaluation of GPU Architectures Using Spiking Neural Networks","V. K. Pallipuram; M. A. Bhuiyan; M. C. Smith","Dept. of Electr. & Comput. Eng., Clemson Univ., Clemson, SC, USA; Dept. of Electr. & Comput. Eng., Clemson Univ., Clemson, SC, USA; Dept. of Electr. & Comput. Eng., Clemson Univ., Clemson, SC, USA","2011 Symposium on Application Accelerators in High-Performance Computing","29 Sep 2011","2011","","","93","102","During recent years General-Purpose Graphical Processing Units (GP-GPUs) have entered the field of High-Performance Computing (HPC) as one of the primary architectural focuses for many research groups working with complex scientific applications. Nvidia's Tesla C2050, codenamed Fermi, and AMD's Radeon 5870 are two devices positioned to meet the computationally demanding needs of supercomputing research groups across the globe. Though Nvidia GPUs powered by CUDA have been the frequent choices of the performance centric research groups, the introduction and growth of OpenCL has promoted AMD GP-GPUs as potential accelerator candidates that can challenge Nvidia's stronghold. These architectures not only offer a plethora of features for application developers to explore, but their radically different architectures calls for a detailed study that weighs their merits and evaluates their potential to accelerate complex scientific applications. In this paper, we present our performance analysis research comparing Nvidia's Fermi and AMD's Radeon 5870 using OpenCL as the common programming model. We have chosen four different neuron models for Spiking Neural Networks (SNNs), each with different communication and computation requirements, namely the Izhikevich, Wilson, Morris Lecar (ML), and the Hodgkin Huxley (HH) models. We compare the runtime performance of the Fermi and Radeon GPUs with an implementation that exhausts all optimization techniques available with OpenCL. Several equivalent architectural parameters of the two GPUs are studied and correlated with the application performance. In addition to the comparative study effort, our implementations were able to achieve a speed-up of 857.3x and 658.51x on the Fermi and Radeon architectures respectively for the most compute intensive HH model with a dense network containing 9.72 million neurons. The final outcome of this research is a detailed architectural comparison of the two GPU architectures with a common programming platform.","2166-515X","978-1-4577-0635-6","10.1109/SAAHPC.2011.20","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6031572","Fermi;AMD;OpenCL;GPU Architecture Comparison;Profiler Counters;SNNs;speed-up","Graphics processing unit;Computer architecture;Neurons;Computational modeling;Mathematical model;Optimization;Firing","computer graphic equipment;coprocessors;neural nets","GPU architectures;spiking neural networks;general-purpose graphical processing units;high-performance computing;Nvidia Tesla C2050;Fermi;AMD Radeon 5870;supercomputing research groups;CUDA;performance centric research groups;OpenCL;application developers;programming model;Morris Lecar models;Hodgkin Huxley models;optimization techniques","","5","","27","","29 Sep 2011","","","IEEE","IEEE Conferences"
"CUKNN: A parallel implementation of K-nearest neighbor on CUDA-enabled GPU","Shenshen Liang; Cheng Wang; Ying Liu; Liheng Jian","Graduate University of Chinese Academy of Sciences, Beijing, China 100190; Agilent Technologies Co. Ltd., Beijing, China 100102; Graduate University of Chinese Academy of Sciences, Beijing, China 100190; Graduate University of Chinese Academy of Sciences, Beijing, China 100190","2009 IEEE Youth Conference on Information, Computing and Telecommunication","15 Jan 2010","2009","","","415","418","Recent development in Graphics Processing Units (GPUs) has enabled inexpensive high performance computing for general-purpose applications. Due to GPU's tremendous computing capability, it has emerged as the co-processor of the CPU to achieve a high overall throughput. CUDA programming model provides the programmers adequate C language like APIs to better exploit the parallel power of the GPU. K-nearest neighbor is a widely used classification technique and has significant applications in various domains. The computational-intensive nature of KNN requires a high performance implementation. In this paper, we present a CUDA-based parallel implementation of KNN, CUKNN, using CUDA multi-thread model. Various CUDA optimization techniques are applied to maximize the utilization of the GPU. CUKNN outperforms significantly and achieve up to 15.2X speedup. It also shows good scalability when varying the dimension of the training dataset and the number of records in training dataset.","","978-1-4244-5074-9","10.1109/YCICT.2009.5382329","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5382329","KNN;classification;CUDA;parallel computing","High performance computing;Graphics;Coprocessors;Central Processing Unit;Throughput;Parallel programming;Programming profession;Scalability","C language;computer graphics;coprocessors;multi-threading;parallel architectures","CUDA-enabled GPU;graphics processing units;C language;CUDA multi-thread model;k-nearest neighbor parallel implementation;coprocessor;compute unified device architecture;high performance computing","","8","","6","","15 Jan 2010","","","IEEE","IEEE Conferences"
"GPU Accelerated Krylov Subspace Methods for Computational Electromagnetics","S. Velamparambil; S. MacKinnon-Cormier; J. Perry; R. Lemos; M. Okoniewski; J. Leon","Acceleware Corporation, 1600 37th St. SW, Calgary, Alberta-T3E 3P1, Canada. sanjay.velamparambil@acceleware.com; Acceleware Corporation, 1600 37th St. SW, Calgary, Alberta-T3E 3P1, Canada; Acceleware Corporation, 1600 37th St. SW, Calgary, Alberta-T3E 3P1, Canada; Acceleware Corporation, 1600 37th St. SW, Calgary, Alberta-T3E 3P1, Canada; Dept. Elect. & Comp. Engg., University of Calgary, Calgary, Canada. michal.okoniewski@acceleware.com; Faculty of Engineering, Dalhousie University, Halifax, Canada. Joshua.Leon@dal.ca","2008 38th European Microwave Conference","19 Jan 2009","2008","","","1312","1314","Programmable graphics processor units (GPU), such as the NVIDIAR Geforce 8800 series, offer a raw computing power that is often an order of magnitude larger than even the most modern multicore CPUs, making them a relatively inexpensive platform for high performance computing. In this paper, we report the development of two Krylov subspace solvers, the generalized minimal residual (GMRES) and the quasi-minimal residual (QMR) algorithms, on the GPU using the NVIDIA CUDAR programming model. The algorithms have been implemented as a stand-alone library. We report a speed-up of up to 13 times, on a single GPU, in our preliminary experiments with the classic problem of computing the capacitance of conductors using an integral equation method.","","978-2-87487-006-4","10.1109/EUMC.2008.4751704","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4751704","","Acceleration;Computational electromagnetics;Integral equations;Computer interfaces;Graphics;High performance computing;Multicore processing;Libraries;Concurrent computing;Kernel","capacitance;computational electromagnetics;computer graphics;integral equations","programmable graphics processor units;Krylov subspace methods;computational electromagnetics;NVIDIA Geforce 8800 series;generalized minimal residual algorithm;quasiminimal residual algorithm;stand-alone library;single GPU;integral equation;capacitance;conductors;high performance computing;multicore CPUs","","6","","7","","19 Jan 2009","","","IEEE","IEEE Conferences"
"DDGSim: GPU based simulator for large multicore with bufferless NoC","N. Kumar; A. Sahu","Deptt. of Comp. Sc. and Engg., Indian Institute of Technology Guwahati, Assam, India, 781039; Deptt. of Comp. Sc. and Engg., Indian Institute of Technology Guwahati, Assam, India, 781039","2014 Annual IEEE India Conference (INDICON)","5 Feb 2015","2014","","","1","6","In large scale chip multicore, last level cache management and core interconnection network play important roles in performance and power consumption. And in large scale chip multicore, mesh interconnect is used widely due to scalability and simplicity of design. As interconnection network occupied significant area and consumes significant percent of system power, bufferless network is an appealing alternative design to reduce power consumption and hardware cost. We have designed and implemented a simulator for simulation of distributed cache management of large chip multicore where cores are connected using bufferless interconnection network. Also, we have redesigned and implemented the DDGSim, which is a GPU compatible parallel version of the same simulator using CUDA programming model. We have simulated target large chip multicore with up to 43,000 cores and achieved up to 25 times speedup on NVIDIA GeForce GTX 690 GPU over serial simulation.","2325-9418","978-1-4799-5364-6","10.1109/INDICON.2014.7030460","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7030460","","Multicore processing;Graphics processing units;Ports (Computers);Instruction sets;Kernel;Routing;Radiation detectors","cache storage;digital simulation;multiprocessing systems;network-on-chip;parallel architectures","DDGSim;GPU based simulator;bufferless NoC;distributed cache management;bufferless interconnection network;CUDA programming model;NVIDIA GeForce GTX 690 GPU;large scale chip multicore;LCMP","","","","35","","5 Feb 2015","","","IEEE","IEEE Conferences"
"Analyzing CUDA workloads using a detailed GPU simulator","A. Bakhoda; G. L. Yuan; W. W. L. Fung; H. Wong; T. M. Aamodt","University of British Columbia, Vancouver, Canada; University of British Columbia, Vancouver, Canada; University of British Columbia, Vancouver, Canada; University of British Columbia, Vancouver, Canada; University of British Columbia, Vancouver, Canada","2009 IEEE International Symposium on Performance Analysis of Systems and Software","12 May 2009","2009","","","163","174","Modern graphic processing units (GPUs) provide sufficiently flexible programming models that understanding their performance can provide insight in designing tomorrow's manycore processors, whether those are GPUs or otherwise. The combination of multiple, multithreaded, SIMD cores makes studying these GPUs useful in understanding tradeoffs among memory, data, and thread level parallelism. While modern GPUs offer orders of magnitude more raw computing power than contemporary CPUs, many important applications, even those with abundant data level parallelism, do not achieve peak performance. This paper characterizes several non-graphics applications written in NVIDIA's CUDA programming model by running them on a novel detailed microarchitecture performance simulator that runs NVIDIA's parallel thread execution (PTX) virtual instruction set. For this study, we selected twelve non-trivial CUDA applications demonstrating varying levels of performance improvement on GPU hardware (versus a CPU-only sequential version of the application). We study the performance of these applications on our GPU performance simulator with configurations comparable to contemporary high-end graphics cards. We characterize the performance impact of several microarchitecture design choices including choice of interconnect topology, use of caches, design of memory controller, parallel workload distribution mechanisms, and memory request coalescing hardware. Two observations we make are (1) that for the applications we study, performance is more sensitive to interconnect bisection bandwidth rather than latency, and (2) that, for some applications, running fewer threads concurrently than on-chip resources might otherwise allow can improve performance by reducing contention in the memory system.","","978-1-4244-4184-6","10.1109/ISPASS.2009.4919648","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4919648","","Analytical models;Yarn;Graphics;Parallel processing;Microarchitecture;Hardware;Process design;Concurrent computing;Parallel programming;Computational modeling","cache storage;computer graphic equipment;instruction sets;multiprocessing systems;multi-threading;parallel architectures","CUDA workload;GPU simulator;graphic processing unit;flexible programming model;CUDA programming;microarchitecture performance simulator;parallel thread execution;virtual instruction set;GPU hardware;high-end graphics card;microarchitecture design;interconnect topology;caches;memory controller;parallel workload distribution;memory request coalescing hardware","","890","4","46","","12 May 2009","","","IEEE","IEEE Conferences"
"SMGuard: A Flexible and Fine-Grained Resource Management Framework for GPUs","C. Yu; Y. Bai; H. Yang; K. Cheng; Y. Gu; Z. Luan; D. Qian","Sino-German Joint Software Institute, School of Computer Science, Beihang University, Beijing, China; Sino-German Joint Software Institute, School of Computer Science, Beihang University, Beijing, China; Sino-German Joint Software Institute, School of Computer Science, Beihang University, Beijing, China; Sino-German Joint Software Institute, School of Computer Science, Beihang University, Beijing, China; Sino-German Joint Software Institute, School of Computer Science, Beihang University, Beijing, China; Sino-German Joint Software Institute, School of Computer Science, Beihang University, Beijing, China; Sino-German Joint Software Institute, School of Computer Science, Beihang University, Beijing, China","IEEE Transactions on Parallel and Distributed Systems","11 Nov 2018","2018","29","12","2849","2862","GPUs have been becoming an indispensable computing platform in data centers, and co-locating multiple applications on the same GPU is widely used to improve resource utilization. However, performance interference due to uncontrolled resource contention severely degrades the performance of co-locating applications and fails to deliver satisfactory user experience. In this paper, we present SMGuard, a software approach to flexibly manage the GPU resource usage of multiple applications under co-location. We also propose a capacity based GPU resource model CapSM, which provisions the GPU resources in a fine-grained granularity among co-locating applications. When co-locating latency-sensitive applications with batch applications, SMGuard can prevent batch applications from occupying resources without constraint using quota based mechanism, and guarantee the resource usage of latency-sensitive applications with reservation based mechanism. In addition, SMGuard supports dynamic resource adjustment through evicting the running thread blocks of batch applications to release the occupied resources and remapping the uncompleted thread blocks to the remaining resources, which avoids the relaunch of the preempted kernel. The SMGuard is a pure software solution that does not rely on special GPU hardware or programming model, which is easy to adopt on commodity GPUs in data centers. Our evaluation shows that SMGuard improves the average performance of latency-sensitive applications by 9.8× when co-located with batch applications. In the meanwhile, the GPU utilization can be improved by 35 percent on average.","1558-2183","","10.1109/TPDS.2018.2848621","National Key Research and Development Program of China(grant numbers:2016YFB1000503); National Science Foundation of China(grant numbers:61572062,61502019); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8388218","GPU;parallel computing;resource management;application co-location","Graphics processing units;Task analysis;Instruction sets;Resource management;Quality of service;Data centers","computer centres;graphics processing units;resource allocation","SMGuard;data centers;co-locating multiple applications;resource utilization;uncontrolled resource contention;GPU resource usage;GPU resource model CapSM;fine-grained granularity;latency-sensitive applications;batch applications;quota based mechanism;reservation based mechanism;dynamic resource adjustment;programming model;GPU utilization;flexible resource management framework;fine-grained resource management framework;performance interference","","4","","42","IEEE","19 Jun 2018","","","IEEE","IEEE Journals"
"LU, QR, and Cholesky factorizations: Programming model, performance analysis and optimization techniques for the Intel Knights Landing Xeon Phi","A. Haidar; S. Tomov; K. Arturov; M. Guney; S. Story; J. Dongarra","University of Tennessee, Knoxville, 37916, USA; University of Tennessee, Knoxville, 37916, USA; Intel Corporation, Novosibirsk, Russia; Intel Corporation, Hillsboro, OR 97124, USA; Intel Corporation, Hillsboro, OR 97124, USA; University of Tennessee, Knoxville, Oak Ridge National Laboratory, USA","2016 IEEE High Performance Extreme Computing Conference (HPEC)","1 Dec 2016","2016","","","1","7","A wide variety of heterogeneous compute resources, ranging from multicore CPUs to GPUs and coprocessors, are available to modern computers, making it challenging to design unified numerical libraries that efficiently and productively use all these varied resources. For example, in order to efficiently use Intel's Knights Landing (KNL) processor, the next-generation of Xeon Phi architectures, one must design and schedule an application in multiple degrees of parallelism and task grain sizes in order to obtain efficient performance. We propose a productive and portable programming model that allows us to write a serial-looking code, which, however, achieves parallelism and scalability by using a lightweight runtime environment to manage the resource-specific workload, and to control the dataflow and the parallel execution. This is done through multiple techniques ranging from multi-level data partitioning to adaptive task grain sizes, and dynamic task scheduling. In addition, our task abstractions enable unified algorithmic development across all the heterogeneous resources. Finally, we outline the strengths and the effectiveness of this approach - especially in regards to hardware trends and ease of programming high-performance numerical software that current applications need - in order to motivate current work and future directions for the next generation of parallel programming models for high-performance linear algebra libraries on heterogeneous systems.","","978-1-5090-3525-0","10.1109/HPEC.2016.7761591","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7761591","","Hardware;Programming;Libraries;Multicore processing;Parallel processing;Software","data flow computing;data handling;graphics processing units;linear algebra;mathematics computing;multiprocessing systems;parallel programming;processor scheduling;software libraries","LU factorization;QR factorization;Cholesky factorization;performance analysis;optimization technique;Intel Knights Landing Xeon Phi;heterogeneous compute resources;multicore CPU;GPU;coprocessors;unified numerical libraries;Intel KNL processor;Xeon Phi architecture;productive portable programming model;serial-looking code;scalability;lightweight runtime environment;resource-specific workload management;dataflow control;parallel execution;multilevel data partitioning;adaptive task grain size;dynamic task scheduling;task abstraction;unified algorithmic development;high-performance numerical software programming;parallel programming model;high-performance linear algebra libraries;heterogeneous systems","","7","","24","","1 Dec 2016","","","IEEE","IEEE Conferences"
"Designing a Profiling and Visualization Tool for Scalable and In-depth Analysis of High-Performance GPU Clusters","P. Kousha; B. Ramesh; K. Kandadi Suresh; C. Chu; A. Jain; N. Sarkauskas; H. Subramoni; D. K. Panda",The Ohio State University; The Ohio State University; The Ohio State University; The Ohio State University; The Ohio State University; The Ohio State University; The Ohio State University; The Ohio State University,"2019 IEEE 26th International Conference on High Performance Computing, Data, and Analytics (HiPC)","13 Feb 2020","2019","","","93","102","The recent advent of advanced fabrics like NVIDIA NVLink is enabling the deployment of dense Graphics Processing Unit (GPU) systems, e.g., DGX-2 and Summit. The Message Passing Interface (MPI) has been the dominant programming model to design distributed applications on such clusters. The MPI Tools Interface (MPI_T) provides an opportunity for performance tools and external software to introspect and understand MPI runtime behavior at a deeper level to detect performance and scalability issues. However, the lack of low-overhead and scalable monitoring tools have thus far prevented a comprehensive study of efficiency and utilization of high-performance interconnects such as NVLinks on high-performance GPU-enabled clusters. In this paper, we address this deficiency by proposing and designing an in-depth, real-time analysis, profiling, and visualization tool for high-performance GPU-enabled clusters with NVLinks. The proposed tool builds on the top of the OSU InfiniBand Network Analysis and Monitoring Tool (INAM). It provides insights into the efficiency of different communication patterns by examining the utilization of underlying GPU interconnects. The contributions of the proposed tool are two-fold: 1) domain scientists and system administrators can understand how applications and runtime libraries interact with underlying high-performance interconnects, and 2)Proposed tool enables designers of high-performance communication libraries to gain low-level knowledge to optimize existing designs and develop new algorithms to optimally utilize cutting-edge interconnects on GPU clusters. To the best of our knowledge, this is the first such tool which is capable of presenting a unified and holistic view of MPI-level and fabric level information for emerging NVLink-enabled high-performance GPU clusters.","2640-0316","978-1-7281-4535-8","10.1109/HiPC.2019.00022","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8990500","MPI;MPI_T;NVLINK;GPU;Profiling","Graphics processing units;Tools;Libraries;Measurement;Fabrics;Topology;Bandwidth","application program interfaces;data visualisation;graphics processing units;message passing;parallel processing;software libraries","visualization tool;high-performance interconnects;high-performance communication libraries;MPI-level;NVLink-enabled high-performance GPU clusters;in-depth analysis;message passing interface;performance tools;MPI runtime behavior;scalable monitoring tools;NVIDIA NVLink;graphics processing unit;MPI tools interface;low-overhead tools;infiniband network analysis and monitoring tool;cutting-edge interconnects;fabric level information;runtime libraries","","6","","30","","13 Feb 2020","","","IEEE","IEEE Conferences"
"Code Complexity versus Performance for GPU-accelerated Scientific Applications","A. W. U. Munipala; S. V. Moore","University of Texas at El Paso, TX, USA; Oak Ridge Nat. Lab., Oak Ridge, TN, USA","2016 Fourth International Workshop on Software Engineering for High Performance Computing in Computational Science and Engineering (SE-HPCCSE)","2 Feb 2017","2016","","","50","50","Summary form only given. Graphics Processing Units (GPUs) are becoming widely used as parallel accelerators in high-performance computing. GPU programming until recently, has been done by using low-level programming models such as CUDA and OpenCL. The directive-based OpenACC programming model has been growing in popularity due to its higher level of abstraction. This technique, which uses “directive” or “pragma” statements to annotate source code written in traditional high-level languages such as Fortran, C, and C++, is intended to allow a single code base to work across multiple computational platforms. We attempt to compare code complexity and performance of CUDA, OpenCL, and OpenACC implementations for three benchmark codes - the Game of Life (GOL) example code, the LULESH hydrodynamics proxy application, and the CloverLeaf mini-app from the Mantevo suite For the GOL C, CUDA C, and OpenCL codes and the LULESH C++, CUDA, and OpenCL codes, we measured source lines of code (SLOC) and cyclomatic complexity using the Oxbow toolkit static analysis tools. We ran the commercial McCabe IQ tool on the CloverLeaf Fortran90, Fortran90 + OpenACC, and Fortran portion of CloverLeaf_CUDA to measure cyclomatic complexity, design complexity, and essential complexity. We found that the CUDA and OpenCL implementations have significantly more lines of code than the corresponding OpenACC implementations but that the measured cyclomatic complexity is not always higher. The CUDA and OpenCL implementations generally have better performance, but there is not a drastic difference if the OpenACC code is optimized. We conclude that the available metrics and tools for measuring complexity of GPU programs are inadequate, since they do not quantify the portability and maintainability of the codes, and that specialization and extensions are needed.","","978-1-5090-5224-0","10.1109/SE-HPCCSE.2016.012","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7839472","","Complexity theory;Graphics processing units;Programming;Measurement;Software engineering;Computational modeling;C++ languages","C++ language;graphics processing units;parallel architectures;software metrics;software performance evaluation;source code (software)","code complexity;GPU-accelerated scientific applications;graphics processing units;game of life;GOL;LULESH hydrodynamics proxy application;CloverLeaf mini-app;Mantevo suite;GOL C;CUDA C;OpenCL codes;LULESH C++;source lines of code;SLOC;cyclomatic complexity;Oxbow toolkit static analysis tools;McCabe IQ tool;CloverLeaf Fortran90;Fortran90 + OpenACC;design complexity;essential complexity","","2","","","","2 Feb 2017","","","IEEE","IEEE Conferences"
"GPU acceleration of the iterative physical optics (IPO) method","Kan Xu; Z. W. Liu; D. Z. Ding; R. S. Chen","Department of Electronic Engineering, Nanjing University of Science and Technology, China; Department of Electronic Engineering, Nanjing University of Science and Technology, China; Department of Electronic Engineering, Nanjing University of Science and Technology, China; Department of Electronic Engineering, Nanjing University of Science and Technology, China","2008 8th International Symposium on Antennas, Propagation and EM Theory","16 Mar 2009","2008","","","733","735","In this paper, we employ the Programmable Graphics Processing Unit (GPU) to accelerate the IPO computation for analyzing the scattering of open cavities. Since the iterative strategy accounts for multiple reflections on the inner wall, the IPO method provides a more accurate solution than the other high frequency asymptotic methods. However, it suffers from a large requirement of simulation time. To date, the GPU featuring inherent parallelism and powerful floating-point capability has become an attractive alternative to the central processing unit (CPU) for some of computation tasks. Therefore, we map the time-consuming parts of IPO into the graphics hardware following the stream programming model, and the CPU carries out the computation of the far field scattering. In addition, the numerical results demonstrate the accuracy and effectiveness of our proposed method.","","978-1-4244-2192-3","10.1109/ISAPE.2008.4735319","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4735319","","Acceleration;Iterative methods;Physical optics;Central Processing Unit;Graphics;Optical scattering;Optical reflection;Frequency;Computational modeling;Parallel processing","computational electromagnetics;electromagnetic wave scattering;iterative methods;parallel programming;physical optics","GPU acceleration;programmable graphics processing unit;multiple reflections;central processing unit;inherent parallelism;floating-point capability;time-consuming parts;iterative physical optics method","","","","8","","16 Mar 2009","","","IEEE","IEEE Conferences"
"GraphReduce: Large-Scale Graph Analytics on Accelerator-Based HPC Systems","D. Sengupta; K. Agarwal; S. L. Song; K. Schwan","Georgia Inst. of Technol., Atlanta, GA, USA; Georgia Inst. of Technol., Atlanta, GA, USA; Pacific Northwest Nat. Lab., Richland, WA, USA; Georgia Inst. of Technol., Atlanta, GA, USA","2015 IEEE International Parallel and Distributed Processing Symposium Workshop","1 Oct 2015","2015","","","604","609","Recent work on graph analytics has sought to leverage the high performance offered by GPU devices, but challenges remain due to the inherent irregularity of graph algorithm and limitations in GPU-resident memory for storing large graphs. The Graph Reduce methods presented in this paper permit a GPU-based accelerator to operate on graphs that exceed its internal memory capacity. Graph Reduce operates with a combination of both edge- and vertex-centric implementations of the Gather-Apply-Scatter programming model, to achieve high degrees of parallelism supported by methods that partition graphs across GPU and host memories and efficiently move graph data between both. Graph Reduce-based programming is performed via device functions that include gather map, gather reduce, apply, and scatter, implemented by programmers for the graph algorithms they wish to realize. Experimental evaluations for a wide variety of graph inputs, algorithms, and system configuration demonstrate that Graph Reduce outperforms other competing approaches.","","978-1-4673-7684-6","10.1109/IPDPSW.2015.16","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7284365","graph processing;big data;GPU;CUDA","Graphics processing units;Computational modeling;Programming;Parallel processing;Algorithm design and analysis;Hardware;Data structures","graph theory;graphics processing units;storage management","GraphReduce;large-scale graph analytics;accelerator-based HPC systems;GPU devices;graph algorithm irregularity;GPU-resident memory;GPU-based accelerator;internal memory capacity;edge-centric implementations;vertex-centric implementations;gather-apply-scatter programming model;partition graphs;gather_map;gather_reduce","","3","","22","","1 Oct 2015","","","IEEE","IEEE Conferences"
"Automatic Code Tuning for Improving GPU Resource Utilization","R. Takeshima; T. Tsumura","Nagoya Inst. of Technol., Nagoya, Japan; Nagoya Inst. of Technol., Nagoya, Japan","2014 Second International Symposium on Computing and Networking","2 Mar 2015","2014","","","419","425","Utilizing a GPU to perform general purpose computation is called GPGPU. The high theoretical performance of GPU draws attention to GPGPU. CUDA supplies a platform for the developers of GPU applications. In CUDA programming model, massive threads are allocated to GPU's calculation units. Besides, CUDA has various kinds of memories on GPU. These memories have different features of access latency, capacity, and so on. Therefore, to produce high-performance GPU programs, developers should consider how to allocate the massive threads to cores and which memory should be used for storing data. Hence, developers should have deep understanding of the GPU architecture and CUDA APIs. To address this problem, we propose an auto tuning framework for GPU programs, and explain an implementation of a preprocessor for the framework, in this paper.","2379-1896","978-1-4799-4152-0","10.1109/CANDAR.2014.48","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7052220","","Graphics processing units;Kernel;Message systems;Instruction sets;Registers;Tuning","application program interfaces;graphics processing units;parallel architectures;resource allocation","code tuning;GPU resource utilization;general purpose graphics processing unit;GPGPU;Compute Unified Device Architecture;high-performance GPU program;CUDA API;application program interface","","1","","11","","2 Mar 2015","","","IEEE","IEEE Conferences"
"Multi-Level Graph Layout on the GPU","Y. Frishman; A. Tal","Technion, Israel Institute of Technology; Technion, Israel Institute of Technology","IEEE Transactions on Visualization and Computer Graphics","5 Nov 2007","2007","13","6","1310","1319","This paper presents a new algorithm for force directed graph layout on the GPU. The algorithm, whose goal is to compute layouts accurately and quickly, has two contributions. The first contribution is proposing a general multi-level scheme, which is based on spectral partitioning. The second contribution is computing the layout on the GPU. Since the GPU requires a data parallel programming model, the challenge is devising a mapping of a naturally unstructured graph into a well-partitioned structured one. This is done by computing a balanced partitioning of a general graph. This algorithm provides a general multi-level scheme, which has the potential to be used not only for computation on the GPU, but also on emerging multi-core architectures. The algorithm manages to compute high quality layouts of large graphs in a fraction of the time required by existing algorithms of similar quality. An application for visualization of the topologies of ISP (Internet service provider) networks is presented.","1941-0506","","10.1109/TVCG.2007.70580","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4376155","Graph layout;GPU;graph partitioning.","Partitioning algorithms;Acceleration;Application software;Visualization;High performance computing;Parallel programming;Computer architecture;Quality management;Network topology;Web and internet services","computer graphics;graph theory;parallel programming","multi-level graph layout;directed graph layout;general multi-level scheme;spectral partitioning;data parallel programming model;naturally unstructured graph;multi-core architectures;Internet service provider;graph partitioning","","70","1","41","","5 Nov 2007","","","IEEE","IEEE Journals"
"On the Portability of the OpenCL Dwarfs on Fixed and Reconfigurable Parallel Platforms","K. Krommydas; M. Owaida; C. D. Antonopoulos; N. Bellas; W. -C. Feng",NA; NA; NA; NA; NA,"2013 International Conference on Parallel and Distributed Systems","1 May 2014","2013","","","432","433","The proliferation of heterogeneous computing systems presents the parallel computing community with the challenge of porting legacy and emerging applications to multiple processors with diverse programming abstractions. OpenCL is a vendor-agnostic and industry-supported programming model that offers code portability on heterogeneous platforms, allowing applications to be developed once and deployed ""anywhere."" In this paper, we use the OpenCL implementation of the Open Dwarfs, a benchmark suite that captures patterns of computation and communication common to classes of important applications, as delineated by Berkeley's Dwarfs. We evaluate portability across multicore CPU, GPU, APU (CPUs+GPUs on a die), the Intel Xeon Phi co-processor, and the FPGA. To realize FPGA portability, we exploit SOpenCL (Silicon OpenCL), a CAD tool that automatically converts OpenCL kernels to customizable hardware accelerators. We show that a single, unmodified OpenCL code base, i.e., Open Dwarfs, can be effectively used to target multiple, architecturally diverse platforms.","1521-9097","978-1-4799-2081-5","10.1109/ICPADS.2013.71","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6808208","OpenCL;CPU;GPU;APU;Xeon Phi;FPGA;dwarfs;portability","Field programmable gate arrays;Graphics processing units;Hardware;Hardware design languages;Kernel;Programming;Parallel processing","parallel processing","OpenCL Dwarfs;reconfigurable parallel platforms;heterogeneous computing systems;parallel computing community;porting legacy;diverse programming abstractions;industry-supported programming model;code portability;heterogeneous platforms;multicore CPU;GPU;APU;Intel Xeon Phi coprocessor;FPGA portability;SOpenCL;Silicon OpenCL;CAD tool;OpenCL kernels;OpenCL code base","","4","","5","","1 May 2014","","","IEEE","IEEE Conferences"
"Using CUDA GPU to Accelerate the Ant Colony Optimization Algorithm","K. Wei; C. Wu; C. Wu","Comput. Sci. & Inf. Eng., Nat. Changhua Univ. of Educ., Changhua, Taiwan; Comput. Sci. & Inf. Eng., Nat. Changhua Univ. of Educ., Changhua, Taiwan; Comput. Sci. & Inf. Eng., Nat. Changhua Univ. of Educ., Changhua, Taiwan","2013 International Conference on Parallel and Distributed Computing, Applications and Technologies","22 Sep 2014","2013","","","90","95","Graph Processing Units (GPUs) have recently evolved into a super multi-core and a fully programmable architecture. In the CUDA programming model, the programmers can simply implement parallelism ideas of a task on GPUs. The purpose of this paper is to accelerate Ant Colony Optimization (ACO) for Traveling Salesman Problems (TSP) with GPUs. In this paper, we propose a new parallel method, which is called the Transition Condition Method. Experimental results are extensively compared and evaluated on the performance side and the solution quality side. The TSP problems are used as a standard benchmark for our experiments. In terms of experimental results, our new parallel method achieves the maximal speed-up factor of 4.74 than the previous parallel method. On the other hand, the quality of solutions is similar to the original sequential ACO algorithm. It proves that the quality of solutions does not be sacrificed in the cause of speed-up.","2379-5352","978-1-4799-2419-6","10.1109/PDCAT.2013.21","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6904238","GPU;CUDA;Ant Colony Optimization;ACO;TSP","Cities and towns;Graphics processing units;Instruction sets;Arrays;Wheels;Memory management","ant colony optimisation;graphics processing units;parallel architectures;parallel programming;travelling salesman problems","CUDA GPU;ant colony optimization algorithm;graph processing units;programmable architecture;ant colony optimization;traveling salesman problems;TSP;Transition Condition Method;parallel method;super multi-core;CUDA programming model","","2","","14","","22 Sep 2014","","","IEEE","IEEE Conferences"
"Comparison of Xeon Phi and Kepler GPU Performance for Finite Element Numerical Integration","K. Banas; F. Kruzel","Dept. of Appl. Comput. Sci. & Modelling, AGH Univ. of Sci. & Technol., Krakόw, Poland; Inst. of Comput. Sci., Cracow Univ. of Technol., Krakόw, Poland","2014 IEEE Intl Conf on High Performance Computing and Communications, 2014 IEEE 6th Intl Symp on Cyberspace Safety and Security, 2014 IEEE 11th Intl Conf on Embedded Software and Syst (HPCC,CSS,ICESS)","12 Mar 2015","2014","","","145","148","We consider two recently introduced massively multi-core architectures designed for high performance computing, the Xeon Phi coprocessor and Kepler graphics processor. We discuss the OpenCL programming model, as one that allows to look at the platforms in a unified way and to construct efficient algorithms for both of them. As an example application we investigate a typical algorithm employed in finite element codes for numerical integration. We create kernels implementing the algorithm for the two considered platforms and compare the performance obtained.","","978-1-4799-6123-8","10.1109/HPCC.2014.27","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7056730","OpenCL;performance analysis;Xeon Phi coprocessor;GPU;Kepler architecture;finite elements;numerical integration","Finite element analysis;Registers;Instruction sets;Computer architecture;Kernel;Graphics processing units;Numerical models","finite element analysis;graphics processing units;integration;multiprocessing systems;parallel processing","Xeon Phi coprocessor;Kepler GPU graphics processor;finite element numerical integration;massively multicore architectures;high performance computing;OpenCL programming model","","2","","8","","12 Mar 2015","","","IEEE","IEEE Conferences"
"Evaluating Optimization Strategies for HMMer Acceleration on GPU","S. Ferraz; N. Moreano","Sch. of Comput., Fed. Univ. of Mato Grosso do Sul, Campo Grande, Brazil; Sch. of Comput., Fed. Univ. of Mato Grosso do Sul, Campo Grande, Brazil","2013 International Conference on Parallel and Distributed Systems","1 May 2014","2013","","","59","68","Comparing a biological sequence to a family of sequences is an important task in Bioinformatics, commonly performed using tools such as HMMer. The Viterbi algorithm is applied as HMMer main step to compute the similarity between the sequence and the family. Due to the exponential growth of biological sequence databases, implementations of the Viterbi algorithm on several high performance platforms have been proposed. Nevertheless, few implementations of the Viterbi algorithm use GPUs as main platform. In this paper, we present the development and optimization of an accelerator for the Viterbi algorithm applied to biological sequence analysis on GPUs. Some of the optimizations analyzed are applied to the sequence comparison problem for the first time in the literature and others are evaluated in more depth than in related works. Our main contributions are: (a) an accelerator that achieves speedups up to 102.90 and 60.46, with respect to HMMer2 and HMMer3 execution on a general purpose computer, respectively, (b) the use of the multi-platform OpenCL programming model for the accelerator, (c) a detailed evaluation of several optimizations such as memory, control flow, execution space, instruction scheduling, and loop optimizations, and (d) a methodology of optimizations and evaluation that can also be applied to other sequence comparison algorithms, such as the HMMer3 MSV.","1521-9097","978-1-4799-2081-5","10.1109/ICPADS.2013.21","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6808158","Sequence-profile alignment;Viterbi algorithm;GPU;Accelerator;Optimization;OpenCL","Hidden Markov models;Graphics processing units;Viterbi algorithm;Memory management;Optimization;Databases;Parallel processing","bioinformatics;graphics processing units;hidden Markov models;optimisation;scheduling","optimization strategies;HMMer acceleration;GPU;bioinformatics;Viterbi algorithm;biological sequence databases;HMMer2;general purpose computer;multiplatform OpenCL programming model;accelerator;control flow;execution space;instruction scheduling;loop optimizations;HMMer3 MSV;sequence comparison algorithms","","1","15","26","","1 May 2014","","","IEEE","IEEE Conferences"
"The Heterogeneous System Architecture: It's beyond the GPU","P. Blinzer","Advanced Micro Devices, Inc., United States","2014 International Conference on Embedded Computer Systems: Architectures, Modeling, and Simulation (SAMOS XIV)","8 Sep 2014","2014","","","iii","iii","Summary form only given. The use of GPUs in computation intensive tasks has an ever increasing impact across all platforms - including embedded - sometimes even used to create new forms of currency (Bitcoin, Litecoin, ...). And the exponential improvements in Performance per Watt gains are still ongoing unabated. At the same time, due to their “design heritage” as primarily 3D accelerators, GPUs have several properties that make it a SW challenge to unlock their full benefit in many real-world application scenarios, be it due to limiting API's (proprietary or limited functionality) or properties that require an advanced understanding of the platform architecture and managing the memory and other system resources, beyond the reach of the “average programmer”. The Heterogeneous System Architecture is established by the HSA Foundation to address many of the current shortcomings at a system architecture and programming model level while providing a great foundation for already established SW models, and in addition to the GPU allow extending the architecture to other specialty processors like DSPs, FPGAs and others to interoperate within the SW framework, a main task for the next level of work in the HSA Foundation. The HSA Foundation, a not-for-profit consortium of SOC and SOC IP vendors, OEMs, academia, OSVs and ISVs defining a consistent heterogeneous platform architecture to make it dramatically easier to program heterogeneous parallel devices like GPUs and other accelerators. The presentation gives the audience a high-level understanding of the goals of HSA, the HSA system architecture properties and its use models by system software, tools and applications.","","978-1-4799-3770-7","10.1109/SAMOS.2014.6893187","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6893187","","Computer architecture;Computational modeling;Graphics processing units;System-on-chip;Graphics;Computers","application program interfaces;computer architecture;graphics processing units","heterogeneous system architecture;GPU;computation intensive tasks;performance per watt gains;design heritage;3D accelerators;SW challenge;API;HSA foundation;DSP;FPGA;SOC IP vendors;OEM;OSV;ISV","","","","","","8 Sep 2014","","","IEEE","IEEE Conferences"
"Detailed Performance Analysis of Distributed Tensorflow on a GPU Cluster using Deep Learning Algorithms","A. Malik; M. Lu; N. Wang; Y. Lin; S. Yoo","Computer Science Initiative, Brookhaven National Laboratory; Computer Science Initiative, Brookhaven National Laboratory; Computer Science Initiative, Brookhaven National Laboratory; Computer Science Initiative, Brookhaven National Laboratory; Computer Science Initiative, Brookhaven National Laboratory","2018 New York Scientific Data Summit (NYSDS)","18 Nov 2018","2018","","","1","8","Long training times for building a high accuracy deep neural networks (DNNs) is impeding research for new DNN architectures. For example, time for training GoogleNet with the ImageNet dataset on a single Nvidia K20 GPU almost takes 25 days. Therefore, there is a great need in the AI community to speed up the training phase, especially when using a large dataset. For this, we need Distributed Deep Neural Networks (DDNNs) that can scale well with more computation resources. However, this involves two challenges.First, the deep learning framework or training library must support inter-node communication. Second, the user must modify the code to take advantage of the inter-node communication. The changes to the code can be minimal to significant depending upon the user expertize in the distributed systems. Current DNN frameworks support distributed learning using MPI. However, these frameworks come with poorly understood overheads associated with communication and data management. Tensorflow provides APIs for distributed learning using MPI programming model and gRPC. These APIs are not easy to use for a domain expert for designing an efficient distributed learning model. Recently, Uber Inc. provides the Horovod Framework which gives a fast and easy way to support distributed learning using Tensorflow, Pytorach, and Keras. In this paper we provide a detailed performance analysis of distributed Tensorflow using Horovod. We implemented distributed learning for AlexNet, GoogleNet, and ResNet50 using Horovod. We used Nvidia K 40,K80, and P100 GPUs for our experimentation. We used synthetic image data with different runtime variables (batch size and number of GPUs). Our results shows that the Horovod framework gives almost linear throughput (images/sec) scalability up to 256 GPUs.","","978-1-5386-7933-3","10.1109/NYSDS.2018.8538946","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8538946","High Performance Computing;Tensorflow;Deep Learning;Distributed Learning;Performance Analysis","Training;Neural networks;Parallel processing;Computer architecture;Graphics processing units;Computational modeling","application program interfaces;graphics processing units;learning (artificial intelligence);message passing;neural nets;parallel architectures","computation resources;deep learning framework;inter-node communication;distributed systems;current DNN frameworks;data management;MPI programming model;domain expert;distributed learning model;Horovod Framework;distributed tensorflow;Horovod framework;GPU cluster;deep learning algorithms;high accuracy deep neural networks;DNN architectures;training GoogleNet;ImageNet dataset;single Nvidia K20 GPU;AI community;API","","","","28","","18 Nov 2018","","","IEEE","IEEE Conferences"
"An improved vision-based wastewater velocity measurement system using discontinuity-preserving smoothing and GPU acceleration","C. Cao Pham; T. Tuong Nguyen; J. Jae Wook","School of Information and Communication Engineering, Sungkyunkwan University, Suwon, Korea; School of Information and Communication Engineering, Sungkyunkwan University, Suwon, Korea; School of Information and Communication Engineering, Sungkyunkwan University, Suwon, Korea","2011 11th International Conference on Control, Automation and Systems","19 Dec 2011","2011","","","1303","1308","Automatic long-term measuring wastewater velocity is an important and challenging task in hydraulic systems. This paper proposed a vision-based wastewater velocity measurement method using Bilateral filter that is a discontinuity-preserving smoothing as a prior-processing step. Experimental results showed that using Bilateral filter can improve estimation accuracy over existing methods. An effective background creation algorithm and simple floating waste tracking algorithm based on binary blob properties are also discussed in this paper. Furthermore, by implementing the proposed method on massively parallel GPU (graphics processing units) using the CUDA (compute unified device architecture) programming model, we can achieve a satisfactory acceleration to apply in real-time applications. Memory usage optimization methods are discussed and analyzed for effective implementation in graphics hardware.","2093-7121","978-89-93215-03-8","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6106126","Water flow measurement;image processing;graphics processing units","Graphics processing unit;Particle measurements;Atmospheric measurements;Velocity measurement;Accuracy;Smoothing methods;Noise","computer vision;filtering theory;flow measurement;graphics processing units;object tracking;parallel architectures;storage management;velocity measurement;wastewater","vision-based wastewater velocity measurement system;discontinuity-preserving smoothing;GPU acceleration;hydraulic system;bilateral filter;background creation algorithm;floating waste tracking algorithm;binary blob properties;massively parallel GPU;graphics processing units;CUDA programming model;compute unified device architecture;real-time application;memory usage optimization;graphics hardware","","","","16","","19 Dec 2011","","","IEEE","IEEE Conferences"
"Porting LASG/ IAP Climate System Ocean Model to Gpus Using OpenAcc","J. Jiang; P. Lin; J. Wang; H. Liu; X. Chi; H. Hao; Y. Wang; W. Wang; L. Zhang","Computer Network Information Center, Chinese Academy of Sciences, University of Chinese Academy of Sciences, Beijing, China; LASG, Institute of Atmospheric Physics, Chinese Academy of Sciences, University of Chinese Academy of Sciences, Beijing, China; NVIDIA, Beijing, China; LASG, Institute of Atmospheric Physics, Chinese Academy of Sciences, University of Chinese Academy of Sciences, Beijing, China; Computer Network Information Center, Chinese Academy of Sciences, University of Chinese Academy of Sciences, Beijing, China; Computer Network Information Center, Chinese Academy of Sciences, University of Chinese Academy of Sciences, Beijing, China; School of Information Engineering, China University of Geosciences (Beijing), Beijing, China; Computer Network Information Center, Chinese Academy of Sciences, University of Chinese Academy of Sciences, Beijing, China; Computer Network Information Center, Chinese Academy of Sciences, University of Chinese Academy of Sciences, Beijing, China","IEEE Access","30 Oct 2019","2019","7","","154490","154501","GPUs have become important solutions for accelerating scientific applications. Most of the existing work on climate models now use code rewritten using CUDA to achieve a limited speedup. This restriction also greatly limits followup development and applications. In this paper, we designed and implemented a GPU-based acceleration of the LASG/IAP climate system ocean model (LICOM) version 2, called LICOM2-GPU. Considering the extremely large codebase of the model and the occasional need to modify the code, we implemented the model completely in OpenACC. Several accelerated methods, including OpenACC data locality optimization, loop optimization, and interprocess communication optimization are presented. Developing for GPUs using OpenACC is substantially simpler than using the CUDA port. Thus, the OpenACC is a suitable GPU programming model for complex systems, such as the earth system model and its components. Our experimental results using 4 NVIDIA K80 cards achieved up to a 6.6$ \times $ speedup compared with 4 Intel(R) Xeon(R) CPU E5-2690 v2 GPUs.","2169-3536","","10.1109/ACCESS.2019.2932443","National Basic Research Program of China (973 Program)(grant numbers:2016YFB0200800); National Natural Science Foundation of China(grant numbers:61602477,61432018); Strategic Priority Research Programme(grant numbers:XDC01040000); Chinese Academy of Sciences(grant numbers:XXH13506-402,XXH13506-302); Open Research Project of the Key Laboratory of Geological Information Technology of Ministry of Natural Resources; Open Research Project of the Hubei Key Laboratory of Intelligent Geo-Information Processing(grant numbers:KLIGIP-2017A04); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8784044","High performance computing;parallel algorithm;GPU;LICOM;parallel acceleration","Graphics processing units;Acceleration;Computational modeling;Meteorology;Atmospheric modeling;Optimization;Oceans","geophysics computing;graphics processing units;parallel architectures","accelerated methods;OpenACC data locality optimization;interprocess communication optimization;CUDA port;suitable GPU programming model;complex systems;earth system model;scientific applications;climate models;code rewritten;GPU-based acceleration;LICOM2-GPU","","2","","25","CCBY","1 Aug 2019","","","IEEE","IEEE Journals"
"Hybrid Map Task Scheduling for GPU-Based Heterogeneous Clusters","K. Shirahata; H. Sato; S. Matsuoka","Tokyo Inst. of Technol., Tokyo, Japan; Tokyo Inst. of Technol., Tokyo, Japan; Tokyo Inst. of Technol., Tokyo, Japan","2010 IEEE Second International Conference on Cloud Computing Technology and Science","4 Feb 2011","2010","","","733","740","MapReduce is a programming model that enables efficient massive data processing in large-scale computing environments such as supercomputers and clouds. Such large-scale computers employ GPUs to enjoy its good peak performance and high memory bandwidth. Since the performance of each job is depending on running application characteristics and underlying computing environments, scheduling MapReduce tasks onto CPU cores and GPU devices for efficient execution is difficult. To address this problem, we have proposed a hybrid scheduling technique for GPU-based computer clusters, which minimizes the execution time of a submitted job using dynamic profiles of Map tasks running on CPU cores and GPU devices. We have implemented a prototype of our proposed scheduling technique by extending MapReduce framework, Hadoop. We have conducted some experiments for this prototype by using a K-means application as a benchmark on a supercomputer. The results show that the proposed technique achieves 1.93 times faster than the Hadoop original scheduling algorithm at 64 nodes (1024 CPU cores and 128 GPU devices). The results also indicate that the performance of map tasks, including both CPU and GPU tasks, is significantly affected by the overhead of map task invocation in the Hadoop framework.","","978-1-4244-9405-7","10.1109/CloudCom.2010.55","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5708524","Large-scale data processing;MapReduce;GPGPU;Job Scheduling","Graphics processing unit;Java;Performance evaluation;Processor scheduling;Prototypes;Central Processing Unit;Computers","computer graphic equipment;coprocessors;microcomputers;parallel machines;pattern clustering","hybrid map task scheduling;MapReduce model;programming model;data processing;memory bandwidth;hybrid scheduling technique;GPU-based computer clusters;K-means application;supercomputer;Hadoop original scheduling algorithm","","50","1","15","","4 Feb 2011","","","IEEE","IEEE Conferences"
"Efficient Fork-Join on GPUs Through Warp Specialization","A. C. Jacob; A. E. Eichenberger; H. Sung; S. F. Antao; G. -T. Bercea; C. Bertolli; A. Bataev; T. Jin; T. Chen; Z. Sura; G. Rokos; K. O'Brien","IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA; IBM T.J. Watson Res. Center, Yorktown Heights, NY, USA","2017 IEEE 24th International Conference on High Performance Computing (HiPC)","8 Feb 2018","2017","","","358","367","Graphics Processing Units (GPUs) are increasingly used to accelerate portions of general-purpose applications. Higher level language extensions have been proposed to help non-experts bridge the gap between a host and the GPU's threading model. Recent updates to the OpenMP standard allow a user to parallelize code on a GPU using the well known fork-join programming model for CPUs. Mapping this model to the architecturally visible threading model of typical GPUs has been challenging. In this work we propose a novel approach using the technique of Warp Specialization. We show how to specialize one warp (a unit of 32 GPU threads) to handle sequential code on a GPU. When this master warp reaches a user-specified parallel region, it awakens unused GPU warps to collectively execute the parallel code. Based on this method, we have implemented a Clang-based, OpenMP 4.5 compliant, open source compiler for GPUs. Our work achieves a 3.6x (and up to 32x) performance improvement over a baseline that does not exploit fork-join parallelism on an NVIDIA k40m GPU across a set of 25 kernels. Compared to state-of-the-art compilers (Clang-ykt, GCC-OpenMP, GCC-OpenACC) our work is 2.1 - 7.6x faster. Our proposed technique is simpler to implement, robust, and performant.","","978-1-5386-2293-3","10.1109/HiPC.2017.00048","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8287767","OpenMP;Fork-Join;GPU;Warp Specialization","Graphics processing units;Parallel processing;Kernel;Programming;Benchmark testing;Hardware;Data models","graphics processing units;multiprocessing systems;parallel programming;sequential codes","parallelism;GCC-OpenMP;Warp Specialization;Graphics Processing Units;higher level language extensions;GPU's threading model;OpenMP standard;programming model;architecturally visible threading model;sequential code;unused GPU warps;parallel code;Fork-join","","9","","29","","8 Feb 2018","","","IEEE","IEEE Conferences"
"How Well do CPU, GPU and Hybrid Graph Processing Frameworks Perform?","T. K. Aasawat; T. Reza; M. Ripeanu","Univ. of British Columbia, Vancouver, BC, Canada; Univ. of British Columbia, Vancouver, BC, Canada; Univ. of British Columbia, Vancouver, BC, Canada","2018 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","6 Aug 2018","2018","","","458","466","The importance of high-performance graph processing to solve big data problems targeting high-impact applications is greater than ever before. Recent graph processing frameworks target different hardware platforms (e.g., shared memory systems, accelerators such as GPUs, and distributed systems) and differ with respect to the programming model they adopt (e.g., based on linear algebra formulations of graph algorithms or enabling direct access to the graph structure). To better understand the impact of these choices, this paper, presents a comparative study of five state-of-the-art graph processing frameworks: two CPU-only frameworks - GraphMat and Galois, two GPU-based frameworks - Nvgraph and Gunrock; and Totem, a hybrid (CPU+GPU) framework. We use three popular graph algorithms (PageRank, Single Source Shortest Path, and Breadth-First Search), and massive scale graphs with up to billions of edges. Our evaluation focuses on three performance metrics: (i) execution time, (ii) scalability and (iii) energy consumption.","","978-1-5386-5555-9","10.1109/IPDPSW.2018.00082","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8425449","Graph Processing;CPU;GPU;Hybrid Systems;Performance Evaluation;PageRank;SSSP;BFS","Computational modeling;Graphics processing units;Programming;Linear algebra;Measurement;Sparse matrices;Instruction sets","Big Data;graph theory;graphics processing units;mathematics computing;parallel processing","graph processing frameworks;Nvgraph;GraphMat;Galois;Gunrock;Totem;hybrid graph;massive scale graphs;graph structure;linear algebra formulations;programming model;high-impact applications;big data problems;high-performance graph","","2","","35","","6 Aug 2018","","","IEEE","IEEE Conferences"
"Overlapping Data Transfers with Computation on GPU with Tiles","B. Bastem; D. Unat; W. Zhang; A. Almgren; J. Shalf","Koc Univ., Istanbul, Turkey; Koc Univ., Istanbul, Turkey; Lawrence Berkeley Nat. Lab., Berkeley, CA, USA; Lawrence Berkeley Nat. Lab., Berkeley, CA, USA; Lawrence Berkeley Nat. Lab., Berkeley, CA, USA","2017 46th International Conference on Parallel Processing (ICPP)","7 Sep 2017","2017","","","171","180","GPUs are employed to accelerate scientific applications however they require much more programming effort from the programmers particularly because of the disjoint address spaces between the host and the device. OpenACC and OpenMP 4.0 provide directive based programming solutions to alleviate the programming burden however synchronous data movement can create a performance bottleneck in fully taking advantage of GPUs. We propose a tiling based programming model and its library that simplifies the development of GPU programs and overlaps the data movement with computation. The programming model decomposes the data and computation into tiles and treats them as the main data transfer and execution units, which enables pipelining the transfers to hide the transfer latency. Moreover, partitioning application data into tiles allows the programmer to still take advantage of GPU even though application data cannot fit into the device memory. The library leverages C++ lambda functions, OpenACC directives, CUDA streams and tiling API from TiDA to support both productivity and performance. We show the performance of the library on a data transfer-intensive and a compute-intensive kernels and compare its speedup against OpenACC and CUDA. The results indicate that the library can hide the transfer latency, handle the cases where there is no sufficient device memory, and achieves reasonable performance.","2332-5690","978-1-5386-1042-8","10.1109/ICPP.2017.26","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8025291","GPUs;Tiles;Programming Models;Overlapping communication with computation;Library;OpenACC;CUDA","Graphics processing units;Kernel;Programming;Data transfer;Performance evaluation;Libraries;Memory management","data handling;graphics processing units;parallel architectures","compute-intensive kernels;data transfer-intensive kernels;TiDA;API;CUDA streams;OpenACC directives;C++ lambda functions;device memory;application data;transfer latency;GPU programs;tiling based programming model;synchronous data movement;directive based programming solutions;OpenMP 4.0;programmers;programming effort;scientific applications;overlapping data transfers","","4","","34","","7 Sep 2017","","","IEEE","IEEE Conferences"
"AES finalists implementation for GPU and multi-core CPU based on OpenCL","Xingliang Wang; Xiaochao Li; Mei Zou; Jun Zhou","Department of Electronic Engineering, Xiamen University, China, 361005; Department of Electronic Engineering, Xiamen University, China, 361005; Department of Electronic Engineering, Xiamen University, China, 361005; Department of Electronic Engineering, Xiamen University, China, 361005","2011 IEEE International Conference on Anti-Counterfeiting, Security and Identification","28 Jul 2011","2011","","","38","42","Benefit from the OpenCL (Open Computing Language), applications can be easily transplanted among different GPUs, multi-core CPUs, and other processors. In this paper, we present implementation of AES finalists (Rijndael, Serpent, Twofish) in XTS mode, based on OpenCL. Benchmark testing is performed on 4 mainstream GPUs and multi-core CPUs. The results are also compared with implementations based on traditional serial programming model and CUDA. The resulting data shows that throughputs based on OpenCL are higher than serial programming model, while a little lower than CUDA. Which demonstrates that OpenCL promises a portable language for GPU programming, while entail a performance penalty.","2163-5056","978-1-61284-632-3","10.1109/ASID.2011.5967411","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5967411","OpenCL;GPU;Rijndael;Serpent;Twofish;XTS","Graphics processing unit;Programming;Encryption;Throughput;Kernel;Performance evaluation","computer graphic equipment;coprocessors;cryptography;multiprocessing systems","AES finalists implementation;multicore CPU;OpenCL;open computing language;XTS mode;GPU programming;advanced encryption standard","","5","","16","","28 Jul 2011","","","IEEE","IEEE Conferences"
"Computing 2D Constrained Delaunay Triangulation Using the GPU","M. Qi; T. Cao; T. Tan","National University of Singapore, Singapore; National University of Singapore, Singapore; National University of Singapore, Singapore","IEEE Transactions on Visualization and Computer Graphics","19 Mar 2013","2013","19","5","736","748","We propose the first graphics processing unit (GPU) solution to compute the 2D constrained Delaunay triangulation (CDT) of a planar straight line graph (PSLG) consisting of points and edges. There are many existing CPU algorithms to solve the CDT problem in computational geometry, yet there has been no prior approach to solve this problem efficiently using the parallel computing power of the GPU. For the special case of the CDT problem where the PSLG consists of just points, which is simply the normal Delaunay triangulation (DT) problem, a hybrid approach using the GPU together with the CPU to partially speed up the computation has already been presented in the literature. Our work, on the other hand, accelerates the entire computation on the GPU. Our implementation using the CUDA programming model on NVIDIA GPUs is numerically robust, and runs up to an order of magnitude faster than the best sequential implementations on the CPU. This result is reflected in our experiment with both randomly generated PSLGs and real-world GIS data having millions of points and edges.","1941-0506","","10.1109/TVCG.2012.307","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6361389","GPGPU;parallel computation;computational geometry;Voronoi diagram;image vectorization","Graphics processing units;Instruction sets;Arrays;Strips;Standards;Color","graphics processing units;mesh generation;parallel architectures","computing 2D constrained Delaunay triangulation;graphics processing unit;CDT;planar straight line graph;PSLG;computational geometry;parallel computing power;CUDA programming model;NVIDIA GPU","Algorithms;Computer Graphics;Image Enhancement;Image Enhancement;Image Interpretation, Computer-Assisted;Image Interpretation, Computer-Assisted;Imaging, Three-Dimensional;Imaging, Three-Dimensional;Numerical Analysis, Computer-Assisted;Reproducibility of Results;Sensitivity and Specificity;Signal Processing, Computer-Assisted","17","","30","","26 Nov 2012","","","IEEE","IEEE Journals"
"Kernel Fusion: An Effective Method for Better Power Efficiency on Multithreaded GPU","G. Wang; Y. Lin; W. Yi","Nat. Lab. for Parallel & Distrib. Process. Sch. of Comput., Nat. Univ. of Defense Technol., Changsha, China; Nat. Lab. for Parallel & Distrib. Process. Sch. of Comput., Nat. Univ. of Defense Technol., Changsha, China; Nat. Lab. for Parallel & Distrib. Process. Sch. of Comput., Nat. Univ. of Defense Technol., Changsha, China","2010 IEEE/ACM Int'l Conference on Green Computing and Communications & Int'l Conference on Cyber, Physical and Social Computing","7 Mar 2011","2010","","","344","350","As one of the most popular accelerators, Graphics Processing Unit (GPU) has demonstrated high computing power in several application fields. On the other hand, GPU also produces high power consumption and has been one of the most largest power consumers in desktop and supercomputer systems. However, software power optimization method targeted for GPU has not been well studied. In this work, we propose kernel fusion method to reduce energy consumption and improve power efficiency on GPU architecture. Through fusing two or more independent kernels, kernel fusion method achieves higher utilization and much more balanced demand for hardware resources, which provides much more potential for power optimization, such as dynamic voltage and frequency scaling (DVFS). Basing on the CUDA programming model, this paper also gives several different fusion methods targeted for different situations. In order to make judicious fusion strategy, we deduce the process of fusing multiple independent kernels as a dynamic programming problem, which could be well solved with many existing tools and be simply embedded into compiler or runtime system. To reduce the overhead introduced by kernel fusion, we also propose effective method to reduce the usage of shared memory and coordinate the thread space of the kernels to be fused. Detailed experimental evaluation validates that the proposed kernel fusion method could reduce energy consumption without performance loss for several typical kernels.","","978-1-4244-9779-9","10.1109/GreenCom-CPSCom.2010.102","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5724850","Kernel Fusion;Power Efficiency;Power Optimization;GPGPU","Kernel;Instruction sets;Graphics processing unit;Energy consumption;Hardware;Mathematical model;Dynamic programming","computer graphic equipment;coprocessors;energy conservation;power aware computing","kernel fusion;multithreaded GPU;power efficiency;graphics processing unit;desktop systems;supercomputer systems;dynamic voltage and frequency scaling;CUDA programming model","","59","1","21","","7 Mar 2011","","","IEEE","IEEE Conferences"
"HLanc: Heterogeneous Parallel Implementation of the Implicitly Restarted Lanczos Method","S. Zhang; T. Li; X. Jiao; Y. Wang; Y. Yang","Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China; Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China; Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China; Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China; Coll. of Comput. & Control Eng., Nankai Univ., Tianjin, China","2014 43rd International Conference on Parallel Processing Workshops","11 May 2015","2014","","","403","410","Graphics Processing Unit (GPU) has been used as a ubiquitous accelerator for general purpose computing, such as linear algebra routines and numerical methods. The implicitly restarted Lanczos method (IRLM) is well suited for solving the partial eigenvalue problem for large symmetric sparse matrices, which is important in many real world applications. In this paper, we present the HLanc library, a parallel implementation of IRLM on the heterogeneous CPU-GPU architecture employing the CUDA programming model. The HLanc library is designed with separated heterogeneous parallel IRLM solvers and sparse matrix-vector multiplication (SPMV) operators. The SPMV operators hide the details about the storage of sparse matrices from the IRLM solvers, so the solvers can work with any spare matrix formats. Especially the SPMV operators and IRLM solvers can be combined arbitrarily for achieving the best performance of CPU-GPU heterogeneous system. The HLanc is evaluated using eight sparse matrices with the NVIDIA GTX 480 and GTX TITAN Black GPUs. The results show that HLanc achieves 15 times speedup than the ARPACK library and scales well across different GPU generations.","2332-5690","978-1-4799-5615-9","10.1109/ICPPW.2014.60","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7103478","GPU;CUDA;symmetric sparse matrix;IRLM;SPMV;HLanc","Sparse matrices;Graphics processing units;Eigenvalues and eigenfunctions;Libraries;Computer architecture;Symmetric matrices;Hardware","eigenvalues and eigenfunctions;graphics processing units;mathematics computing;matrix multiplication;parallel architectures;parallel programming;software libraries;sparse matrices;vectors","heterogeneous parallel implementation;implicitly restarted Lanczos method;graphics processing unit;ubiquitous accelerator;general purpose computing;linear algebra routines;numerical methods;partial eigenvalue problem;symmetric sparse matrices;HLanc library;heterogeneous CPU-GPU architecture;CUDA programming model;heterogeneous parallel IRLM solvers;sparse matrix-vector multiplication operators;SPMV operators;CPU-GPU heterogeneous system;NVIDIA GTX 480;GTX TITAN Black GPUs","","2","","26","","11 May 2015","","","IEEE","IEEE Conferences"
"Stargazer: Automated regression-based GPU design space exploration","W. Jia; K. A. Shaw; M. Martonosi","Princeton University, USA; University of Richmond, USA; Princeton University, USA","2012 IEEE International Symposium on Performance Analysis of Systems & Software","26 Apr 2012","2012","","","2","13","Graphics processing units (GPUs) are of increasing interest because they offer massive parallelism for high-throughput computing. While GPUs promise high peak performance, their challenge is a less-familiar programming model with more complex and irregular performance trade-offs than traditional CPUs or CMPs. In particular, modest changes in software or hardware characteristics can lead to large or unpredictable changes in performance. In response to these challenges, our work proposes, evaluates, and offers usage examples of Stargazer1, an automated GPU performance exploration framework based on stepwise regression modeling. Stargazer sparsely and randomly samples parameter values from a full GPU design space and simulates these designs. Then, our automated stepwise algorithm uses these sampled simulations to build a performance estimator that identifies the most significant architectural parameters and their interactions. The result is an application-specific performance model which can accurately predict program runtime for any point in the design space. Because very few initial performance samples are required relative to the extremely large design space, our method can drastically reduce simulation time in GPU studies. For example, we used Stargazer to explore a design space of nearly 1 million possibilities by sampling only 300 designs. For 11 GPU applications, we were able to estimate their runtime with less than 1.1% average error. In addition, we demonstrate several usage scenarios of Stargazer.","","978-1-4673-1146-5","10.1109/ISPASS.2012.6189201","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6189201","","Graphics processing unit;Instruction sets;Mathematical model;Hardware;Space exploration;Runtime;Concurrent computing","computer architecture;graphics processing units;regression analysis","Stargazer;automated regression;GPU design space exploration;graphics processing unit;automated GPU performance exploration framework;stepwise regression modeling","","44","","28","","26 Apr 2012","","","IEEE","IEEE Conferences"
"DART-CUDA: A PGAS Runtime System for Multi-GPU Systems","L. Zhou; K. Fuerlinger","Dept. of Comput. Sci., Ludwig-Maximilians-Univ. (LMU) Munchen, Munich, Germany; Dept. of Comput. Sci., Ludwig-Maximilians-Univ. (LMU) Munchen, Munich, Germany","2015 14th International Symposium on Parallel and Distributed Computing","23 Jul 2015","2015","","","110","119","The Partitioned Global Address Space (PGAS) approach is a promising programming model in high performance parallel computing that combines the advantages of distributed memory systems and shared memory systems. The PGAS model has been used on a variety of hardware platforms in the form of PGAS programming languages like Unified Parallel C (UPC), Chapel and Fortress. However, in spite of the increasing adoption in distributed and shared memory systems, the extension of the PGAS model to accelerator platforms is still not well supported. To exploit the immense computational power of multi-GPU systems, this work is concerned with the design and implementation of a Partitioned Global Address Space model for multi-GPU systems. Several issues related to the combination of logically separate GPU memories on multiple graphic cards are addressed. Furthermore, the execution model of modern GPU architectures is studied and a task creation mechanism with load balancing is proposed. Our work is implemented in the context of the DASH project, a C++ template library that realizes PGAS semantics through operator overloading. Experimental results suggest promising performance of the design and its implementation.","2379-5352","978-1-4673-7148-3","10.1109/ISPDC.2015.20","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7165137","PGAS;Partitioned Global Address Space;MultiGPU systems;CUDA;Heterogeneous computing","Graphics processing units;Resource management;Electronics packaging;Runtime;Programming;Computational modeling;Kernel","C++ language;distributed memory systems;graphics processing units;parallel processing;resource allocation;software libraries","C++ template library;DASH project;load balancing;task creation mechanism;GPU architecture;multiple graphic card;GPU memories;PGAS programming language;Chapel;UPC;unified parallel C;shared memory system;distributed memory system;high performance parallel computing;PGAS approach;partitioned global address space approach;multiGPU system;PGAS runtime system;DART-CUDA","","2","","11","","23 Jul 2015","","","IEEE","IEEE Conferences"
"GPU acceleration of the dynamics routine in the HIRLAM weather forecast model","V. T. Vu; G. Cats; L. Wolters","Leiden Institute of Advanced Computer Science, Leiden University, 2333 CA, The Netherlands; Royal Netherlands, Meteorological Institute, 3730 AE De Bilt, The Netherlands; Leiden Institute of Advanced Computer Science, Leiden University, 2333 CA, The Netherlands","2010 International Conference on High Performance Computing & Simulation","12 Aug 2010","2010","","","31","38","Programmable graphics processing units (GPUs) nowadays offer very high performance computing power at relatively low hardware cost and power consumption. In this paper, we present the implementation of the dynamics routine of the HIRLAM weather forecast model on the NVIDIA GeForce 9800 GX2 GPU card using the Compute Unified Device Architecture (CUDA) as parallel programming model. We converted the original Fortran to C and CUDA by hand, straightforwardly, without much concern about optimization. On a single GPU, we observe speed-ups by an order of magnitude over our hosting CPU (Intel quad core, 1998 MHz). This includes the relatively very costly copying of data between GPU and CPU memories. Calculation times proper decreased by a factor of 2000. A single GPU, however, has not enough memory for practical use. Therefore, we investigated a parallel implementation on 4 GPUs. We found a parallel speed-up of 3.6, which is not very promising if memory limitations force the use of many GPUs in parallel. We discuss several options to solve this issue.","","978-1-4244-6830-0","10.1109/HPCS.2010.5547152","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5547152","GPGPU;Large Scale Scientific Computing;Parallelization of Simulation;CUDA;Numerical Weather Prediction model;Dynamics","Graphics processing unit;Kernel;Weather forecasting;Predictive models","computer graphic equipment;coprocessors;geophysics computing;parallel programming;weather forecasting","GPU acceleration;dynamics routine;programmable graphics processing unit;high performance computing power;HIRLAM weather forecast model;NVIDIA GeForce 9800 GX2 GPU card;Compute Unified Device Architecture;CUDA;parallel programming;Intel quad core","","6","","18","","12 Aug 2010","","","IEEE","IEEE Conferences"
"CUDA-Based Computation for Visual Odometry","S. -H. Liu; C. -C. Hsu; W. -Y. Wang; C. -H. Lin","Department of Electrical Engineering, National Taiwan Normal University, Taipei, Taiwan; Department of Electrical Engineering, National Taiwan Normal University, Taipei, Taiwan; Department of Mechatronic Engineering, National Taiwan Normal University, Taipei, Taiwan; Department of Mechatronic Engineering, National Taiwan Normal University, Taipei, Taiwan","2018 IEEE 7th Global Conference on Consumer Electronics (GCCE)","13 Dec 2018","2018","","","64","65","An enhanced visual odometry (VO) system is proposed to improve the accuracy of pose estimation based on a corrected model, and the matching algorithm is implemented on graphical processing units (GPUs) so that the computation can be accelerated in parallel and in real-time using the compute unified device architecture (CUDA) programming model. To evaluate the performance of the proposed approach, an ASUS Xtion 3D camera, laptop, and NVIDIA TX2 are employed to conduct extensive experiments. The experimental results show that compared with the traditional VO algorithm, the proposed approach gives better results over the traditional VO algorithm.","2378-8143","978-1-5386-6309-7","10.1109/GCCE.2018.8574869","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8574869","Visual odometry;GPU;CUDA","Graphics processing units;Cameras;Feature extraction;Pose estimation;Computational modeling;Visual odometry;Computational efficiency","cameras;computerised instrumentation;distance measurement;graphics processing units;parallel architectures;pose estimation;robot vision","graphical processing units;compute unified device architecture programming model;ASUS Xtion 3D camera;NVIDIA TX2;CUDA-based computation;matching algorithm;visual odometry system;VO algorithm;GPU","","","","6","","13 Dec 2018","","","IEEE","IEEE Conferences"
"Empowering Visual Categorization With the GPU","K. E. A. van de Sande; T. Gevers; C. G. M. Snoek","Intelligent Systems Lab Amsterdam, Informatics Institute, University of Amsterdam, Amsterdam, The Netherlands; Intelligent Systems Lab Amsterdam, Informatics Institute, University of Amsterdam, Amsterdam, The Netherlands; Intelligent Systems Lab Amsterdam, Informatics Institute, University of Amsterdam, Amsterdam, The Netherlands","IEEE Transactions on Multimedia","17 Jan 2011","2011","13","1","60","70","Visual categorization is important to manage large collections of digital images and video, where textual metadata is often incomplete or simply unavailable. The bag-of-words model has become the most powerful method for visual categorization of images and video. Despite its high accuracy, a severe drawback of this model is its high computational cost. As the trend to increase computational power in newer CPU and GPU architectures is to increase their level of parallelism, exploiting this parallelism becomes an important direction to handle the computational cost of the bag-of-words approach. When optimizing a system based on the bag-of-words approach, the goal is to minimize the time it takes to process batches of images. this paper, we analyze the bag-of-words model for visual categorization in terms of computational cost and identify two major bottlenecks: the quantization step and the classification step. We address these two bottlenecks by proposing two efficient algorithms for quantization and classification by exploiting the GPU hardware and the CUDA parallel programming model. The algorithms are designed to (1) keep categorization accuracy intact, (2) decompose the problem, and (3) give the same numerical results. In the experiments on large scale datasets, it is shown that, by using a parallel implementation on the Geforce GTX260 GPU, classifying unseen images is 4.8 times faster than a quad-core CPU version on the Core i7 920, while giving the exact same numerical results. In addition, we show how the algorithms can be generalized to other applications, such as text retrieval and video retrieval. Moreover, when the obtained speedup is used to process extra video frames in a video retrieval benchmark, the accuracy of visual categorization is improved by 29%.","1941-0077","","10.1109/TMM.2010.2091400","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5625914","Bag-of-words;computational efficiency;General-Purpose computation on Graphics Processing Units (GPGPU);image classification;image/video retrieval;multicore processing;parallel processing;support vector machines","Visualization;Graphics processing unit;Kernel;Computational modeling;Feature extraction;Vector quantization;Acceleration","computer graphic equipment;coprocessors;image classification;image segmentation;meta data;parallel programming;video signal processing","visual categorization;GPU;digital image;digital video;textual metadata;parallel architecture;quantization step;classification step;CUDA;parallel programming model;Geforce GTX260;image classification;Core i7 920;computational efficiency;graphics processing unit;general purpose computation","","51","5","51","IEEE","11 Nov 2010","","","IEEE","IEEE Journals"
"Parallelization and Optimization of SIFT on GPU Using CUDA","Z. Yonglong; M. Kuizhi; J. Xiang; D. Peixiang","NA; NA; Xian Jiaotong Univ., Xian, China; NA","2013 IEEE 10th International Conference on High Performance Computing and Communications & 2013 IEEE International Conference on Embedded and Ubiquitous Computing","12 Jun 2014","2013","","","1351","1358","Scale-invariant feature transform (SIFT) based feature extraction algorithm is widely applied to extract features from images, and it is very attractive to accelerate these SIFT based algorithms on GPU. In this paper, we present several parallel computing strategies, implement and optimize the SIFT algorithm using CUDA programming model on GPU. Each stage of SIFT is analyzed in detail to choose the parallel strategy. On the basis of the elementary CUDA-SIFT and CUDA architecture, we optimize the implementation from several aspects to speedup the CUDA-SIFT. Experimental results demonstrate that our implementation after optimization is 2.5 times faster than previous optimization, and our CUDA based SIFT can run at the speed of 20 frames per second on most images with 1280x 960 resolution in the test. Using 1920 x1440 image to test, we have obtained a speed of 11 frames per second on average, which is about 60 times faster than the CPU implementation of SIFT. In short, our implementation obtains appropriate accuracy and higher efficiency compared to CPU implementations and other GPU implementations, which is attributed to our dedicated optimization strategies.","","978-0-7695-5088-6","10.1109/HPCC.and.EUC.2013.192","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6832074","","Graphics processing units;Instruction sets;Feature extraction;Convolution;Histograms;Optimization;Vectors","graphics processing units;parallel architectures;parallel processing;transforms","GPU;SIFT optimization;SIFT parallelization;scale invariant feature transform;feature extraction algorithm;parallel computing strategies;CUDA programming model;parallel strategy;CUDA architecture;CUDA-SIFT;CPU implementation","","5","","13","","12 Jun 2014","","","IEEE","IEEE Conferences"
"Simplifying the multi-GPU programming of a hyperspectral image registration algorithm","J. Fernàndez-Fabeiro; A. Gonzalez-Escribano; D. R. Llanos","Universidad de Valladolid,Departamento de Informaticá,Valladolid,Spain; Universidad de Valladolid,Departamento de Informaticá,Valladolid,Spain; Universidad de Valladolid,Departamento de Informaticá,Valladolid,Spain","2019 International Conference on High Performance Computing & Simulation (HPCS)","9 Sep 2020","2019","","","11","18","Hyperspectral image registration is a relevant task for real-time applications like environmental disasters management or search and rescue scenarios. Traditional algorithms for this problem were not really devoted to real-time performance. The HYFMGPU algorithm arose as a high-performance GPU-based solution to solve such a lack. Nevertheless, a single-GPU solution is not enough, as sensors are evolving and then generating images with finer resolutions and wider wavelength ranges. An MPI+CUDA multi-GPU implementation of HYFMGPU was previously presented. However, this solution shows the programming complexity of combining MPI with an accelerator programming model. In this paper we present a new and more abstract programming approach for this type of applications, which provides a high efficiency while simplifying the programming of the multi-device parts of the code. The solution uses Hitmap, a library to ease the programming of parallel applications based on distributed arrays. It uses a more algorithm-oriented approach than MPI, including abstractions for the automatic partition and mapping of arrays at runtime with arbitrary granularity, as well as techniques to build flexible communication patterns that transparently adapt to the data partitions. We show how these abstractions apply to this application class. We present a comparison of development effort metrics between the original MPI implementation and the one based on Hitmap, with reductions of up to 95% for the Halstead score in specific work redistribution steps. We finally present experimental results showing that these abstractions are internally implemented in a high efficient way that can reduce the overall performance time in up to 37% comparing with the original MPI implementation.","","978-1-7281-4484-9","10.1109/HPCS48598.2019.9188064","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9188064","Hyperspectral imaging;image registration;parallel libraries;distributed arrays;MPI;CUDA;GPGPU","Programming;Graphics processing units;Hyperspectral imaging;Real-time systems;Libraries;Principal component analysis","application program interfaces;emergency management;graphics processing units;hyperspectral imaging;image registration;message passing;parallel architectures","multiGPU programming;hyperspectral image registration algorithm;real-time applications;environmental disasters management;search and rescue scenario;real-time performance;HYFMGPU algorithm;high-performance GPU-based solution;programming complexity;accelerator programming model;abstract programming approach;multidevice parts;Hitmap;parallel applications;distributed arrays;algorithm-oriented approach;application class;performance time","","","","29","","9 Sep 2020","","","IEEE","IEEE Conferences"
"Two-stage Asynchronous Iterative Solvers for multi-GPU Clusters","P. Nayak; T. Cojean; H. Anzt","Karlsruhe Institute of Technology,Germany; Karlsruhe Institute of Technology,Germany; Karlsruhe Institute of Technology,Germany","2020 IEEE/ACM 11th Workshop on Latest Advances in Scalable Algorithms for Large-Scale Systems (ScalA)","31 Dec 2020","2020","","","9","18","Given the trend of supercomputers accumulating much of their compute power in GPU accelerators composed of thousands of cores and operating in streaming mode, global synchronization points become a bottleneck, severely confining the performance of applications. In consequence, asynchronous methods breaking up the bulk-synchronous programming model are becoming increasingly attractive. In this paper, we study a GPU-focused asynchronous version of the Restricted Additive Schwarz (RAS) method that employs preconditioned Krylov subspace methods as subdomain solvers. We analyze the method for various parameters such as local solver tolerance and iteration counts. Leveraging the multi-GPU architecture on Summit, we show that these two-stage methods are more memory and time efficient than asynchronous RAS using direct solvers. We also demonstrate the superiority over synchronous counterparts, and present results using one-sided CUDA-aware MPI on up to 36 NVIDIA V100 GPUs.","","978-1-6654-2270-3","10.1109/ScalA51936.2020.00007","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9308758","Asynchronous iterative methods;Schwarz methods;GPUs;Krylov subspace solvers","Iterative methods;Convergence;Synchronization;Additives;Symmetric matrices;Sparse matrices;Programming","graphics processing units;hardware accelerators;iterative methods;multiprocessing systems;parallel architectures;parallel machines","multiGPU clusters;GPU accelerators;global synchronization points;GPU-focused asynchronous version;restricted additive Schwarz method;preconditioned Krylov subspace methods;subdomain solvers;local solver tolerance;iteration counts;multiGPU architecture;two-stage asynchronous iterative solvers;supercomputers;Summit;asynchronous RAS;one-sided CUDA-aware MPI;NVIDIA V100 GPUs","","","","14","","31 Dec 2020","","","IEEE","IEEE Conferences"
"Parallel Fast Pencil Drawing Generation Algorithm Based on GPU","J. Qiu; B. Liu; J. He; C. Liu; Y. Li","College of Information Engineering, Northwest A&F University, Yangling, China; College of Information Engineering, Northwest A&F University, Yangling, China; College of Mathematics and Computer Science, Yan’an University, Yan’an, China; College of Information Engineering, Northwest A&F University, Yangling, China; School of Computer Science and Technology, Xi’an University of Science and Technology, Xi’an, China","IEEE Access","5 Jul 2019","2019","7","","83543","83555","With the development of image processing technology, pencil drawing has been widely used in video games and mobile phone applications. However, the existing pencil drawing algorithms require a large amount of time to convert a real picture into a pencil drawing; hence, it is difficult to apply them to real-time systems. This paper proposes a parallel fast pencil drawing generation algorithm based on the graphics processing unit (GPU) to accelerate the real-time rendering process of sketch painting. The parallelism of the pencil drawing generation algorithm is identified via a theoretical analysis at first. Then, sub-algorithms of the sequential algorithm are designed in parallel using the compute unified device architecture (CUDA) programming model and executed via thread-level parallel techniques. Furthermore, an optimal cache pattern of data that reduce the access time of the most frequently used data is structured using shared memory and constant memory. Finally, task-level parallelism is achieved by the CUDA stream technology, which overlaps independent sub-tasks for further acceleration. On the CUDA platform, the experimental results demonstrate that the proposed parallel algorithm can achieve a significant increase in speedup. The proposed algorithm achieves a performance improvement of 448.59 times compared with the sequential algorithm, on 2560×1920-resolution images, and maintains a high degree of similarity with the real pencil paintings. Hence, the proposed algorithm is suitable for real-time pencil drawing rendering and has promising application prospects in non-photorealistic rendering.","2169-3536","","10.1109/ACCESS.2019.2924658","National Natural Science Foundation of China(grant numbers:61602388); Natural Science Basic Research Plan in Shaanxi Province of China(grant numbers:2017JM6059); Fundamental Research Funds for the Central Universities(grant numbers:2452019064); Postdoctoral Science Foundation of Shaanxi Province of China(grant numbers:2016BSHEDZZ121); China Postdoctoral Science Foundation(grant numbers:2017M613216,2018M633585); Natural Science Basic Research Plan in Shaanxi Province of China(grant numbers:2018JQ6060); Key Program of the National Natural Science Foundation of China(grant numbers:61834005); Fundamental Research Funds for the Central Universities(grant numbers:2452016081); Doctoral Starting up Foundation of Yan’an University(grant numbers:YDBK2019-06); Northwest A and F University(grant numbers:2201810712307); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8744506","Non-photorealistic rendering;pencil drawing;parallel algorithm;GPU platform;convolution operation;CUDA","Graphics processing units;Rendering (computer graphics);Instruction sets;Histograms;Parallel processing;STEM;Real-time systems","graphics processing units;image resolution;parallel architectures;real-time systems;rendering (computer graphics)","parallel algorithm;sequential algorithm;parallel fast pencil drawing generation algorithm;image processing technology;real-time rendering process;thread-level parallel techniques;task-level parallelism;CUDA programming model;compute unified device architecture;real-time pencil drawing rendering;pencil drawing algorithms","","3","","37","CCBY","24 Jun 2019","","","IEEE","IEEE Journals"
"An Asynchronous Parallel Implementation of Multilevel Fast Multipole Algorithm on GPU Cluster for 3D Electromagnetic Scattering Problems","R. -P. Xi; W. -J. He; M. -L. Yang; X. -Q. Sheng","Center for Electromagnetic Simulation, School of Information and Electronics, Beijing Institute of Technology,Beijing,China,100081; Center for Electromagnetic Simulation, School of Information and Electronics, Beijing Institute of Technology,Beijing,China,100081; Center for Electromagnetic Simulation, School of Information and Electronics, Beijing Institute of Technology,Beijing,China,100081; Center for Electromagnetic Simulation, School of Information and Electronics, Beijing Institute of Technology,Beijing,China,100081","2021 International Applied Computational Electromagnetics Society (ACES-China) Symposium","8 Nov 2021","2021","","","1","2","This paper presents a CPU/GPU asynchronous computing pattern based improved parallel multilevel fast multipole algorithm (MLFMA) for 3D electromagnetic scattering problems on GPU Cluster. In the presented parallel implementation, the matrix assembly process of the MLFMA is decomposed into CPU execution and GPU execution two parts. The former is performed on CPU using OpenMP multi-threading programming model, while the latter is performed on GPU with CUDA programming model. The execution time between the two parts is overlapped by using the feature of asynchronous execution between CPU and GPU. The performance of the proposed parallel implementation is investigated in terms of accuracy and efficiency. Numerical results show that, with the proposed parallel approach, over 10% speed-up can be attained, compared with the original parallel implementation.","","978-1-7335096-1-9","10.23919/ACES-China52398.2021.9581392","National Key R&D Program of China(grant numbers:2017YFB0202500); NSFC(grant numbers:61971034); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9581392","Multilevel fast multipole algorithm;OpenMP;CUDA;Asynchronous Computing;scattering","Three-dimensional displays;Runtime;Computational modeling;Electromagnetic scattering;Graphics processing units;Programming;Computational electromagnetics","","","","","","4","","8 Nov 2021","","","IEEE","IEEE Conferences"
"Accelerating DNN Inference with GraphBLAS and the GPU","X. Wang; Z. Lin; C. Yang; J. D. Owens","University of California, Davis,Department of Computer Science,Davis,California,95616; University of California, Davis,Department of Electrical & Computer Engineering,Davis,California,95616; University of California, Davis,Department of Electrical & Computer Engineering,Davis,California,95616; University of California, Davis,Department of Electrical & Computer Engineering,Davis,California,95616","2019 IEEE High Performance Extreme Computing Conference (HPEC)","28 Nov 2019","2019","","","1","6","This work addresses the 2019 Sparse Deep Neural Network Graph Challenge with an implementation of this challenge using the GraphBLAS programming model. We demonstrate our solution to this challenge with GraphBLAST, a GraphBLAS implementation on the GPU, and compare it to SuiteSparse, a GraphBLAS implementation on the CPU. The GraphBLAST implementation is 1.94 × faster than Suite-Sparse; the primary opportunity to increase performance on the GPU is a higher-performance sparse-matrix-times-sparse-matrix (SpGEMM) kernel.","2643-1971","978-1-7281-5020-8","10.1109/HPEC.2019.8916498","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8916498","","Sparse matrices;Graphics processing units;Neurons;Matlab;Runtime;Neural networks;Memory management","graph theory;graphics processing units;inference mechanisms;multiprocessing systems;neural nets;sparse matrices","GraphBLAS implementation;GPU;GraphBLAST implementation;Suite-Sparse;DNN Inference;2019 Sparse Deep Neural Network Graph Challenge;GraphBLAS programming model;sparse-matrix-times-sparse-matrix kernel","","4","","14","","28 Nov 2019","","","IEEE","IEEE Conferences"
"CNN based high performance computing for real time image processing on GPU","S. Potluri; A. Fasih; L. K. Vutukuru; F. A. Machot; K. Kyamakya","Transportation Informatics Group, Alpen-Adria University of Klagenfurt, Klagenfurt, Austria; Transportation Informatics Group, Alpen-Adria University of Klagenfurt, Klagenfurt, Austria; Transportation Informatics Group, Alpen-Adria University of Klagenfurt, Klagenfurt, Austria; Transportation Informatics Group, Alpen-Adria University of Klagenfurt, Klagenfurt, Austria; Transportation Informatics Group, Alpen-Adria University of Klagenfurt, Klagenfurt, Austria","Proceedings of the Joint INDS'11 & ISTET'11","22 Sep 2011","2011","","","1","7","Many of the basic image processing tasks suffer from processing overhead to operate over the whole image. In real time applications the processing time is considered as a big obstacle for its implementations. A High Performance Computing (HPC) platform is necessary in order to solve this problem. The usage of hardware accelerator make the processing time low. In recent developments, the Graphics Processing Unit (GPU) is being used in many applications. Along with the hardware accelerator a proper choice of the computing algorithm makes it an added advantage for fast processing of images. The Cellular Neural Network (CNN) is a large-scale nonlinear analog circuit able to process signals in real time [1]. In this paper, we develop a new design in evaluation of image processing algorithms on the massively parallel GPUs with CNN implementation using Open Computing Language (OpenCL) programming model. This implementation uses the Discrete Time CNN (DT-CNN) model which is derived from originally proposed CNN model. The inherent massive parallelism of CNN along with GPUs makes it an advantage for high performance computing platform [2]. The advantage of OpenCL makes the design to be portable on all the available graphics processing devices and multi core processors. Performance evaluation is done in terms of execution time with both device (i.e. GPU) and host (i.e. CPU).","2324-8335","978-1-4577-0762-9","10.1109/INDS.2011.6024781","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6024781","Image processing;Hardware accelerators;Cellular Neural Networks;GPUs;High Performance Computing;OpenCL","Graphics processing unit;Mathematical model;Kernel;Image processing;Equations;Computer architecture","analogue circuits;cellular neural nets;computer graphic equipment;coprocessors;image processing;multiprocessing systems;parallel programming","CNN based high performance computing;real time image processing;hardware accelerator;graphical processing unit;cellular neural network;large-scale nonlinear analog circuit;signal processing;parallel GPU;open computing language programming model;discrete time CNN model;DT-CNN model;OpenCL;multicore processor;performance evaluation","","23","","17","","22 Sep 2011","","","IEEE","IEEE Conferences"
"Accelerating scientific applications using GPU's","M. Taher","Ain Shams University, Cairo, Egypt","2009 4th International Design and Test Workshop (IDT)","2 Feb 2010","2009","","","1","6","Graphics processing units (GPUs) have emerged as a powerful platform for high-performance computation. They have been successfully used to accelerate many scientific workloads. Typically, the computationally intensive parts of the application are offloaded to the GPU, which serves as the CPU's parallel coprocessor. The key to effective utilization of GPUs for scientific computing is the design and implementation of efficient data-parallel algorithms that can scale to hundreds of tightly coupled processing units. Many compute intensive scientific applications are well suited to GPUs, due to their extensive computational requirements, and because they lend themselves to parallel processing implementations. The use of multiple GPUs can bring even more computational power to bear on highly parallelizable computational problems. This paper discusses performance results for some fundamental cores of scientific applications such as fft, smith-waterman sequence alignment algorithm, and data encryption standard (DES) on the Nvidia GPUs using the CUDA programming model. Results have demonstrated acceleration up to 25 times speedup using a single G80 Nvidia GPU.","2162-061X","978-1-4244-5750-2","10.1109/IDT.2009.5404114","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5404114","","Acceleration;Yarn;Graphics;Concurrent computing;Hardware;Parallel processing;Computer architecture;Coprocessors;Computer applications;Cryptography","computer graphic equipment;coprocessors","graphics processing units;CPU parallel coprocessor;scientific computing;efficient data parallel algorithms;parallel processing;smith-waterman sequence alignment algorithm;data encryption standard;CUDA programming model;Nvidia GPU","","2","","11","","2 Feb 2010","","","IEEE","IEEE Conferences"
"A large-scale cross-architecture evaluation of thread-coarsening","A. Magni; C. Dubach; M. F. P. O'Boyle","University of Edinburgh, UK; University of Edinburgh, UK; University of Edinburgh, UK","SC '13: Proceedings of the International Conference on High Performance Computing, Networking, Storage and Analysis","14 Aug 2014","2013","","","1","11","OpenCL has become the de-facto data parallel programming model for parallel devices in today's high-performance supercomputers. OpenCL was designed with the goal of guaranteeing program portability across hardware from different vendors. However, achieving good performance is hard, requiring manual tuning of the program and expert knowledge of each target device. In this paper we consider a data parallel compiler transformation - thread-coarsening - and evaluate its effects across a range of devices by developing a source-to-source OpenCL compiler based on LLVM. We thoroughly evaluate this transformation on 17 benchmarks and five platforms with different coarsening parameters giving over 43,000 different experiments. We achieve speedups over 9x on individual applications and average speedups ranging from 1.15x on the Nvidia Kepler GPU to 1.50x on the AMD Cypress GPU. Finally, we use statistical regression to analyse and explain program performance in terms of hardware-based performance counters.","2167-4337","978-1-4503-2378-9","10.1145/2503210.2503268","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6877444","GPU;OpenCL;Thread coarsening;Regression trees","Instruction sets;Performance evaluation;Kernel;Hardware;Benchmark testing;Graphics processing units;Multicore processing","graphics processing units;multi-threading;program compilers;regression analysis;software architecture;software performance evaluation;software portability","large-scale cross-architecture evaluation;thread-coarsening parameters;de-facto data parallel programming model;high-performance supercomputers;program portability;data parallel compiler trans- formation;source-to-source OpenCL compiler;LLVM;Nvidia Kepler GPU;AMD Cypress GPU;statistical regression;program performance;hardware-based performance counters","","24","","28","","14 Aug 2014","","","IEEE","IEEE Conferences"
"StreamMR: An Optimized MapReduce Framework for AMD GPUs","M. Elteir; H. Lin; W. Feng; T. Scogland","City of Sci. Researches & Technol. Applic., Egypt; Dept. of Comput. Sci., Virginia Tech, Blacksburg, VA, USA; Dept. of Comput. Sci., Virginia Tech, Blacksburg, VA, USA; Dept. of Comput. Sci., Virginia Tech, Blacksburg, VA, USA","2011 IEEE 17th International Conference on Parallel and Distributed Systems","2 Jan 2012","2011","","","364","371","MapReduce is a programming model from Google that facilitates parallel processing on a cluster of thousands of commodity computers. The success of MapReduce in cluster environments has motivated several studies of implementing MapReduce on a graphics processing unit (GPU), but generally focusing on the NVIDIA GPU. Our investigation reveals that the design and mapping of the MapReduce framework needs to be revisited for AMD GPUs due to their notable architectural differences from NVIDIA GPUs. For instance, current state-of-the-art MapReduce implementations employ atomic operations to coordinate the execution of different threads. However, atomic operations can implicitly cause inefficient memory access, and in turn, severely impact performance. In this paper, we propose Streamer, an OpenCL MapReduce framework optimized for AMD GPUs. With efficient atomic-free algorithms for output handling and intermediate result shuffling, Stream MR is superior to atomic-based MapReduce designs and can outperform existing atomic-free MapReduce implementations by nearly five-fold on an AMD Radeon HD 5870.","1521-9097","978-0-7695-4576-9","10.1109/ICPADS.2011.131","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6121299","atomics;parallel computing;AMD GPU;GPGPU;MapReduce;Mars;MapCG;OpenCL","Instruction sets;Kernel;Mars;Graphics processing unit;Programming;High definition video;Optimization","graphics processing units;parallel processing;workstation clusters","StreamMR;optimized MapReduce framework;AMD GPU;programming model;parallel processing;commodity computers;cluster environments;graphics processing unit;NVIDIA GPU;OpenCL MapReduce framework;atomic-free algorithm","","20","1","19","","2 Jan 2012","","","IEEE","IEEE Conferences"
"Evaluating OpenMP 4.0's Effectiveness as a Heterogeneous Parallel Programming Model","M. Martineau; S. McIntosh-Smith; W. Gaudin","HPC Group, Univ. of Bristol, Bristol, UK; HPC Group, Univ. of Bristol, Bristol, UK; Atomic Weapons Establ., Aldermaston, UK","2016 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","4 Aug 2016","2016","","","338","347","Although the OpenMP 4.0 standard has been available since 2013, support for GPUs has been absent up until very recently, with only a handful of experimental compilers available. In this work we evaluate the performance of Cray's new NVIDIA GPU targeting implementation of OpenMP 4.0, with the mini-apps TeaLeaf, CloverLeaf and BUDE. We successfully port each of the applications, using a simple and consistent design throughout, and achieve performance on an NVIDIA K20X that is comparable to Cray's OpenACC in all cases. BUDE, a compute bound code, required 2.2x the runtime of an equivalently optimised CUDA code, which we believe is caused by an inflated frequency of control flow operations and less efficient arithmetic optimisation. Impressively, both TeaLeaf and CloverLeaf, memory bandwidth bound codes, only required 1.3x the runtime of hand-optimised CUDA implementations. Overall, we find that OpenMP 4.0 is a highly usable open standard capable of performant heterogeneous execution, making it a promising option for scientific application developers.","","978-1-5090-3682-0","10.1109/IPDPSW.2016.70","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7529889","high performance computing;parallel computing;application programming interfaces;OpenMP;performance portability","Standards;Graphics processing units;Performance evaluation;Complexity theory;Parallel processing;Parallel programming;Runtime","application program interfaces;graphics processing units;optimising compilers;parallel architectures;parallel programming;software performance evaluation","OpenMP 4.0 effectiveness evaluation;heterogeneous parallel programming model;OpenMP 4.0 standard;compilers;NVIDIA GPU targeting implementation;mini-apps;TeaLeaf;CloverLeaf;BUDE;NVIDIA K20X;OpenACC;BUDE;compute bound code;equivalently optimised CUDA code;control flow operations;arithmetic optimisation;memory bandwidth bound codes;hand-optimised CUDA implementations;heterogeneous execution;scientific application developers","","18","","19","","4 Aug 2016","","","IEEE","IEEE Conferences"
"The Research on Parallel Optimization of SAR Imaging R-D Algorithm Based on CUDA","P. Wei; J. Du; S. Sui; Y. Chen","Luoyang Electronic Equipment Test Center,LEETC, Luoyang, China; Luoyang Electronic Equipment Test Center,LEETC, Luoyang, China; Luoyang Electronic Equipment Test Center,LEETC, Luoyang, China; Luoyang Electronic Equipment Test Center,LEETC, Luoyang, China","2018 10th International Conference on Communication Software and Networks (ICCSN)","11 Oct 2018","2018","","","526","530","Synthetic Aperture Radar (SAR) imaging technology is widely used in the field of remote sensing observation, navigation positioning and so on, SAR imaging is large in data scale and long in operating time. Based on the Compute Unified Device Architecture (CUDA) programming model, the SAR imaging R-D algorithm is designed and implemented for parallel optimization on the CPU-GPU heterogeneous platform and tested on the GPU Tesla K20. The test shows that the efficiency of the core steps of R-D algorithm has been greatly improved.","2472-8489","978-1-5386-7223-5","10.1109/ICCSN.2018.8488250","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8488250","SAR;parallel optimization;CUDA programming model","Graphics processing units;Azimuth;Imaging;Instruction sets;Radar polarimetry;Radar imaging;Programming","graphics processing units;microprocessor chips;parallel architectures;radar imaging;synthetic aperture radar","parallel optimization;R-D algorithm;CUDA;Synthetic Aperture Radar imaging technology;remote sensing observation;navigation positioning;SAR imaging;data scale;Compute Unified Device Architecture;CPU-GPU heterogeneous platform","","","","13","","11 Oct 2018","","","IEEE","IEEE Conferences"
"Exploiting Task-Parallelism on GPU Clusters via OmpSs and rCUDA Virtualization","A. Castelló; R. Mayo; J. Planas; E. S. Quintana-Ortí","Dept. de Ing. y Cienc. de Comput., Univ. Jaume I, Castellon, Spain; Dept. de Ing. y Cienc. de Comput., Univ. Jaume I, Castellon, Spain; Barcelona Supercomput. Center, Barcelona, Spain; Dept. de Ing. y Cienc. de Comput., Univ. Jaume I, Castellon, Spain","2015 IEEE Trustcom/BigDataSE/ISPA","3 Dec 2015","2015","3","","160","165","OmpSs is a task-parallel programming model consisting of a reduced collection of OpenMP-like directives, a front-end compiler, and a runtime system. This directive-based programming interface helps developers accelerate their application's execution, e.g. in a cluster equipped with graphics processing units (GPUs), with a low programming effort. On the other hand, the virtualization package rCUDA provides seamless and transparent remote access to any CUDA GPU in a cluster, via the CUDA Driver and Runtime programming interfaces. In this paper we investigate the hurdles and practical advantages of combining these two technologies. Our experimental study targets two cluster configurations: a system where all the GPUs are located into a single cluster node, and a cluster with the GPUs distributed among the nodes. Two applications, the N-body particle simulation and the Cholesky factorization of a dense matrix, are employed to expose the bottlenecks and performance of a remote virtualization solution applied to these two OmpSs task-parallel codes.","","978-1-4673-7952-6","10.1109/Trustcom.2015.626","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7345642","Task parallelism;graphics processing units (GPUs);OmpSs;CUDA;remote virtualization","Graphics processing units;Servers;Virtualization;Runtime;Message systems;Programming;Instruction sets","device drivers;graphics processing units;matrix decomposition;parallel architectures;parallel programming;pattern clustering;program compilers;task analysis;virtualisation","OmpSs task parallel code;task parallel programming model;OpenMP-like directive;frontend compiler;runtime system;directive-based programming interface;application execution;graphics processing unit;GPU;rCUDA;CUDA driver;runtime programming interface;cluster configuration;single cluster node;N-body particle simulation;Cholesky factorization;dense matrix;remote virtualization package","","1","","20","","3 Dec 2015","","","IEEE","IEEE Conferences"
"A Translation Framework for Virtual Execution Environment on CPU/GPU Architecture","G. Dong; K. Chen; E. Zhu; Y. Zhang; Z. Qi; H. Guan","Sch. of Software, Shanghai Jiaotong Univ., Shanghai, China; Sch. of Inf. Security Eng., Shanghai Jiaotong Univ., Shanghai, China; Dept. of Comput. Sci. & Eng., Shanghai Jiaotong Univ., Shanghai, China; Sch. of Software, Shanghai Jiaotong Univ., Shanghai, China; Sch. of Software, Shanghai Jiaotong Univ., Shanghai, China; Dept. of Comput. Sci. & Eng., Shanghai Jiaotong Univ., Shanghai, China","2010 3rd International Symposium on Parallel Architectures, Algorithms and Programming","17 Feb 2011","2010","","","130","137","GPUs are many-core processors with tremendous computational power. However, as automatic parallelization has not been realized yet, developing high-performance parallel code for GPUs is still very challenging. The paper presents a novel translation framework designed for virtual execution environment based on CPU/GPU architecture. It addresses two major challenges of taking advantage of general purpose computation on graphics processing units (GPGPU) to improve performance: no rewriting the existing source code and resolving binary compatibility issues between different GPUs. The translation framework uses semi-automatic parallelization technology to port existing code to explicitly parallel programming models. It not only offers a mapping strategy from X86 platform to CUDA programming model, but also synchronizes the execution between the CPU and the GPUs. The input to our translation framework is parallelizable part of the program within binary code. With an additional information related to the parallelizable part, the translation framework transforms the sequential code into PTX code and execute it on GPUs. Experimental results on several programs from CUDA SDK Code Samples and Parboil Benchmark Suite show that our translation framework could achieve very high performance, even up to several tens of times speedup over the X86 native version.","2168-3042","978-1-4244-9482-8","10.1109/PAAP.2010.53","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5715074","GPGPU;Parallelization;Translator;CUDA","Graphics processing unit;Registers;Kernel;Instruction sets;Driver circuits;Programming;Computer architecture","computer graphic equipment;coprocessors;multiprocessing systems;parallel architectures","virtual execution environment;CPU-GPU Architecture;many core processors;X86 platform;CUDA programming model;CUDA SDK code samples;Parboil benchmark suite","","","1","25","","17 Feb 2011","","","IEEE","IEEE Conferences"
"Parallel quantum computer simulation on the GPU","A. Amariutei; S. Caraiman","Faculty of Automatic Control and Computer Engineering, Technical University of Iasi, Romania; Faculty of Automatic Control and Computer Engineering, Technical University of Iasi, Romania","15th International Conference on System Theory, Control and Computing","28 Nov 2011","2011","","","1","6","Simulation of quantum computers using classical computers is a hard problem with high memory and computational requirements. Parallelization can alleviate this problem, allowing the simulation of more qubits at the same time or the same number of qubits to be simulated in less time. A promising approach is to exploit the high performance computing capabilities provided by the latest graphical processing units. In this paper we present a parallel implementation of the QC-lib quantum computer simulator on the GPU using the CUDA programming model. The proposed scheme for partitioning the terms that describe the state of a quantum register takes advantage of the specific characteristics of the CUDA memory spaces and allows for an efficient parallelization of the general singe qubit operator. Experimental results indicate that very good speed-ups can be obtained in contrast with the sequential implementation.","","978-973-621-321-2","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6085728","","Quantum computing;Graphics processing unit;Computational modeling;Registers;Computers;Instruction sets;Quantum cascade lasers","computer graphic equipment;coprocessors;parallel programming;quantum computing","parallel quantum computer simulation;GPU;high performance computing capability;graphical processing unit;parallel implementation;QC-lib quantum computer simulator;CUDA programming model;quantum register","","","","33","","28 Nov 2011","","","IEEE","IEEE Conferences"
"Solving N-Queens problem on GPU architecture using OpenCL with special reference to synchronization issues","K. Thouti; S. R. Sathe","Dept. of Computer Science & Engg., Visvesvaraya National Institute of Technology, Nagpur, India; Dept. of Computer Science & Engg., Visvesvaraya National Institute of Technology, Nagpur, India","2012 2nd IEEE International Conference on Parallel, Distributed and Grid Computing","7 Feb 2013","2012","","","806","810","The N-Queens problem is to place N queens on an N × N chessboard such that no two queens attack each other. General purpose computing on graphics processing units (GPGPU) is fast becoming a common feature of high performance computing. This paper investigates cost of finding the solutions to N-Queens problem on GPGPU architecture using OpenCL programming model. We extensively analyze the N-Queen problem with respect to local, global memory parameters and atomicity and synchronization issues in OpenCL and its effects on performance. Experimental results are shown on NVidia Quadro FX 3800 GPU. Using Queens between 16 and 21, we observed average speedup of 20x.","","978-1-4673-2925-5","10.1109/PDGC.2012.6449926","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6449926","GPGPU;OpenCL;N-Queen problem;Parallel copmuting;Graphical processors","Performance evaluation;Graphics processing units;Artificial neural networks;Synchronization","application program interfaces;game theory;graphics processing units;multiprocessing systems;parallel architectures","many-core processor;NVidia Quadro FX 3800 GPU;synchronization issues;atomicity issues;global memory parameters;local memory parameters;OpenCL programming model;general purpose computing-on-graphics processing units;GPGPU architecture;N-queens problem","","6","","26","","7 Feb 2013","","","IEEE","IEEE Conferences"
"Efficient Parallel Preconditioned Conjugate Gradient Solver on GPU for FE Modeling of Electromagnetic Fields in Highly Dissipative Media","A. F. P. de Camargos; V. C. Silva; J. Guichon; G. Munier","Escola Politécnica da Universidade de São Paulo, São Paulo, Brazil; V. C. Silva is with the Escola Politécnica da Universidade de São Paulo, São Paulo, SP, 05508-010, Brazil; Laboratoire de Génie Electrique de Grenoble, CNRS, Saint Martin d'Hères, France; Laboratoire de Génie Electrique de Grenoble, CNRS, Saint Martin d'Hères, France","IEEE Transactions on Magnetics","26 Feb 2014","2014","50","2","569","572","We present a performance analysis of a parallel implementation of preconditioned conjugate gradient solvers using graphic processing units with compute unified device architecture programming model. The solvers were optimized for the solution of sparse systems of equations arising from finite-element analysis of electromagnetic phenomena involved in the diffusion of underground currents in both steady state and under time-harmonic current excitation. We used both shifted incomplete Cholesky factorization and incomplete LU factorization as preconditioners. The results show a significant speedup using the graphics processing unit compared with a serial CPU implementation.","1941-0069","","10.1109/TMAG.2013.2285091","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6749203","FEMs;graphic processing unit (GPU);linear systems;performance analysis","Graphics processing units;Linear systems;Mathematical model;Convergence;Silicon carbide;Computer architecture;Sparse matrices","absorbing media;electromagnetic fields;finite element analysis;graphics processing units;matrix decomposition","parallel preconditioned conjugate gradient solver;graphic processing units;GPU;electromagnetic fields;dissipative media;unified device architecture programming;sparse systems;finite element analysis;electromagnetic phenomena;underground currents;time-harmonic current excitation;Cholesky factorization;graphics processing unit","","12","","15","IEEE","26 Feb 2014","","","IEEE","IEEE Journals"
"Unlocking bandwidth for GPUs in CC-NUMA systems","N. Agarwal; D. Nellans; M. O'Connor; S. W. Keckler; T. F. Wenisch",University of Michigan; NVIDIA; NVIDIA; NVIDIA; University of Michigan,"2015 IEEE 21st International Symposium on High Performance Computer Architecture (HPCA)","9 Mar 2015","2015","","","354","365","Historically, GPU-based HPC applications have had a substantial memory bandwidth advantage over CPU-based workloads due to using GDDR rather than DDR memory. However, past GPUs required a restricted programming model where application data was allocated up front and explicitly copied into GPU memory before launching a GPU kernel by the programmer. Recently, GPUs have eased this requirement and now can employ on-demand software page migration between CPU and GPU memory to obviate explicit copying. In the near future, CC-NUMA GPU-CPU systems will appear where software page migration is an optional choice and hardware cache-coherence can also support the GPU accessing CPU memory directly. In this work, we describe the trade-offs and considerations in relying on hardware cache-coherence mechanisms versus using software page migration to optimize the performance of memory-intensive GPU workloads. We show that page migration decisions based on page access frequency alone are a poor solution and that a broader solution using virtual address-based program locality to enable aggressive memory prefetching combined with bandwidth balancing is required to maximize performance. We present a software runtime system requiring minimal hardware support that, on average, outperforms CC-NUMA-based accesses by 1.95 ×, performs 6% better than the legacy CPU to GPU memcpy regime by intelligently using both CPU and GPU memory bandwidth, and comes within 28% of oracular page placement, all while maintaining the relaxed memory semantics of modern GPUs.","2378-203X","978-1-4799-8930-0","10.1109/HPCA.2015.7056046","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7056046","","Graphics processing units;Bandwidth;Memory management;Hardware;Runtime;Random access memory","cache storage;graphics processing units;parallel processing;storage management","GPU-based HPC applications;GDDR memory;GPU kernel;on-demand software page migration;CC-NUMA GPU-CPU systems;hardware cache-coherence;memory-intensive GPU workloads;virtual address-based program locality;aggressive memory prefetching;bandwidth balancing;software runtime system;minimal hardware support;CPU memory bandwidth;GPU memory bandwidth;oracular page placement;GPU relaxed memory semantics","","54","1","44","","9 Mar 2015","","","IEEE","IEEE Conferences"
"Design evaluation of OpenCL compiler framework for Coarse-Grained Reconfigurable Arrays","H. Kim; M. Ahn; J. A. Stratton; W. W. Hwu","Electrical and Computer Engineering, University of Illinois at Urbana-Champaign, USA; Samsung Advanced Institute of Technology, San 14-1, Nongseo-dong, Giheung-gu, Yongin-si, Geyonggi-do, Korea; Electrical and Computer Engineering, University of Illinois at Urbana-Champaign, USA; Electrical and Computer Engineering, University of Illinois at Urbana-Champaign, USA","2012 International Conference on Field-Programmable Technology","17 Jan 2013","2012","","","313","320","OpenCL is undoubtedly becoming one of the most popular parallel programming languages as it provides a standardized and portable programming model. However, adopting OpenCL for Coarse-Grained Reconfigurable Arrays (CGRA) is challenging due to divergent architecture capability compared to GPUs. In particular, CGRAs are designed to accelerate loop execution by software pipelining on a grid of functional units exploiting instruction-level parallelism. This is vastly different from a GPU in that it executes data parallel kernels using a large number of parallel threads. Therefore, an OpenCL compiler and runtime for CGRAs must map the threaded parallel programming model to a loop-parallel execution model so that the architecture can best utilize its resources. In this paper, we propose and evaluate a design for an OpenCL compiler framework for CGRAs. The proposed design is composed of a serializer and post optimizer. The serializer transforms parallel execution of work-items to an equivalent loop-based iterative execution in order to avoid expensive multithreading on CGRAs. The resulting code is further optimized by the post optimizer to maximize the coverage of software-pipelinable innermost loops. In order to achieve the goal, various loop-level optimizations can take place in the post optimizer using the loops introduced by the serializer for iterative execution of OpenCL kernels. We provide an analysis of the propose framework from a set of well-studied standard OpenCL kernels by comparing performance of various implementations of benchmarks.","","978-1-4673-2845-6","10.1109/FPT.2012.6412155","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6412155","OpenCL;GPU;Coarse-Grained Reconfigurable Arrays;CGRA;Samsung Reconfigurable Processor;SRP;RP","Kernel;Computer architecture;Graphics processing units;Optimization;Programming;Hardware","multi-threading;optimising compilers;parallel languages;pipeline processing;reconfigurable architectures;software performance evaluation","design evaluation;OpenCL compiler framework;coarse-grained reconfigurable arrays;parallel programming languages;standardized programming model;portable programming model;CGRA;software pipelining;functional unit grid;instruction-level parallelism;parallel kernels;data execution;parallel threads;threaded parallel programming model;loop-parallel execution model;serializer;post optimizer;loop-based iterative execution;multithreading;innermost loop coverage maximization;loop-level optimizations;iterative OpenCL kernel execution","","6","","19","","17 Jan 2013","","","IEEE","IEEE Conferences"
"A programming model and runtime system for approximation-aware heterogeneous computing","I. Parnassos; N. Bellas; N. Katsaros; N. Patsiatzis; A. Gkaras; K. Kanellis; C. D. Antonopoulos; M. Spyrou; M. Maroudas","Electrical and Computer Engineering Department, University of Thessaly, Volos, Greece; Electrical and Computer Engineering Department, University of Thessaly, Volos, Greece; Electrical and Computer Engineering Department, University of Thessaly, Volos, Greece; Electrical and Computer Engineering Department, University of Thessaly, Volos, Greece; Electrical and Computer Engineering Department, University of Thessaly, Volos, Greece; Electrical and Computer Engineering Department, University of Thessaly, Volos, Greece; Electrical and Computer Engineering Department, University of Thessaly, Volos, Greece; Electrical and Computer Engineering Department, University of Thessaly, Volos, Greece; Electrical and Computer Engineering Department, University of Thessaly, Volos, Greece","2017 27th International Conference on Field Programmable Logic and Applications (FPL)","5 Oct 2017","2017","","","1","4","Heterogeneous platforms that include diverse architectures such as multicore CPUs, FPGAs and GPUs are becoming very popular due to their superior performance and energy efficiency. Besides heterogeneity, a promising approach for minimizing energy consumption is through approximate computing which relaxes the requirement that all parts of a program are considered equally important to the output quality, thus, all should be executed at full accuracy. Our work extends a traditional OpenMP-like programming model and runtime system to support seamless execution on hybrid architectures with approximation semantics. Starting from a common application code, annotated with our programming model, the programmer can not only target heterogeneous architectures comprising CPU, FPGA and GPU components, but can also regulate the amount of approximation. We evaluate our framework on a number of large-scale applications and demonstrate that the combination of heterogeneous and approximate computing can provide a powerful dynamic interplay between performance and output quality.","1946-1488","978-9-0903-0428-1","10.23919/FPL.2017.8056774","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8056774","","Field programmable gate arrays;Kernel;Runtime;Graphics processing units;Programming;Histograms","multiprocessing systems;parallel architectures;parallel programming;power aware computing","energy consumption;approximate computing;runtime system;hybrid architectures;approximation semantics;heterogeneous architectures;approximation-aware heterogeneous computing;energy efficiency;OpenMP-like programming model","","1","","8","","5 Oct 2017","","","IEEE","IEEE Conferences"
"Performance Models for Hybrid Programs Accelerated by GPUs","A. Sasidharan","Ansys, Inc,Lebanon,NH,USA","2021 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","24 Jun 2021","2021","","","641","651","This paper describes the use of statistical tools to model the performance of mixed device (hosts and devices) programs where hosts are CPUs and devices are GPUs. The purpose of GPUs is to accelerate compute-intensive sections of a program, thereby reducing total execution time, with side-effects including reduced machine usage and energy consumption. To model major and minor factors that affect the execution time of offloaded programs, we used a compute-intensive program with several GPU kernels. We have abstracted the hybrid program as a sequence of computations that access various types of memories (device caches, device shared memory, memory of other devices and host memory). In the programming model discussed, the role of a host is reduced to scheduling and coordinating execution of kernels across devices and communicating with other hosts. It can be extended to models where hosts perform computations or are obliterated. Experiments were designed to include a range of memory sizes and types. The performance models were trained, and their predictions were verified using test data.","","978-1-6654-3577-2","10.1109/IPDPSW52791.2021.00098","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9460650","Hybrid Programming Models;Multi-GPU architectures;Unified Memory;Performance Models;Statistics","Performance evaluation;Processor scheduling;Multiprocessor interconnection;Computational modeling;Graphics processing units;Programming;Tools","cache storage;graphics processing units;mathematics computing;message passing;multiprocessing systems;scheduling","offloaded programs;compute-intensive program;GPU kernels;hybrid program;device caches;host memory;programming model;scheduling;memory sizes;performance models;hybrid programs;GPU;statistical tools;mixed device;compute-intensive sections;total execution time;reduced machine usage;energy consumption","","","","37","","24 Jun 2021","","","IEEE","IEEE Conferences"
"A GPU-inspired soft processor for high-throughput acceleration","J. Kingyens; J. Gregory Steffan","Department of Electrical and Computer Engineering, University of Toronto, Canada; Department of Electrical and Computer Engineering, University of Toronto, Canada","2010 IEEE International Symposium on Parallel & Distributed Processing, Workshops and Phd Forum (IPDPSW)","24 May 2010","2010","","","1","8","There is building interest in using FPGAs as accelerators for high-performance computing, but existing systems for programming them are so far inadequate. In this paper we propose a soft processor programming model and architecture inspired by graphics processing units (GPUs) that are well-matched to the strengths of FPGAs, namely highly-parallel and pipelinable computation. In particular, our soft processor architecture exploits multithreading and vector operations to supply a floating-point pipeline of 64 stages via hardware support for up to 256 concurrent thread contexts. The key new contributions of our architecture are mechanisms for managing threads and register files that maximize data-level and instruction-level parallelism while overcoming the challenges of port limitations of FPGA block memories, as well as memory and pipeline latency. Through simulation of a system that (i) supports AMD's CTM r5xx GPU ISA [1], and (ii) is realizable on an XtremeData XD1000 FPGA-based accelerator system, we demonstrate that our soft processor can achieve 100% utilization of the deeply-pipelined floating-point datapath.","","978-1-4244-6534-7","10.1109/IPDPSW.2010.5470679","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5470679","","Acceleration;Field programmable gate arrays;Computer architecture;Memory management;Graphics processing unit;Multithreading;Hardware","computer graphic equipment;coprocessors;field programmable gate arrays;multi-threading;parallel processing;pipeline processing","high-throughput acceleration;soft processor programming;graphics processing units;pipelinable computation;highly-parallel computation;floating-point pipeline;multithreading process;instruction-level parallelism;AMD CTM r5xx GPU ISA;XtremeData XD1000 FPGA-based accelerator system;GPU","","7","","15","","24 May 2010","","","IEEE","IEEE Conferences"
"DistributedCL: A Framework for Transparent Distributed GPU Processing Using the OpenCL API","A. Tupinambá; A. Sztajnberg","Programa de Eng. Eletron. - PEL, Univ. do Estado do Rio de Janeiro - UERJ, Rio de Janeiro, Brazil; Dept. de Inf. e Cienc. da Comput., Univ. do Estado do Rio de Janeiro - UERJ, Rio de Janeiro, Brazil","2012 13th Symposium on Computer Systems","24 Dec 2012","2012","","","187","193","This paper presents the DistributedCL, a framework that provides the applications developed using the OpenCL interface location-transparent GPU processing. The application can explore distributed processing with no modification. The architecture of the framework and the programming model are presented, and the possible performance bottlenecks are discussed.","","978-1-4673-4468-5","10.1109/WSCAD-SSC.2012.36","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6391781","OpenCL;GPGPU;framework;distributed systems","Graphics processing units;Kernel;Computational modeling;Electronic mail;Linux;Distributed processing;Computer architecture","application program interfaces;graphics processing units","transparent distributed GPU processing;OpenCL API;DistributedCL;OpenCL interface location-transparent GPU processing;performance bottlenecks","","1","","20","","24 Dec 2012","","","IEEE","IEEE Conferences"
"Performance Analysis of Sequential and Parallel Programming Paradigms on CPU-GPUs Cluster","B. N. Chandrashekhar; H. A. Sanjay","Nitte Meenakshi Institute of Technology,Department of ISE,Bangalore,India,560064; Nitte Meenakshi Institute of Technology,Department of ISE,Bangalore,India,560064","2021 Third International Conference on Intelligent Communication Technologies and Virtual Mobile Networks (ICICV)","31 Mar 2021","2021","","","1205","1213","The entire world of parallel computing endured a change when accelerators are gradually embraced in today's high-performance computing cluster. A hybrid CPU-GPU cluster is required to speed up the complex computations by using parallel programming paradigms. This paper deals with performance evaluation of sequential, parallel and hybrid programming paradigms on the hybrid CPU-GPU cluster using the sorting strategies such as quick sort, heap sort and merge sort. In this research work performance comparison of C, MPI, and hybrid [MPI+CUDA] on CPU-GPUs hybrid systems are performed by using the sorting strategies. From the analysis it is observed that, the performance of parallel programming paradigm MPI is better when compared against sequential programming model. Also, research work evaluates the performance of CUDA on GPUs and hybrid programming model [MPI+CUDA] on CPU+GPU cluster using merge sort strategies and noticed that hybrid programming model [MPI+CUDA] has better performance against traditional approach and parallel programming paradigms MPI and CUDA When the overall performance of all three programming paradigms are compared, MPI+CUDA based on CPU+GPU environment gives the best speedup.","","978-1-6654-1960-4","10.1109/ICICV50876.2021.9388469","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9388469","Parallel programming pardigms;Performance model;hybrid parallel computing models;Central Processing Unit;compute unified device architecture;Graphics Processing Unit;message passing interface","Performance evaluation;Parallel programming;Computational modeling;Graphics processing units;Programming;Parallel processing;Sorting","application program interfaces;graphics processing units;merging;message passing;parallel architectures;parallel programming;pattern clustering;software performance evaluation;sorting","sorting strategies;quick sort;heap sort;parallel programming paradigm MPI;sequential programming model;hybrid programming model;performance analysis;parallel computing;high performance computing cluster;hybrid CPU GPU cluster;CUDA performance evaluation;merge sort strategies","","","","21","","31 Mar 2021","","","IEEE","IEEE Conferences"
"An MPI/GPU parallelization of an interior penalty discontinuous Galerkin time domain method for Maxwell's equations","S. Dosopoulos; J. D. Gardiner; J. Lee","Electrical and Computer Engineering Department, Ohio State University, Columbus, Ohio, USA.; Ohio Supercomputer Center, Columbus, Ohio, USA.; Electrical and Computer Engineering Department, Ohio State University, Columbus, Ohio, USA.","Radio Science","9 Dec 2016","2011","46","03","1","10","In this paper we discuss our approach to the MPI/GPU implementation of an Interior Penalty Discontinuous Galerkin Time domain (IPDGTD) method to solve the time dependent Maxwell's equations. In our approach, we exploit the inherent DGTD parallelism and describe a combined MPI/GPU and local time stepping implementation. This combination is aimed at increasing efficiency and reducing computational time, especially for multiscale applications. The CUDA programming model was used, together with non-blocking MPI calls to overlap communications across the network. A 10X speedup compared to CPU clusters is observed for double precision arithmetic. Finally, for p = 1 basis functions, a good scalability with parallelization efficiency of 85% for up to 40 GPUs and 80% for up to 160 CPU cores was achieved on the Ohio Supercomputer Center's Glenn cluster.","1944-799X","","10.1029/2011RS004689","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7776116","","Graphics processing units;Finite element analysis;Time-domain analysis;Scalability;Method of moments;Mathematical model;Hardware","","","","4","","","","9 Dec 2016","","","AGU","AGU Journals"
"Parallel implementation of Multi-dimensional Ensemble Empirical Mode Decomposition","L. Chang; M. Lo; N. Anssari; K. Hsu; N. E. Huang; W. W. Hwu","University of Illinois at Urbana-Champaign, USA 61801; National Central University, Chungli, Taiwan 32001; University of Illinois at Urbana-Champaign, USA 61801; National Central University, Chungli, Taiwan 32001; National Central University, Chungli, Taiwan 32001; University of Illinois at Urbana-Champaign, USA 61801","2011 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)","11 Jul 2011","2011","","","1621","1624","In this paper, we propose and evaluate two parallel implementations of Multi-dimensional Ensemble Empirical Mode Decomposition (MEEMD) for multi-core (CPU) and many-core (GPU) architectures. Relative to a sequential C implementation, our double precision GPU implementation, using the CUDA programming model, achieves up to 48.6x speedup on NVIDIA Tesla C2050. Our multi-core CPU implementation, using the OpenMP programming model, achieves up to 11.3x speedup on two octal-core Intel Xeon x7550 CPUs.","2379-190X","978-1-4577-0539-7","10.1109/ICASSP.2011.5946808","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5946808","Multi-dimensional Ensemble Empirical Mode Decomposition;GPGPU;OpenMP;CUDA","Graphics processing unit;Parallel processing;Instruction sets;Spline;Interpolation;Programming","computer graphic equipment;coprocessors;multiprocessing systems;parallel architectures;parallel programming","parallel implementation;multidimensional ensemble empirical mode decomposition;multicore architecture;many-core architecture;sequential C implementation;double precision GPU implementation;CUDA programming model;NVIDIA Tesla C2050;multicore CPU implementation;OpenMP programming model;octal-core Intel Xeon CPU","","15","","17","","11 Jul 2011","","","IEEE","IEEE Conferences"
"OpenCL - An effective programming model for data parallel computations at the Cell Broadband Engine","J. Breitbart; C. Fohry","Research Group Programming Languages / Methodologies, Universität Kassel, Germany; Research Group Programming Languages / Methodologies, Universität Kassel, Germany","2010 IEEE International Symposium on Parallel & Distributed Processing, Workshops and Phd Forum (IPDPSW)","24 May 2010","2010","","","1","8","Current processor architectures are diverse and heterogeneous. Examples include multicore chips, CPUs and the Cell Broadband Engine (CBE). The recent Open Compute Language (OpenCL) standard aims at efficiency and portability. This paper explores its efficiency when implemented on the CBE, without using CBE-specific features such as explicit asynchronous memory transfers. We based our experiments on two applications: matrix multiplication, and the client side of the Einstein@Home distributed computing project. Both were programmed in OpenCL, and then translated to the CBE. For matrix multiplication, we deployed different levels of OpenCL performance optimization, and observed that they pay off on the CBE. For the Einstein@Home application, our translated OpenCL version achieves almost the same speed as a native CBE version. Another main contribution of the paper is a proposal for an additional memory level in OpenCL, called static local memory. With little programming expense, it can lead to significant speedups such as factor seven for reduction. Finally, we studied two versions of the OpenCL to CBE mapping, in which the PPE component of the CBE does or does not take the role of a compute unit.","","978-1-4244-6534-7","10.1109/IPDPSW.2010.5470823","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5470823","","Parallel programming;Concurrent computing;Engines;Computer architecture;Multicore processing;Hardware;Computer languages;Distributed computing;Optimization;Proposals","computer graphics;coprocessors;matrix multiplication;parallel programming","programming model;data parallel computations;cell broadband engine;multicore chips;GPU;open compute language;explicit asynchronous memory transfers;matrix multiplication;Einstein@Home distributed computing project;static local memory","","7","","12","","24 May 2010","","","IEEE","IEEE Conferences"
"GraphReduce: processing large-scale graphs on accelerator-based systems","D. Sengupta; S. L. Song; K. Agarwal; K. Schwan",NA; NA; NA; NA,"SC '15: Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis","26 Jan 2017","2015","","","1","12","Recent work on real-world graph analytics has sought to leverage the massive amount of parallelism offered by GPU devices, but challenges remain due to the inherent irregularity of graph algorithms and limitations in GPU-resident memory for storing large graphs. We present GraphReduce, a highly efficient and scalable GPU-based framework that operates on graphs that exceed the device's internal memory capacity. GraphReduce adopts a combination of edge- and vertex-centric implementations of the Gather-Apply-Scatter programming model and operates on multiple asynchronous GPU streams to fully exploit the high degrees of parallelism in GPUs with efficient graph data movement between the host and device. GraphReduce-based programming is performed via device functions that include gatherMap, gatherReduce, apply, and scatter, implemented by programmers for the graph algorithms they wish to realize. Extensive experimental evaluations for a wide variety of graph inputs and algorithms demonstrate that GraphReduce significantly outperforms other competing out-of-memory approaches.","2167-4337","978-1-4503-3723-6","10.1145/2807591.2807655","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7832802","","Graphics processing units;Parallel processing;Programming;Memory management;Computational modeling;Acceleration;Partitioning algorithms","data handling;graph theory;parallel processing","GraphReduce;large-scale graphs processing;accelerator-based systems;graph analytics;parallelism;GPU devices;GPU-based framework;internal memory capacity;edge-centric implementations;vertex-centric implementations;gather-apply-scatter programming model;multiple asynchronous GPU streams;graph data movement;device functions;gatherMap;gatherReduce","","12","1","43","","26 Jan 2017","","","IEEE","IEEE Conferences"
"Student Session: Practical Insights on Acceleration for 3D Lidar Data Processing","I. Baek; K. Fuseini; R. R. Rajkumar",Carnegie Mellon University; Carnegie Mellon University; Carnegie Mellon University,"2020 IEEE 26th International Conference on Embedded and Real-Time Computing Systems and Applications (RTCSA)","22 Sep 2020","2020","","","1","2","3D Lidar has become a widely used sensor technology in autonomous vehicles by providing accurate distance information. However, lidar pointcloud processing often involves sophisticated algorithms, and takes a lot of computational power. Many prior approaches relied on a GPU-based parallel programming model, such as CUDA, to accelerate these computations. However, little attention has been given to comparing different methods for selecting the most-suited programming and parallelization approaches for a given computing system. We present our findings and insights identified by implementing various parallel approaches considering both CPUs and GPUs. We also demonstrate significant acceleration results using a real-world perception algorithm developed to detect road boundaries. Finally, we compare the pros and cons of each method in terms of system architecture, programming model, and resource utilization to yield a better understanding of choosing the best parallelization approach for a given optimization objective.","2325-1301","978-1-7281-4403-0","10.1109/RTCSA50079.2020.9203651","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9203651","","Graphics processing units;Data structures;Acceleration;Laser radar;Runtime;Sorting;Kernel","data structures;graphics processing units;optical information processing;optical radar;parallel programming","sensor technology;autonomous vehicles;accurate distance information;computational power;GPU-based parallel programming model;system architecture;parallelization approach;optimization objective;lidar point cloud processing;real-world perception algorithm;CUDA;CPUs;road boundaries detection;programming model;resource utilization;3D Lidar data processing acceleration","","","","2","","22 Sep 2020","","","IEEE","IEEE Conferences"
"Connecting the dots: Triangle completion and related problems on large data sets using GPUs","A. Chatterjee; S. Radhakrishnan; C. N. Sekharan","School of Computer Science, University of Oklahoma, Norman, USA; School of Computer Science, University of Oklahoma, Norman, USA; Department of Computer Science, Loyola University Chicago, Chicago, IL, USA","2014 IEEE International Conference on Big Data (Big Data)","8 Jan 2015","2014","","","1","8","Studying the properties of Online Social Networks (OSNs) and other real world graphs have gained importance due to the large amount of information available from them. These large graphs contain data that can be analyzed and effectively used in advertising, security and improving the overall experience of the users of these networks. However, the analysis of these graphs for studying specific properties requires combinatorially explosive number of computations. Compute Unified Device Architecture (CUDA) is a programming model available from Nvidia for solving general-purpose problems using the massively parallel and highly multi-threaded Graphics Processing Units (GPUs). Therefore, using GPUs to solve these types of problems is appropriate. In addition, due to the properties of real-world data, the graphs being considered are sparse and have irregular data dependencies. Hence, using efficient techniques to store the graph data for initial preprocessing and final computation by taking advantage of heterogeneous CPU-GPU systems can address these issues. In this paper, we are interested in studying different properties of these real-world entities that transform into the following graph problems: a) identifying a missing edge, which when added would result in maximum increase in the number of triangles, b) identifying an existing edge whose removal would result in the maximum decrease in the number of triangles, c) identifying an existing edge whose removal would increase the number of connected components in the graph. In this paper, we develop and implement algorithms to solve the above problems using both CPU and GPU. Specifically, given a graph G = (V, E), we provide algorithms for the following: a) find (vi, Vj) ∉ E, such that Δf - Δc is maximized, where Δf and Δc are the number of triangles in Gm = (V, E ∪(vi, Vj)) and G, respectively, b) find a (vi, Vj) ϵ E, such that Δc - Δf is maximized, where Δf and Δc are the number of triangles in Gm = (V, E \ (vi, Vj)) and G = (V, E), respectively, c) find a (vi, Vj) ϵ E, such that Φc > Φc, where Φc and Φc are the number of connected components in Gm = (V, E \ (vi, Vj)) and G = (V, E), respectively. We implement the algorithms using a GPU and achieve a 10 × speedup as compared to a sequential implementation. Thereafter, we design a heuristic for finding an edge whose existence would result in the maximum increase in the number of triangles. The heuristic is implemented and the results are reported and compared to those of the regular algorithm on the GPU.","","978-1-4799-5666-1","10.1109/BigData.2014.7004365","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7004365","Graph problems;Online Social Networks;Triangle completion;CUDA;GPU","Joining processes;Graphics processing units;Algorithm design and analysis;Social network services;Testing;Educational institutions;Advertising","computer graphics;graphics processing units;Internet","triangle completion;large data sets;online social networks;OSN;compute unified device architecture;CUDA;programming model;Nvidia;general-purpose problems;multithreaded graphics processing units;irregular data dependencies;graph data;heterogeneous CPU-GPU systems","","3","","18","","8 Jan 2015","","","IEEE","IEEE Conferences"
"Speculative execution on multi-GPU systems","G. Diamos; S. Yalamanchili","School of Electrical and Computer Engineering, Georgia Institute of Technology, Atlanta, Georgia 30332-0250; School of Electrical and Computer Engineering, Georgia Institute of Technology, Atlanta, Georgia 30332-0250","2010 IEEE International Symposium on Parallel & Distributed Processing (IPDPS)","24 May 2010","2010","","","1","12","The lag of parallel programming models and languages behind the advance of heterogeneous many-core processors has left a gap between the computational capability of modern systems and the ability of applications to exploit them. Emerging programming models, such as CUDA and OpenCL, force developers to explicitly partition applications into components (kernels) and assign them to accelerators in order to utilize them effectively. An accelerator is a processor with a different ISA and micro-architecture than the main CPU. These static partitioning schemes are effective when targeting a system with only a single accelerator. However, they are not robust to changes in the number of accelerators or the performance characteristics of future generations of accelerators. In previous work, we presented the Harmony execution model for computing on heterogeneous systems with several CPUs and accelerators. In this paper, we extend Harmony to target systems with multiple accelerators using control speculation to expose parallelism. We refer to this technique as Kernel Level Speculation (KLS). We argue that dynamic parallelization techniques such as KLS are sufficient to scale applications across several accelerators based on the intuition that there will be fewer distinct accelerators than cores within each accelerator. In this paper, we use a complete prototype of the Harmony runtime that we developed to explore the design decisions and trade-offs in the implementation of KLS. We show that KLS improves parallelism to a sufficient degree while retaining a sequential programming model. We accomplish this by demonstrating good scaling of KLS on a highly heterogeneous system with three distinct accelerator types and ten processors.","1530-2075","978-1-4244-6443-2","10.1109/IPDPS.2010.5470427","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5470427","","Parallel programming;Kernel;Parallel processing;Concurrent computing;Instruction sets;Robustness;Character generation;Control systems;Prototypes;Runtime","coprocessors;multiprocessing systems;parallel programming","speculative execution;multi-GPU systems;parallel programming models;parallel programming languages;heterogeneous many-core processors;computational capability;CUDA;OpenCL;application partitioning;components;accelerator;ISA;micro-architecture;Harmony execution model;kernel level speculation;dynamic parallelization techniques;Harmony runtime;sequential programming model;heterogeneous system","","12","","28","","24 May 2010","","","IEEE","IEEE Conferences"
"A GPU-Accelerated SVD Algorithm, Based on QR Factorization and Givens Rotations, for DWI Denoising","L. Marcellino; G. Navarra","Dept. of Sci. & Technol., Univ. of Naples Parthenope, Naples, Italy; Dept. of Sci. & Technol., Univ. of Naples Parthenope, Naples, Italy","2016 12th International Conference on Signal-Image Technology & Internet-Based Systems (SITIS)","24 Apr 2017","2016","","","699","704","In this work, we present a parallel implementation of the Singular Value Decomposition (SVD) method on Graphics Processing Units (GPUs) using CUDA programming model. Our approach is based on an iterative parallel version of the QR factorization by means Givens plane rotations using the Sameh and Kuck scheme. The parallel algorithm is driven by an outer loop executed on the CPU. Therefore, threads and blocks configuration is organized in order to use the shared memory and avoid multiple accesses to global memory. However, the main kernel provides coalesced accesses to global memory using contiguous indices. As case study, we consider the application of the SVD in the Overcomplete Local Principal Component Analysis (OLPCA) algorithm for the Diffusion Weighted Imaging (DWI) denoising process. Our results show significant improvements in terms of performances with respect to the CPU version that encourage its usability for this expensive application.","","978-1-5090-5698-9","10.1109/SITIS.2016.117","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7907544","SVD;QR factorization;Givens Rotations;GPGPU;PCA;DWI denoising","Matrix decomposition;Graphics processing units;Central Processing Unit;Noise reduction;Principal component analysis;Parallel algorithms;Image processing","biomedical MRI;graphics processing units;image denoising;matrix decomposition;medical image processing;parallel architectures;parallel programming;principal component analysis;singular value decomposition","GPU-accelerated SVD algorithm;DWI denoising;singular value decomposition;SVD method;graphics processing units;CUDA programming model;iterative parallel QR factorization;Givens plane rotations;Sameh-and-Kuck scheme;parallel algorithm;outer loop;thread configuration;block configuration;shared memory;global memory;contiguous indices;SVD;overcomplete local principal component analysis;OLPCA algorithm;diffusion weighted imaging denoising process;DWI denoising process;performance improvement;diffusion tensor imaging","","1","","24","","24 Apr 2017","","","IEEE","IEEE Conferences"
"Game developer's perspective on OpenCL","E. Schenk","EA, USA","2009 IEEE Hot Chips 21 Symposium (HCS)","26 May 2016","2009","","","1","44","Presents a collection of slides covering the following topics: game development; OpenCL; concurrent programming model; Amdahl's law; game experiences; memory objects; data flow; command queue; vectorization; scalar integrator; vector integrator; parallelism; GPU memory; and GPU device performance.","","978-1-4673-8873-3","10.1109/HOTCHIPS.2009.7478347","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7478347","","Art;Open systems;Data models;Games;Computer platforms;Concurrent computing;Standards;Computer graphics;Videos","computer games;concurrency control;graphics processing units;parallel programming;specification languages;storage management","game development;OpenCL;concurrent programming model;Amdahl law;game experience;memory objects;data flow;command queue;vectorization;scalar integrator;vector integrator;parallelism;GPU memory;GPU device performance;graphics processing unit","","","","","","26 May 2016","","","IEEE","IEEE Conferences"
"Efficient Data Communication between CPU and GPU through Transparent Partial-Page Migration","S. Zhang; Y. Yang; L. Shen; Z. Wang","Dept. of Comput. Sci. & Technol., Nat. Univ. of Defense Technol., Changsha, China; Dept. of Comput. Sci. & Technol., Nat. Univ. of Defense Technol., Changsha, China; Dept. of Comput. Sci. & Technol., Nat. Univ. of Defense Technol., Changsha, China; Dept. of Comput. Sci. & Technol., Nat. Univ. of Defense Technol., Changsha, China","2018 IEEE 20th International Conference on High Performance Computing and Communications; IEEE 16th International Conference on Smart City; IEEE 4th International Conference on Data Science and Systems (HPCC/SmartCity/DSS)","24 Jan 2019","2018","","","618","625","Despite the increasing investment in integrated GPUs and next-generation interconnect research, discrete GPUs connected by PCI Express still account for the dominant position of the market, the management of data communication between CPU and GPU continues to evolve. Initially, the programmer controls the data transfer between CPU and GPU explicitly. To simplify programming and enable system-wide atomic memory operations, GPU vendors have developed a programming model that provides a single virtual address space. The page migration engine in this model migrates pages between CPU and GPU on demand automatically. To meet the needs of high-performance workloads, the page size tends to be larger. Limited by low bandwidth and high latency interconnects, larger page migration has longer delay, which may reduce the overlap of computation and transmission and cause serious performance decline. In this paper, we propose partial-page migration that only migrates the requested part of a page to shorten the migration latency and avoid the performance degradation of the whole-page migration when the page becomes larger. Experiments show that partial-page migration is possible to significantly hide the performance overheads of whole-page migration when the page size is 2MB and the PCI Express bandwidth is 16GB/sec, converting an average 72.72× slowdown to a 1.29× speedup when compared with programmers controlled data transmission. Additionally, we examine the impact of page size on TLB miss rate and the performance impact of migration unit size on execution time, enabling designers to make informed decisions.","","978-1-5386-6614-2","10.1109/HPCC/SmartCity/DSS.2018.00112","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8622850","Unified Memory, Data Communication, Partial Page Migration","Graphics processing units;Data communication;Memory management;Bandwidth;Programming;Delays;Central Processing Unit","data communication;graphics processing units;paged storage","whole-page migration;PCI Express bandwidth;data transmission;transparent partial-page migration;next-generation interconnect research;system-wide atomic memory operations;GPU vendors;high-performance workloads;data communication","","1","","23","","24 Jan 2019","","","IEEE","IEEE Conferences"
"Acceleration of regular grid traversals using extended chessboard distance transformation on GPU","A. Es; V. Isler","Tubitak-Bilten, METU, Turkey; NA","Ninth International Conference on Computer Aided Design and Computer Graphics (CAD-CG'05)","13 Mar 2006","2005","","","8 pp.","","In the recent years graphics processing units (GPU) have evolved into general purpose programmable streaming parallel processors. This evolution makes it possible to implement high quality photo realistic rendering techniques on graphics processors. There have been a few studies to show how to map ray tracing to the GPU. Since graphics processors are not designed to process complex data structures, it is crucial to explore data structures and algorithms for efficient stream processing. In particular ray traversal is one of the most time consuming parts of ray tracing methods. In this work we focus on the efficient ray traversals on GPU. Several known techniques have been redesigned and adapted to the GPU programming model. Also a new traversal method based on extended anisotropic chessboard distance metric has been introduced.","","0-7695-2473-7","10.1109/CAD-CG.2005.16","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1604672","","Acceleration;Data structures;Ray tracing;Computer graphics;Anisotropic magnetoresistance;Concurrent computing;Rendering (computer graphics);Process design;Algorithm design and analysis;Parallel processing","coprocessors;parallel processing;rendering (computer graphics);ray tracing","regular grid traversals;chessboard distance transformation;GPU;graphics processing units;general purpose programmable streaming parallel processors;photo realistic rendering;ray tracing;ray traversals;anisotropic chessboard distance metric","","2","","18","","13 Mar 2006","","","IEEE","IEEE Conferences"
"Achieving High Performance on Supercomputers with a Sequential Task-based Programming Model","E. Agullo; O. Aumage; M. Faverge; N. Furmento; F. Pruvost; M. Sergent; S. P. Thibault","HiePACS, Inria Centre de recherche Bordeaux Sud-Ouest, 113923 Talence, Aquitaine France (e-mail: emmanuel.agullo@inria.fr); STORM, Inria Centre de recherche Bordeaux Sud-Ouest, 113923 Talence, Aquitaine France (e-mail: olivier.aumage@inria.fr); HiePACS, Bordeaux INP, Talence, Aquitaine France (e-mail: mathieu.faverge@inria.fr); STORM, LaBRI, TALENCE, Aquitaine France (e-mail: nathalie.furmento@labri.fr); HiePACS, Inria Centre de recherche Bordeaux Sud-Ouest, 113923 Talence, Aquitaine France (e-mail: florent.pruvost@inria.fr); STORM, Inria Centre de recherche Bordeaux Sud-Ouest, 113923 Talence, Aquitaine France (e-mail: marc.sergent@inria.fr); Computer science, LaBRI, TALENCE, - France 33405 (e-mail: samuel.thibault@u-bordeaux.fr)","IEEE Transactions on Parallel and Distributed Systems","","2017","PP","99","1","1","The emergence of accelerators as standard computing resources on supercomputers and the subsequent architectural complexity increase revived the need for high-level parallel programming paradigms. Sequential task-based programming model has been shown to efficiently meet this challenge on a single multicore node possibly enhanced with accelerators, which motivated its support in the OpenMP 4.0 standard. In this paper, we show that this paradigm can also be employed to achieve high performance on modern supercomputers composed of multiple such nodes, with extremely limited changes in the user code. To prove this claim, we have extended the StarPU runtime system with an advanced inter-node data management layer that supports this model by posting communications automatically. We illustrate our discussion with the task-based tile Cholesky algorithm that we implemented on top of this new runtime system layer. We show that it allows for very high productivity while achieving a performance competitive with both the pure Message Passing Interface (MPI)-based ScaLAPACK Cholesky reference implementation and the DPLASMA Cholesky code, which implements another (non sequential) task-based programming paradigm.","1558-2183","","10.1109/TPDS.2017.2766064","ANR SOLHAR(grant numbers:ANR-13-MONU-0007); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8226789","runtime system;sequential task flow;task-based programming;heterogeneous computing;distributed computing;multicore;GPU;Cholesky factorization","Runtime;Programming;Supercomputers;Libraries;Algorithm design and analysis;Productivity","","","","12","","","IEEE","19 Dec 2017","","","IEEE","IEEE Early Access Articles"
"Asynchronous Task-Based Execution of the Reverse Time Migration for the Oil and Gas Industry","A. AlOnazi; H. Ltaief; D. Keyes; I. Said; S. Thibault","King Abdullah University of Science and Technology,Extreme Computing Research Center,Thuwal,Jeddah 23955,Saudi Arabia; King Abdullah University of Science and Technology,Extreme Computing Research Center,Thuwal,Jeddah 23955,Saudi Arabia; King Abdullah University of Science and Technology,Extreme Computing Research Center,Thuwal,Jeddah 23955,Saudi Arabia; NVIDIA,Oil and Gas Department,Paris,France; Univ. Bordeaux,Talence,33400 France","2019 IEEE International Conference on Cluster Computing (CLUSTER)","7 Nov 2019","2019","","","1","11","We propose a new framework for deploying Reverse Time Migration (RTM) simulations on distributed-memory systems equipped with multiple GPUs. Our software, TB-RTM, infrastructure engine relies on the StarPU dynamic runtime system to orchestrate the asynchronous scheduling of RTM computational tasks on the underlying resources. Besides dealing with the challenging hardware heterogeneity, TB-RTM supports tasks with different workload characteristics, which stress disparate components of the hardware system. RTM is challenging in that it operates intensively at both ends of the memory hierarchy, with compute kernels running at the highest level of the memory system, possibly in GPU main memory, while I/O kernels are saving solution data to fast storage. We consider how to span the wide performance gap between the two extreme ends of the memory system, i.e., GPU memory and fast storage, on which large-scale RTM simulations routinely execute. To maximize hardware occupancy while maintaining high memory bandwidth throughout the memory subsystem, our framework presents the new-of-core (OOC) feature from StarPU to prefetch data solutions in and out not only from/to the GPU/CPU main memory but also from/to the fast storage system. The OOC technique may trigger opportunities for overlapping expensive data movement with computations. TB-RTM framework addresses this challenging problem of heterogeneity with a systematic approach that is oblivious to the targeted hardware architectures. Our resulting RTM framework can effectively be deployed on massively parallel GPU-based systems, while delivering performance scalability up to 500 GPUs.","2168-9253","978-1-7281-4734-5","10.1109/CLUSTER.2019.8891054","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8891054","Reverse Time Migration;Task-Based Programming Model;Out-Of-Core Algorithms;Asynchronous Executions;Overlapping I/O with Computation;STARPU OOC","Task analysis;Kernel;Computational modeling;Hardware;Runtime;Graphics processing units","gas industry;graphics processing units;multiprocessing systems;parallel processing;scheduling;shared memory systems;storage management","asynchronous task-based execution;oil and gas industry;distributed-memory systems;multiple GPUs;StarPU dynamic runtime system;asynchronous scheduling;RTM computational tasks;workload characteristics;hardware system;memory hierarchy;compute kernels;memory system;GPU main memory;large-scale RTM simulations;hardware occupancy;memory bandwidth;memory subsystem;data solutions;fast storage system;targeted hardware architectures;massively parallel GPU-based systems;RTM framework;hardware heterogeneity;reverse time migration simulation","","2","","49","","7 Nov 2019","","","IEEE","IEEE Conferences"
"Efficient integral image computation on the GPU","B. Bilgic; B. K. P. Horn; I. Masaki","Department of Electrical Engineering and Computer Science, MIT, Cambridge, MA 02139, USA; Department of Electrical Engineering and Computer Science and CSAIL, MIT, Cambridge, MA 02139, USA; Department of Electrical Engineering and Computer Science and MTL, MIT, Cambridge, MA 02139, USA","2010 IEEE Intelligent Vehicles Symposium","16 Aug 2010","2010","","","528","533","We present an integral image algorithm that can run in real-time on a Graphics Processing Unit (GPU). Our system exploits the parallelisms in computation via the NIVIDA CUDA programming model, which is a software platform for solving non-graphics problems in a massively parallel high-performance fashion. This implementation makes use of the work-efficient scan algorithm that is explicated in. Treating the rows and the columns of the target image as independent input arrays for the scan algorithm, our method manages to expose a second level of parallelism in the problem. We compare the performance of the parallel approach running on the GPU with the sequential CPU implementation across a range of image sizes and report a speed up by a factor of 8 for a 4 megapixel input. We further investigate the impact of using packed vector type data on the performance, as well as the effect of double precision arithmetic on the GPU.","1931-0587","978-1-4244-7868-2","10.1109/IVS.2010.5548142","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5548142","","Signal processing algorithms;Graphics processing unit;Parallel processing;Concurrent computing;Parallel programming;Central Processing Unit;Detectors","computer graphic equipment;coprocessors;image processing","integral image computation;graphics processing unit;NIVIDA CUDA programming model;nongraphics problems;scan algorithm;feature evaluation","","51","2","12","","16 Aug 2010","","","IEEE","IEEE Conferences"
"Database processing by Linear Regression on GPU using CUDA","J. B. Kulkarni; A. A. Sawant; V. S. Inamdar","Department of Computer Engineering and Information Technology, College of Engineering, Pune - 411001, India; Department of Computer Engineering and Information Technology, College of Engineering, Pune - 411001, India; Department of Computer Engineering and Information Technology, College of Engineering, Pune - 411001, India","2011 International Conference on Signal Processing, Communication, Computing and Networking Technologies","22 Sep 2011","2011","","","20","23","In today's era, there is a great importance to parallel programming to gain high performance in terms of time required for data computation. There are some constraints to achieve parallelism on CPU (Central Processing Unit). It is possible to achieve data parallelism by SIMD (Single Instruction Multiple Data) on General Purpose Graphics Processing Unit (GPGPU) integrated with Central Processing Unit (CPU). In Database processing, most of the research is going on. In this implementation, Linear Regression Algorithm is used to achieve parallelism in database processing on images using a programming model, Compute Unified Device Architecture (CUDA) which uses multithreading technique. Most of the time is required to perform various operations on huge content-based database e.g. to read big images, datasets, etc. Linear Regression is one of the algorithm to predict, forecast, mine huge amount of data. Linear Regression using CUDA can achieve high performance. Here, Linear Regression is implemented on Graphics Processing Unit (GPU) and on CPU to process image database for prediction of data by finding Covariance matrix, Eigen values and Eigen vectors. The strongest Eigen vector is the best fit line. The time spent for computation is compared in both the implementations.","","978-1-61284-653-8","10.1109/ICSCCN.2011.6024507","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6024507","Central Processing Unit;Graphics Processing Unit;CUDA;LTI;DirectX;Residual error;Sum of square;etc","Graphics processing unit;Linear regression;Central Processing Unit;Databases;Computer architecture;Covariance matrix;Programming","computer graphic equipment;coprocessors;covariance matrices;eigenvalues and eigenfunctions;multi-threading;regression analysis;visual databases","database processing;linear regression;CUDA;Compute Unified Device Architecture;parallel programming;central processing unit;CPU;data parallelism;SIMD;single instruction multiple data;GPGPU;general purpose graphics processing unit;image database;covariance matrix;eigenvalues;eigenvectors;multithreading technique","","3","","12","","22 Sep 2011","","","IEEE","IEEE Conferences"
================================================
FILE: notebooks/data/ieee_4.csv
================================================
"Document Title",Authors,"Author Affiliations","Publication Title",Date Added To Xplore,"Publication Year","Volume","Issue","Start Page","End Page","Abstract","ISSN",ISBNs,"DOI",Funding Information,PDF Link,"Author Keywords","IEEE Terms","INSPEC Controlled Terms","INSPEC Non-Controlled Terms","Mesh_Terms",Article Citation Count,Patent Citation Count,"Reference Count","License",Online Date,Issue Date,"Meeting Date","Publisher",Document Identifier
"Can GPGPU Programming Be Liberated from the Data-Parallel Bottleneck?","B. R. Gaster; L. Howes",Advanced Micro Devices; Advanced Micro Devices,"Computer","17 Aug 2012","2012","45","8","42","52","With the growth in transistor counts in modern hardware, heterogeneous systems are becoming commonplace. Core counts are increasing such that GPU and CPU designs are reaching deep into the tens of cores. For performance reasons, different cores in a heterogeneous platform follow different design choices. Based on throughput computing goals, GPU cores tend to support wide vectors and substantial register files. Current designs optimize CPU cores for latency, dedicating logic to caches and out-of-order dependence control. Heterogeneous parallel primitives (HPP) addresses two major shortcomings in current GPGPU programming models: it supports full composability by defining abstractions and increases flexibility in execution by introducing braided parallelism. Heterogeneous parallel primitives is an object-oriented, C++11-based programming model that addresses these shortcomings on both CPUs and massively multithreaded GPUs: it supports full composability by defining abstractions using distributed arrays and barrier objects, and it increases flexibility in execution by introducing braided parallelism. This paper implemented a feature-complete version of HPP, including all syntactic constructs, that runs on top of a task-parallel runtime executing on the CPU. They continue to develop and improve the model, including reducing overhead due to channel management, and plan to make a public version available sometime in the future.","1558-0814","","10.1109/MC.2012.257","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6272260","massively threaded computing systems;heterogeneous parallel primitives;braided parallelism;persistent threading;GPGPU programming;data-parallel execution;distributed arrays;hardware","Graphics processing unit;Programming;Performance evaluation;Parellel processing;Indexes;Hardware;Multithreading","C++ language;graphics processing units;integrated circuit design;multi-threading;object-oriented programming","GPGPU programming;data-parallel bottleneck;heterogeneous systems;core counts;GPU designs;CPU designs;heterogeneous parallel primitives;general-purpose computing-on-graphics processing units;object-oriented C++11-based programming model;distributed arrays;barrier objects;task-parallel runtime;channel management;braided parallelism","","24","2","16","","17 Aug 2012","","","IEEE","IEEE Magazines"
"CUDAsmith: A Fuzzer for CUDA Compilers","B. Jiang; X. Wang; W. K. Chan; T. H. Tse; N. Li; Y. Yin; Z. Zhang","Beihang University, China; Beihang University, China; City University of Hong Kong; The University of Hong Kong, Hong Kong; CAST; Beihang University, China; Chinese Academy of Sciences, China","2020 IEEE 44th Annual Computers, Software, and Applications Conference (COMPSAC)","22 Sep 2020","2020","","","861","871","CUDA is a parallel computing platform and programming model for the graphics processing unit (GPU) of NVIDIA. With CUDA programming, general purpose computing on GPU (GPGPU) is possible. However, the correctness of CUDA programs relies on the correctness of CUDA compilers, which is difficult to test due to its complexity. In this work, we propose CUDAsmith, a fuzzing framework for CUDA compilers. Our tool can randomly generate deterministic and valid CUDA kernel code with several different strategies. Moreover, it adopts random differential testing and EMI testing techniques to solve the test oracle problems of CUDA compiler testing. In particular, we lift live code injection to CUDA compiler testing to help generate EMI variants. Our fuzzing experiments with both the NVCC compiler and the Clang compiler for CUDA have detected thousands of failures, some of which have been confirmed by compiler developers. Finally, the cost-effectiveness of CUDAsmith is also thoroughly evaluated in our fuzzing experiment.","0730-3157","978-1-7281-7303-0","10.1109/COMPSAC48688.2020.0-156","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9202798","Compiler, compute unified device architecture (CUDA), differential testing, equivalence modulo inputs (EMI) testing, fuzzing, general purpose computing on graphics processing unit (GPGPU)","Graphics processing units;Kernel;Electromagnetic interference;Fuzzing;Tools;Computational modeling","computational complexity;graphics processing units;program compilers;program testing","CUDA programming;general purpose computing;GPU;CUDA programs;CUDA compilers;CUDAsmith;deterministic CUDA kernel code;random differential testing;test oracle problems;CUDA compiler testing;NVCC compiler;Clang compiler;compiler developers;parallel computing platform;programming model","","1","","29","","22 Sep 2020","","","IEEE","IEEE Conferences"
"Task-based parallel breadth-first search in heterogeneous environments","L. Munguía; D. A. Bader; E. Ayguade","Barcelona School of Informatics, Universitat Politècnica de Catalunya, Barcelona, Spain; College of Computing Georgia Institute of Technology, Atlanta GA 30332; Barcelona Supercomputing Center (BSC), Spain","2012 19th International Conference on High Performance Computing","25 Apr 2013","2012","","","1","10","Breadth-first search (BFS) is an essential graph traversal strategy widely used in many computing applications. Because of its irregular data access patterns, BFS has become a non-trivial problem hard to parallelize efficiently. In this paper, we introduce a parallelization strategy that allows the load balancing of computation resources as well as the execution of graph traversals in hybrid environments composed of CPUs and GPUs. To achieve that goal, we use a fine-grained task-based parallelization scheme and the OmpSs programming model. We obtain processing rates up to 2.8 billion traversed edges per second with a single GPU and a multi-core processor. Our study shows high processing rates are achievable with hybrid environments despite the GPU communication latency and memory coherence.","","978-1-4673-2371-0","10.1109/HiPC.2012.6507474","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6507474","","","graph theory;graphics processing units;multiprocessing systems;parallel processing;resource allocation;tree searching","task-based parallel breadth-first search;heterogeneous environment;BFS;graph traversal strategy;irregular data access pattern;parallelization strategy;load balancing;computation resource;hybrid environment;CPU;fine-grained task-based parallelization scheme;OmpSs programming model;processing rate;multicore processor;GPU communication latency;memory coherence","","16","1","15","","25 Apr 2013","","","IEEE","IEEE Conferences"
"SOLAR: Services-Oriented Learning Architectures","C. Wang; X. Li; Q. Yu; A. Wang; P. Hung; X. Zhou","Sch. of Comput. Sci., Univ. of Sci. & Technol. of China, Hefei, China; Sch. of Comput. Sci., Univ. of Sci. & Technol. of China, Hefei, China; Sch. of Comput. Sci., Univ. of Sci. & Technol. of China, Hefei, China; Sch. of Comput. Sci., Univ. of Sci. & Technol. of China, Hefei, China; Sch. of Comput. Sci., Univ. of Sci. & Technol. of China, Hefei, China; Sch. of Comput. Sci., Univ. of Sci. & Technol. of China, Hefei, China","2016 IEEE International Conference on Web Services (ICWS)","1 Sep 2016","2016","","","662","665","Deep learning has been an emerging field of machine learning during past decades. However, the diversity and large scale data sizes have posed significant challenge to construct a flexible and high efficient implementations of deep learning neural networks. In order to improve the performance as well to maintain the scalability, in this paper we present SOLAR, a services-oriented deep learning architecture using various accelerators like GPU and FPGA based approaches. SOLAR provides a uniform programming model to users so that the hardware implementation and the scheduling is invisible to the programmers. At runtime, the services can be executed either on the software processors or the hardware accelerators. Experimental results on the real state-of-the-art FPGA board demonstrate that the SOLAR is able to provide a ubiquitous framework for diverse applications without increasing the burden of the programmers. Moreover, the speedup of the GPU and FPGA hardware accelerator in SOLAR can achieve significant speedup comparing to the conventional Intel i5 processors with great scalability.","","978-1-5090-2675-3","10.1109/ICWS.2016.91","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7558064","Services-oriented Architecture;Deep Learning;Neural Network;Accelerator","Hardware;Machine learning;Field programmable gate arrays;Computer architecture;Graphics processing units;Service-oriented architecture","field programmable gate arrays;graphics processing units;learning (artificial intelligence);multiprocessing systems;neural nets;service-oriented architecture","SOLAR;machine learning;deep learning neural networks;services-oriented deep learning architecture;GPU;FPGA based approaches;uniform programming model;ubiquitous framework;Intel i5 processors","","7","","9","","1 Sep 2016","","","IEEE","IEEE Conferences"
"Massively Parallel Network Coding on GPUs","X. Chu; K. Zhao; M. Wang","Department of Computer Science, Hong Kong Baptist University, Hong Kong, P.R.C, chxw@comp.hkbu.edu.hk; Department of Computer Science, Hong Kong Baptist University, Hong Kong, P.R.C, kyzhao@comp.hkbu.edu.hk; Department of Computer Science, University of Calgary, Alberta, Canada, meawang@ucalgary.ca","2008 IEEE International Performance, Computing and Communications Conference","9 Jan 2009","2008","","","144","151","Network coding has recently been widely applied in various networks for system throughput improvement and/or resilience to network dynamics. However, the computational overhead introduced by the network coding operations is not negligible and has become the cornerstone for real deployment of network coding. In this paper, we exploit the computing power of contemporary Graphic Processing Units (GPUs) to accelerate the network coding operations. We proposed three parallel algorithms that maximize the parallelism of the encoding and decoding processes, i.e., the power of GPUs is fully utilized. This paper also shares our optimization design choices and our workarounds to the challenges encountered in working with GPUs. With our implementation of the algorithms, we are able to achieve up to 12 times of speedup over the highly optimized CPU counterpart, using the NVIDIA GPU and the Computer Unified Device Architecture (CUDA) programming model.","2374-9628","978-1-4244-3368-1","10.1109/PCCC.2008.4745113","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4745113","Network coding;GPU computing;CUDA","Network coding;Computer networks;Throughput;Resilience;Graphics;Acceleration;Parallel algorithms;Parallel processing;Encoding;Decoding","microprocessor chips;parallel algorithms","massively parallel network coding;system throughput improvement;graphic processing units;parallel algorithms;NVIDIA GPU;computer unified device architecture programming","","22","","21","","9 Jan 2009","","","IEEE","IEEE Conferences"
"The Intel® Many Integrated Core Architecture","A. Duran; M. Klemm",Intel Corporation; Intel Corporation,"2012 International Conference on High Performance Computing & Simulation (HPCS)","16 Aug 2012","2012","","","365","366","In recent years, an observable trend in High Performance Computing (HPC) architectures has been the inclusion of accelerators, such as GPUs and field programmable arrays (FPGAs), to improve the performance of scientific applications. To rise to this challenge Intel announced the Intel® Many Integrated Core Architecture (Intel® MIC Architecture). In contrast with other accelerated platforms, the Intel MIC Architecture is a general purpose, manycore coprocessor that improves the programmability of such devices by supporting the well-known shared-memory execution model that is the base of most nodes in HPC machines. In this presentation, we will introduce key properties of the Intel MIC Architecture and we will also cover programming models for parallelization and vectorization of applications targeting this architecture.","","978-1-4673-2362-8","10.1109/HPCSim.2012.6266938","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6266938","","Coprocessors;Computer architecture;Microwave integrated circuits;Programming;Hardware;Program processors;Syntactics","field programmable gate arrays;graphics processing units;parallel architectures;shared memory systems","Intel many integrated core architecture;high performance computing;accelerators;GPU;field programmable arrays;Intel MIC architecture;many core coprocessor;shared-memory execution model;programming model;parallelization;vectorization","","48","1","2","","16 Aug 2012","","","IEEE","IEEE Conferences"
"Monte Carlo simulation of X-ray imaging using a graphics processing unit","A. Badal; A. Badano","U.S. Food and Drug Administration, Division of Imaging and Applied Mathematics, Office of Science and Engineering Laboratories, Center for Devices and Radiological Health, Silver Spring, MD 20993-0002 USA; U.S. Food and Drug Administration, Division of Imaging and Applied Mathematics, Office of Science and Engineering Laboratories, Center for Devices and Radiological Health, Silver Spring, MD 20993-0002 USA","2009 IEEE Nuclear Science Symposium Conference Record (NSS/MIC)","29 Jan 2010","2009","","","4081","4084","A code for Monte Carlo simulations of radiation transport using a Graphics Processing Unit (GPU) is introduced. The code has been developed using the CUDA¿ programming model, an extension to the C language that allows the execution of general purpose computations on the new generation of GPUs from NVIDIA. The accurate Compton and Rayleigh interaction models and interaction mean free paths from the PENELOPE package, and a generic voxelized geometry model, have been implemented in the new code. The secondary particles generated by Compton, photoelectric and pair-production events are not transported. An ideal x-ray detector and a cone beam source can be defined to reproduce an imaging system and facilitate the simulations of medical imaging applications. A 24-fold speed up factor with the GPU compared to the CPU is reported for a radiographic projection of a detailed anthropomorphic female phantom. A description of the simulation algorithm and the technical implementation in the GPU are provided. This work shows that GPUs are already a good alternative to CPUs for Monte Carlo simulation of x-ray transport.","1082-3654","978-1-4244-3961-4","10.1109/NSSMIC.2009.5402382","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5402382","","X-ray imaging;Graphics;Solid modeling;Medical simulation;Packaging;Geometry;X-ray detectors;Optical imaging;Biomedical imaging;Central Processing Unit","biomedical imaging;Monte Carlo methods;radiography;X-ray detection;X-ray imaging","Monte Carlo simulation;X-ray imaging;graphics processing unit;radiation transport;CUDA¿ programming model;general purpose computations;Compton interaction model;Rayleigh interaction model;PENELOPE package;generic voxelized geometry model;X-ray detector;cone beam source;imaging system;medical imaging applications;radiographic projection;anthropomorphic female phantom;simulation algorithm;X-ray transport","","13","","12","","29 Jan 2010","","","IEEE","IEEE Conferences"
"Improving 3D lattice boltzmann method stencil with asynchronous transfers on many-core processors","M. Q. Ho; C. Obrecht; B. Tourancheau; B. D. de Dinechin; J. Hascoet","CNRS, LIG UMR 5217, Grenoble Alps University, F-38058 Grenoble, France; Univ Lyon, CNRS, INSA-Lyon, Université Claude Bernard Lyon 1, CETHIL UMR5008, F-69621 Villeurbanne, France; CNRS, LIG UMR 5217, Grenoble Alps University, F-38058 Grenoble, France; Kalray S.A., F-38330 Montbonnot, France; Kalray S.A., F-38330 Montbonnot, France","2017 IEEE 36th International Performance Computing and Communications Conference (IPCCC)","5 Feb 2018","2017","","","1","9","CPU-based many-core processors present an alternative to multicore CPU and GPU processors. In particular, the 93-Petaflops Sunway supercomputer, built from clustered many-core processors, has opened a new era for high performance computing that does not rely on GPU acceleration. However, memory bandwidth remains the main challenge for these architectures. This motivates our endeavor for optimizing one of the most data-intensive kind of stencil computations, namely the three-dimensional applications of the lattice Boltzmann method (LBM). We propose optimizations on many-cores processors by using local memory and asynchronous software-prefetching on a representative 3D LBM solver as an example. We achieve 33 % performance gain on the Kalray MPPA-256 many-core processor by actively streaming data from/to local memory, compared to the “passive” OpenCL programming model.","2374-9628","978-1-5090-6468-7","10.1109/PCCC.2017.8280472","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8280472","","Three-dimensional displays;Program processors;Lattices;Computer architecture;Bandwidth;Computational modeling;Kernel","graphics processing units;lattice Boltzmann methods;multiprocessing systems;parallel processing","3D lattice Boltzmann method stencil;many-core processor cluster;LBM;asynchronous software-prefetching;representative 3D LBM solver;data streaming;OpenCL programming;Kalray MPPA-256 many-core processor;local memory;many-cores processors;stencil computations;GPU acceleration;high performance computing;93-Petaflops Sunway supercomputer;GPU processors;CPU;asynchronous transfers","","","","15","","5 Feb 2018","","","IEEE","IEEE Conferences"
"Automating CUDA Synchronization via Program Transformation","M. Wu; L. Zhang; C. Liu; S. H. Tan; Y. Zhang",Southern University of Science and Technology; University of Texas at Dallas; University of Texas at Dallas; Southern University of Science and Technology; Southern University of Science and Technology,"2019 34th IEEE/ACM International Conference on Automated Software Engineering (ASE)","9 Jan 2020","2019","","","748","759","While CUDA has been the most popular parallel computing platform and programming model for general purpose GPU computing, CUDA synchronization undergoes significant challenges for GPU programmers due to its intricate parallel computing mechanism and coding practices. In this paper, we propose AuCS, the first general framework to automate synchronization for CUDA kernel functions. AuCS transforms the original LLVM-level CUDA program control flow graph in a semantic-preserving manner for exploring the possible barrier function locations. Accordingly, AuCS develops mechanisms to correctly place barrier functions for automating synchronization in multiple erroneous (challenging-to-be-detected) synchronization scenarios, including data race, barrier divergence, and redundant barrier functions. To evaluate the effectiveness and efficiency of AuCS, we conduct an extensive set of experiments and the results demonstrate that AuCS can automate 20 out of 24 erroneous synchronization scenarios.","2643-1572","978-1-7281-2508-4","10.1109/ASE.2019.00075","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8952529","CUDA;program repair;synchronization automation;program transformation","Graphics processing units;Synchronization;Computer bugs;Kernel;Instruction sets;Parallel processing;Computer science","flow graphs;graphics processing units;parallel architectures;parallel programming;program processors","CUDA synchronization;program transformation;parallel computing platform;general purpose GPU computing;GPU programmers;AuCS;CUDA kernel functions;original LLVM-level CUDA;program control flow graph;multiple erroneous synchronization scenarios","","5","","60","","9 Jan 2020","","","IEEE","IEEE Conferences"
"One Size Doesn't Fit All: Quantifying Performance Portability of Graph Applications on GPUs","T. Sorensen; S. Pai; A. F. Donaldson","Princeton University, USA,UC Santa Cruz,USA; University of Rochester,USA; Imperial College London,UK","2019 IEEE International Symposium on Workload Characterization (IISWC)","19 Mar 2020","2019","","","155","166","Hand-optimising graph algorithm code for different GPUs is particularly labour-intensive and error-prone, involving complex and ill-understood interactions between GPU chips, applications, and inputs. Although the generation of optimised variants has been automated through graph algorithm DSL compilers, these do not yet use an optimisation policy. Instead they defer to techniques like autotuning, which can produce good results, but at the expense of portability. In this work, we propose a methodology to automatically identify portable optimisation policies that can be tailored (“semi-specialised”) as needed over a combination of chips, applications and inputs. Using a graph algorithm DSL compiler that targets the OpenCL programming model, we demonstrate optimising graph algorithms to run in a portable fashion across a wide range of GPU devices for the first time. We use this compiler and its optimisation space as the basis for a large empirical study across 17 graph applications, 3 diverse graph inputs and 6 GPUs spanning multiple vendors. We show that existing automatic approaches for building a portable optimisation policy fall short on our dataset, providing trivial or biased results. Thus, we present a new statistical analysis which can characterise optimisations and quantify performance trade-offs at various degrees of specialisation. We use this analysis to quantify the performance tradeoffs as portability is sacrificed for specialisation across three natural dimensions: chip, application, and input. Compared to not optimising programs at all, a fully portable approach provides a 1.15× improvement in geometric mean performance, rising to 1.29 × when specialised to application and inputs (but not hardware). Furthermore, these semi-specialised optimisations provide insights into performance-critical features of specialisation. For example, optimisations specialised by chip reveal subtle, yet performance-critical, characteristics of various GPUs.","","978-1-7281-4045-2","10.1109/IISWC47752.2019.9042139","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9042139","","","graph theory;graphics processing units;program compilers;statistical analysis","hand-optimising graph algorithm code;GPU chips;graph algorithm DSL compiler;portable optimisation policies;graph algorithms;optimisation space;GPU;optimising programs;portable optimisation policy","","1","","33","","19 Mar 2020","","","IEEE","IEEE Conferences"
"Fast parallel cutoff pair interactions for molecular dynamics on heterogeneous systems","Q. Wu; C. Yang; T. Tang; K. Lu","School of Computer Science, National University of Defense Technology, Changsha 410073, China; School of Computer Science, National University of Defense Technology, Changsha 410073, China; School of Computer Science, National University of Defense Technology, Changsha 410073, China; School of Computer Science, National University of Defense Technology, Changsha 410073, China","Tsinghua Science and Technology","15 Jun 2012","2012","17","3","265","277","Heterogeneous systems with both Central Processing Units (CPUs) and Graphics Processing Units (GPUs) are frequently used to accelerate short-ranged Molecular Dynamics (MD) simulations. The most time-consuming task in short-ranged MD simulations is the computation of particle-to-particle interactions. Beyond a certain distance, these interactions decrease to zero. To minimize the operations to investigate distance, previous works have tiled interactions by employing the spatial attribute, which increases the memory access and GPU computations, hence decreasing performance. Other studies ignore the spatial attribute and construct an all-versus-all interaction matrix, which has poor scalability. This paper presents an improved algorithm. The algorithm first bins particles into voxels according to the spatial attributes, and then tiles the all-versus-all matrix into voxel-versus-voxel sub-matrixes. Only the sub-matrixes between neighboring voxels are computed on the GPU. Therefore, the algorithm reduces the distance examine operations and limits additional memory access and GPU computations. This paper also adopts a multi-level programming model to implement the algorithm on multi-nodes of Tianhe-lA. By employing (1) a patch design to exploit parallelism across the simulation domain, (2) a communication overlapping method to overlap the communications between CPUs and GPUs, and (3) a dynamic workload balancing method to adjust the workloads among compute nodes, the implementation achieves a speedup of 4.16× on one NVIDIA Tesla M2050 GPU compared to a 2.93 GHz six-core Intel Xeon X5670 CPU. In addition, it runs 2.41× faster on 256 compute nodes of Tianhe-lA (with two CPUs and one GPU inside a node) than on 256 GPU-excluded nodes.","1007-0214","","10.1109/TST.2012.6216756","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6216756","cutoff pair interactions;molecular dynamics;heterogeneous computing;GPU computing","Graphics processing unit;Instruction sets;Computational modeling;Heuristic algorithms;Computer architecture;Central Processing Unit","","","","1","","","","15 Jun 2012","","","TUP","TUP Journals"
"Integration of CUDA Processing within the C++ Library for Parallelism and Concurrency (HPX)","P. Diehl; M. Seshadri; T. Heller; H. Kaiser","Center for Comput. & Technol., Louisiana State Univ., Baton Rouge, LA, USA; Nanyang Technol. Univ., Singapore, Singapore; Center for Comput. & Technol., Louisiana State Univ., Baton Rouge, LA, USA; Center for Comput. & Technol., Louisiana State Univ., Baton Rouge, LA, USA","2018 IEEE/ACM 4th International Workshop on Extreme Scale Programming Models and Middleware (ESPM2)","14 Feb 2019","2018","","","19","28","Experience shows that on today's high performance systems the utilization of different acceleration cards in conjunction with a high utilization of all other parts of the system is difficult. Future architectures, like exascale clusters, are expected to aggravate this issue as the number of cores are expected to increase and memory hierarchies are expected to become deeper. One big aspect for distributed applications is to guarantee high utilization of all available resources, including local or remote acceleration cards on a cluster while fully using all the available CPU resources and the integration of the GPU work into the overall programming model. For the integration of CUDA code we extended HPX, a general purpose C++ run time system for parallel and distributed applications of any scale, and enabled asynchronous data transfers from and to the GPU device and the asynchronous invocation of CUDA kernels on this data. Both operations are well integrated into the general programming model of HPX which allows to seamlessly overlap any GPU operation with work on the main cores. Any user defined CUDA kernel can be launched on any (local or remote) GPU device available to the distributed application. We present asynchronous implementations for the data transfers and kernel launches for CUDA code as part of a HPX asynchronous execution graph. Using this approach we can combine all remotely and locally available acceleration cards on a cluster to utilize its full performance capabilities. Overhead measurements show, that the integration of the asynchronous operations (data transfer + launches of the kernels) as part of the HPX execution graph imposes no additional computational overhead and significantly eases orchestrating coordinated and concurrent work on the main cores and the used GPU devices.","","978-1-7281-0178-1","10.1109/ESPM2.2018.00006","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8638479","Asynchronous-many-task-systems-(ATM),-CUDA,-parallelism,-concurrency,-HPX","Graphics processing units;Kernel;C++ languages;Data transfer;Task analysis;Programming;Message systems","C++ language;concurrency (computers);graphics processing units;parallel architectures;parallel processing","local acceleration cards;remote acceleration cards;CUDA code;distributed application;asynchronous data transfers;asynchronous invocation;CUDA kernel;GPU operation;data transfer;HPX asynchronous execution graph;CUDA processing;high performance systems;exascale clusters;memory hierarchies;CPU resources;general purpose C++ run time system;parallel applications","","2","","26","","14 Feb 2019","","","IEEE","IEEE Conferences"
"Parallel computing with CUDA","M. Garland",NVIDIA,"2010 IEEE International Symposium on Parallel & Distributed Processing (IPDPS)","24 May 2010","2010","","","1","1","Summary form only given. NVIDIA's CUDA architecture provides a powerful platform for writing highly parallel programs. By providing simple abstractions for hierarchical thread organization, memories, and synchronization, the CUDA programming model allows programmers to write scalable programs without the burden of learning a multitude of new programming constructs. The CUDA architecture can support many languages and programming environments, including C, Fortran, OpenCL, and DirectX Compute. In this tutorial, I will provide an overview of modern GPU processor design and its implications for successful parallel programming models. I will present the programming model adopted by the CUDA architecture, and demonstrate how this is exposed in the C/C++ language. Finally, I will sketch some techniques for implementing common data-parallel algorithms in the CUDA model.","1530-2075","978-1-4244-6443-2","10.1109/IPDPS.2010.5470378","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5470378","","Parallel processing;Computer architecture;Visualization;Parallel programming;Multicore processing;Programming environments;Process design","C++ language;computer graphic equipment;coprocessors;parallel algorithms;parallel architectures;parallel programming","parallel computing;NVIDIA CUDA architecture;hierarchical thread organization;synchronization;C;Fortran;OpenCL;DirectX Compute;GPU processor design;parallel programming;C++ language;data parallel algorithms","","12","","","","24 May 2010","","","IEEE","IEEE Conferences"
"Programming for GPUs: The Directive-Based Approach","L. Grillo; F. De Sande; J. J. Fumero; R. Reyes","Dept. de EIO y Comput., Univ. de La Laguna, La Laguna, Spain; Dept. de EIO y Comput., Univ. de La Laguna, La Laguna, Spain; Inst. Tecnol. de Energias Renovables, Granadilla de Abona, Spain; Edinburgh Parallel Comput. Centre, Univ. of Edinburgh, Edinburgh, UK","2013 Eighth International Conference on P2P, Parallel, Grid, Cloud and Internet Computing","12 Dec 2013","2013","","","612","617","In the last years, hardware accelerators, such as GPUs have become ubiquitous in the HPC landscape and GPGPU has been massively adopted by the HPC research community. If something is slowing down further expansion of this technology are its difficulties in terms of programmability. Although several libraries and applications providing GPU support are available, the need of implementing new algorithms from scratch, or adapting sequential programs to accelerators, still exist. Writing programs to be executed on accelerators is not easy, particularly for non-expert developers coming from the science or engineering fields, as it requires deep understanding of the underlying architecture. Different alternatives have appeared aimed to diminish the GPU programming effort. In the wake of the success of OpenMP, several directive-oriented programming models have been created. Although future OpenMP releases will integrate accelerators, tools are needed in the meantime. In this work, we present a comparison of directive-based approaches for GPU platforms, hiCUDA, PGI Accelerator and OpenACC. For the last, in addition to the two commercial compilers available, we include results using accULL, our own OpenACC implementation. To illustrate the portability of these alternatives, we show performance figures for both Fermi and Kepler NVIDIA cards.","","978-0-7695-5094-7","10.1109/3PGCIC.2013.106","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6681300","OpenACC;GPGPU;Compilers;PGI;HMPP;accULL;CUDA","Graphics processing units;Kernel;Programming;Standards;Runtime;Parallel processing","graphics processing units;message passing;parallel architectures;program compilers;software libraries","hardware accelerator;HPC;sequential program;program execution;GPU programming;OpenMP;directive-oriented programming model;hiCUDA;PGI accelerator;OpenACC;compiler;accULL;Kepler NVIDIA card;Fermi card;program library","","1","","12","","12 Dec 2013","","","IEEE","IEEE Conferences"
"Use case analysis of OpenACC directives in the implementation of image processing algorithms","M. J. Mišić; D. D. Dašić; M. V. Tomašević","Elektroteh. Fak., Univ. u Beogradu, Belgrade, Serbia; Elektroteh. Fak., Univ. u Beogradu, Belgrade, Serbia; Elektroteh. Fak., Univ. u Beogradu, Belgrade, Serbia","2013 21st Telecommunications Forum Telfor (TELFOR)","20 Jan 2014","2013","","","959","962","Graphics processing units have been intensively used in general-purpose computations in the recent years. Although new programming models (CUDA, OpenCL) have been developed and widely applied to support GPU programming, they still impose demanding environments for those users who want to speed up their applications without the knowledge of low level details of the underlying hardware. To cope with this problem, the paper analyzes and evaluates the usage of OpenACC directive-based programming model in the case of image processing algorithms that are amenable for GPU execution.","","978-1-4799-1420-3","10.1109/TELFOR.2013.6716390","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6716390","","Graphics processing units;Computational modeling;Programming;Central Processing Unit;Kernel;Electronic mail;Image processing","graphics processing units;image processing","case analysis;OpenACC directives;image processing algorithms;graphics processing units programming;GPU programming;demanding environments","","1","","6","","20 Jan 2014","","","IEEE","IEEE Conferences"
"Hedgehog: Understandable Scheduler-Free Heterogeneous Asynchronous Multithreaded Data-Flow Graphs","A. Bardakoff; B. Bachelet; T. Blattner; W. Keyrouz; G. C. Kroiz; L. Yon","National Institute of Standards & Technology,Gaithersburg,MD,20899-8970; Université Clermont Auvergne, CNRS, LIMOS,Clermont-Ferrand,France,F-63000; National Institute of Standards & Technology,Gaithersburg,MD,20899-8970; National Institute of Standards & Technology,Gaithersburg,MD,20899-8970; University of Maryland,Department of Mathematics and Statistics,Baltimore,MD,USA,21250; ISIMA, CNRS, LIMOS,Clermont-Ferrand,France,F-63000","2020 IEEE/ACM 3rd Annual Parallel Applications Workshop: Alternatives To MPI+X (PAW-ATM)","29 Dec 2020","2020","","","1","15","Getting performance on high-end heterogeneous nodes is challenging. This is due to the large semantic gap between a computation's specification-possibly mathematical formulas or an abstract sequential algorithm-and its parallel implementation; this gap obscures the program's parallel structures and how it gains or loses performance. We present Hedgehog, a library aimed at coarse-grain parallelism. It explicitly embeds a dataflow graph in a program and uses this graph at runtime to drive the program's execution so it takes advantage of hardware parallelism (multicore CPUs and multiple accelerators). Hedgehog has asynchronicity built in. It statically binds individual threads to graph nodes, which are ready to fire when any of their inputs are available. This allows Hedgehog to avoid using a global scheduler and the loss of performance associated with global synchronizations and managing of thread pools. Hedgehog provides a separation of concerns and distinguishes between compute and state maintenance tasks. Its API reflects this separation and allows a developer to gain a better understanding of performance when executing the graph. Hedgehog is implemented as a C++ 17 headers-only library. One feature of the framework is its low overhead; it transfers control of data between two nodes in ≈ 1 μs. This low overhead combines with Hedgehog's API to provide essentially cost-free profiling of the graph, thereby enabling experimentation for performance, which enhances a developer's insight into a program's performance. Hedgehog's asynchronous data-flow graph supports a data streaming programming model both within and between graphs. We demonstrate the effectiveness of this approach by highlighting the performance of streaming implementations of two numerical linear algebra routines, which are comparable to existing libraries: matrix multiplication achieves >95 % of the theoretical peak of 4 GPUs; LU decomposition with partial pivoting starts streaming partial final result blocks 40× earlier than waiting for the full result. The relative ease and understandability of obtaining performance with Hedgehog promises to enable non-specialists to target performance on high-end single nodes.","","978-1-7281-5450-3","10.1109/PAWATM51920.2020.00006","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9306983","high performance computing, data-flow, heterogeneous computing, dataflow, pipelining, HPC, parallelism, heterogeneity, metaprogramming, C++, GPU","Task analysis;Libraries;Parallel processing;Hardware;Computational modeling;Signal processing algorithms;Tools","application program interfaces;data flow computing;data flow graphs;graph theory;linear algebra;matrix multiplication;multiprocessing systems;multi-threading;parallel algorithms;scheduling","coarse-grain parallelism;hardware parallelism;graph nodes;data streaming programming model;scheduler-free heterogeneous asynchronous multithreaded data-flow graphs;Hedgehog API;numerical linear algebra routines","","","","22","","29 Dec 2020","","","IEEE","IEEE Conferences"
"CLACC: Translating OpenACC to OpenMP in Clang","J. E. Denny; S. Lee; J. S. Vetter",Oak Ridge National Laboratory; Oak Ridge National Laboratory; Oak Ridge National Laboratory,"2018 IEEE/ACM 5th Workshop on the LLVM Compiler Infrastructure in HPC (LLVM-HPC)","14 Feb 2019","2018","","","18","29","OpenACC was launched in 2010 as a portable programming model for heterogeneous accelerators. Although various implementations already exist, no extensible, open-source, production-quality compiler support is available to the community. This deficiency poses a serious risk for HPC application developers targeting GPUs and other accelerators, and it limits experimentation and progress for the OpenACC specification. To address this deficiency, Clacc is a recent effort funded by the US Exascale Computing Project to develop production OpenACC compiler support for Clang and LLVM. A key feature of the Clacc design is to translate OpenACC to OpenMP to build on Clang's existing OpenMP compiler and runtime support. In this paper, we describe the Clacc goals and design. We also describe the challenges that we have encountered so far in our prototyping efforts, and we present some early performance results.","","978-1-7281-0188-0","10.1109/LLVM-HPC.2018.8639349","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8639349","OpenACC;OpenMP;LLVM;multicore;GPU;accelerators;source-to-source translation;compiler","Tools;Runtime;Ecosystems;Production;Programming;Graphics processing units;Computer architecture","parallel processing;program compilers;public domain software;software portability","OpenMP;portable programming model;heterogeneous accelerators;production-quality compiler support;OpenACC specification;US Exascale Computing Project;HPC application;CLACC;Clang;open-source software;OpenACC compiler support","","4","","20","","14 Feb 2019","","","IEEE","IEEE Conferences"
"MDACCER: Modified Distributed Assessment of the Closeness CEntrality Ranking in Complex Networks for Massively Parallel Environments","F. L. Cabral; C. Osthoff; D. Ramos; R. Nardes","Lab. Nac. de Comput. Cienc., Centro de Comput. de Alto Desempenho, Brazil; Lab. Nac. de Comput. Cienc., Centro de Comput. de Alto Desempenho, Brazil; Lab. Nac. de Comput. Cienc., Centro de Comput. de Alto Desempenho, Brazil; Lab. Nac. de Comput. Cienc., Centro de Comput. de Alto Desempenho, Brazil","2015 International Symposium on Computer Architecture and High Performance Computing Workshop (SBAC-PADW)","3 Mar 2016","2015","","","43","48","We propose a new method derived from DACCER (Distributed Assessment of the Closeness CEntrality Ranking): the modified DACCER (MDACCER), for assessing traditional closeness centrality ranking. MDACCER presents a relaxation that allows it to take advantage of massively parallel environments like General Purpose Graphics Processing Units (GPGPUs). Traditional DACCER proposal assesses Closeness centrality ranking in a limited neighborhood using only information around each node at low computational cost and capability to be executed in a distributed environment. Despite all the advantages, DACCER presents some difficulties in GPGPUs programming model that increases its computational cost at this particular environment. In contrast to the poor performance of DACCER on GPGPUs, experimental results demonstrate MDACCER is as simple and efficient as DACCER to assess Closeness centrality ranking in complex networks and moreover it does not have the same bottlenecks in GPGPUs computing about memory usage and time complexity. We performed MDACCER for some synthetically generated networks, specifically Barabási-Albert ones and results indicate MADCCER correlates Closeness centrality ranking almost as well as DACCER does with lower computational costs.","","978-1-4673-8621-0","10.1109/SBAC-PADW.2015.28","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7423179","Parallel Computing;Network Centrality Ranking;DACCER;Closeness;GPU;CUDA","Correlation;Kernel;Proposals;Computational efficiency;Computer architecture;Complex networks;Graphics processing units","complex networks;computational complexity;graphics processing units;parallel programming","time complexity;GPGP programming model;general purpose graphics processing unit;modified DACCER;massively parallel environment;complex network;closeness centrality ranking;MDACCER;modified distributed assessment","","","","13","","3 Mar 2016","","","IEEE","IEEE Conferences"
"High-Performance Graph Analytics on Manycore Processors","G. M. Slota; S. Rajamanickam; K. Madduri","Comput. Sci. & Eng., Pennsylvania State Univ., University Park, PA, USA; Scalable Algorithms Dept., Sandia Nat. Labs., Albuquerque, NM, USA; Comput. Sci. & Eng., Pennsylvania State Univ., University Park, PA, USA","2015 IEEE International Parallel and Distributed Processing Symposium","20 Jul 2015","2015","","","17","27","The divergence in the computer architecture landscape has resulted in different architectures being considered mainstream at the same time. For application and algorithm developers, a dilemma arises when one must focus on using underlying architectural features to extract the best performance on each of these architectures, while writing portable code at the same time. We focus on this problem with graph analytics as our target application domain. In this paper, we present an abstraction-based methodology for performance-portable graph algorithm design on manicure architectures. We demonstrate our approach by systematically optimizing algorithms for the problems of breadth-first search, color propagation, and strongly connected components. We use Kokkos, a manicure library and programming model, for prototyping our algorithms. Our portable implementation of the strongly connected components algorithm on the NVIDIA Tesla K40M is up to 3.25× faster than a state-of-the-art parallel CPU implementation on a dual-socket Sandy Bridge compute node.","1530-2075","978-1-4799-8649-1","10.1109/IPDPS.2015.54","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7161272","graph computations;BFS;color propagation;GPU;parallel performance;portability","Instruction sets;Silicon;Optimization;Synchronization;Color;Arrays;Parallel processing","feature extraction;graph theory;multiprocessing systems;parallel architectures;tree searching","high-performance graph analytics;manycore processors;computer architecture landscape;architectural feature extraction;portable code writing;abstraction-based methodology;performance-portable graph algorithm design;manicure architectures;breadth-first search problems;color propagation;optimizing algorithms;Kokkos manicure library;programming model;strongly connected components algorithm;NVIDIA Tesla K40M;parallel CPU;dual-socket Sandy Bridge compute node","","8","","37","","20 Jul 2015","","","IEEE","IEEE Conferences"
"Real-time block matching motion estimation onto GPGPU","E. Monteiro; M. Maule; F. Sampaio; C. Diniz; B. Zatt; S. Bampi","Informatics Institute - PPGC - PGMICRO, Federal University of Rio Grande do Sul (UFRGS) - Porto Alegre, Brazil; Informatics Institute - PPGC - PGMICRO, Federal University of Rio Grande do Sul (UFRGS) - Porto Alegre, Brazil; Informatics Institute - PPGC - PGMICRO, Federal University of Rio Grande do Sul (UFRGS) - Porto Alegre, Brazil; Informatics Institute - PPGC - PGMICRO, Federal University of Rio Grande do Sul (UFRGS) - Porto Alegre, Brazil; Informatics Institute - PPGC - PGMICRO, Federal University of Rio Grande do Sul (UFRGS) - Porto Alegre, Brazil; Informatics Institute - PPGC - PGMICRO, Federal University of Rio Grande do Sul (UFRGS) - Porto Alegre, Brazil","2012 19th IEEE International Conference on Image Processing","21 Feb 2013","2012","","","1693","1696","This work presents an efficient method to map Motion Estimation (ME) algorithms onto General Purpose Graphic Processing Unit (GPGPU) architectures using CUDA programming model. Our method jointly exploits the massive parallelism available in current GPGPU devices and the parallelization potential of ME algorithms: Full Search (FS) and Diamond Search (DS). Our main goal is to evaluate the feasibility of achieving real-time high-definition video encoding performance running on GPUs. For comparison reasons, multi-core parallel and distributed versions of these algorithms were developed using OpenMP and MPI (Message Passing Interface) libraries, respectively. The CUDA-based solutions achieve the highest speed-up in comparison with OpenMP and MPI versions for both algorithms and, when compared to the state-of-the-art, our FS and DS solutions reach up to 18x and 11x speed-up, respectively.","2381-8549","978-1-4673-2533-2","10.1109/ICIP.2012.6467204","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6467204","Motion Estimation;Block Matching Algorithms;GPU;CUDA;OpenMP;MPI","Graphics processing units;Motion estimation;Algorithm design and analysis;Computer architecture;Real-time systems;Diamonds;Programming","application program interfaces;graphics processing units;image matching;message passing;motion estimation;multiprocessing systems;parallel algorithms;parallel architectures;parallel programming;search problems;video coding","real-time block matching motion estimation;map motion estimation algorithms;general purpose graphic processing unit architectures;GPGPU architectures;CUDA programming model;GPGPU devices;parallelization potential;full search;diamond search;real-time high-definition video encoding performance;multicore parallel algorithms;distributed algorithms;MPI libraries;OpenMP libraries;message passing interface libraries;CUDA-based solutions;DS solutions;FS solutions","","9","","13","","21 Feb 2013","","","IEEE","IEEE Conferences"
"Locality-Aware Scheduling for Scalable Heterogeneous Environments","A. V. Kamatar; R. D. Friese; R. Gioiosa","Pacific Northwest National Laboratory,High Performance Computing,Richland,US; Pacific Northwest National Laboratory,High Performance Computing,Richland,US; Pacific Northwest National Laboratory,High Performance Computing,Richland,US","2020 IEEE/ACM International Workshop on Runtime and Operating Systems for Supercomputers (ROSS)","29 Dec 2020","2020","","","50","58","Heterogeneous computing promise boost performance of scientific applications by allowing massively parallel execution of computational tasks. However, manually managing extremely heterogeneous, multi-device systems is complicated and may result in sub-optimal performance. Specifically, data management is an extremely challenging problem on multi-device systems. In this work, we introduce two locality-aware schedulers for the Minos Computing Library (MCL), an asynchronous, task-based programming model and runtime for extremely heterogeneous systems. The first scheduler implements a pure locality-aware algorithm to maximize data reuse, though it might incur in “hot-spots” that limit system utilization. The second scheduler mitigates this drawback by dynamically targeting between locality-awareness and system utilization based on the current workload and available computing devices. Our results show that locality-awareness greatly benefit applications that exhibit data reuse, providing up to 6.9x and 7.9x over the original MCL scheduler and equivalent OpenCL implementations, respectively. Moreover, our schedulers introduce negligible overhead compared with the original MCL scheduler and achieve similar performance for applications that don't benefit from data locality.","","978-1-6654-2268-0","10.1109/ROSS51935.2020.00011","Research and Development; Advanced Scientific Computing Research; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9307939","heterogeneous computing, gpu, gpgpu, openCL","Task analysis;Performance evaluation;Runtime;Programming;Computational modeling;Round robin;Graphics processing units","multiprocessing systems;parallel architectures;parallel processing;parallel programming;resource allocation;scheduling;shared memory systems","pure locality-aware algorithm;limit system utilization;locality-awareness;available computing devices;exhibit data reuse;original MCL scheduler;data locality;locality-aware scheduling;scalable heterogeneous environments;heterogeneous computing promise;scientific applications;massively parallel execution;computational tasks;multidevice systems;sub-optimal performance;data management;extremely challenging problem;locality-aware schedulers;Minos Computing Library;task-based programming model;extremely heterogeneous systems","","1","","31","","29 Dec 2020","","","IEEE","IEEE Conferences"
"Implementation and Optimization of a 1D2V PIC Method for Nonlinear Kinetic Models on GPUs","M. Korch; P. Raithel; T. Werner","University of Bayreuth,Department of Computer Science,Bayreuth,Germany,95440; University of Bayreuth,Department of Computer Science,Bayreuth,Germany,95440; University of Bayreuth,Department of Computer Science,Bayreuth,Germany,95440","2020 28th Euromicro International Conference on Parallel, Distributed and Network-Based Processing (PDP)","14 May 2020","2020","","","30","37","This paper considers the parallel numerical simulation of the time evolution of galaxies and globular clusters on GPUs. The model used is the Einstein-Vlasov system, which is designed, in particular, to study the formation of black holes and spacetime singularities in a general relativistic framework.First, a reference implementation is derived using NVIDIA CUDA as programming model, which is then optimized in several steps. Bottlenecks are identified by profiling, and different approaches, namely particle sort, improved treatment of atomic operations, and kernel fusion are investigated to overcome these bottlenecks. Each optimized variant is evaluated in relation to the other variants using detailed runtime experiments and profiling results. Using in the order of 107 to 108 particles, speedups between 1.84 and 2.38 w.r.t. the reference implementation have been observed.","2377-5750","978-1-7281-6582-0","10.1109/PDP50117.2020.00012","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9092350","particle-in-cell;kinetic models;Einstein–Vlasov;parallelization;GPU","Graphics processing units;Kernel;Mathematical model;Numerical models;Computational modeling;Measurement;Arrays","astronomy computing;black holes;general relativity;numerical analysis;parallel architectures;space-time configurations","atomic operations;kernel fusion;optimized variant;runtime experiments;profiling results;reference implementation;1D2V PIC Method;nonlinear kinetic models;GPUs;parallel numerical simulation;globular clusters;Einstein-Vlasov system;black holes;spacetime singularities;general relativistic framework;NVIDIA CUDA;programming model;particle sort","","","","20","","14 May 2020","","","IEEE","IEEE Conferences"
"Convergence and scalarization for data-parallel architectures","Y. Lee; R. Krashinsky; V. Grover; S. W. Keckler; K. Asanović",University of California at Berkeley; NVIDIA; NVIDIA; NVIDIA; University of California at Berkeley,"Proceedings of the 2013 IEEE/ACM International Symposium on Code Generation and Optimization (CGO)","8 Apr 2013","2013","","","1","11","Modern throughput processors such as GPUs achieve high performance and efficiency by exploiting data parallelism in application kernels expressed as threaded code. One draw-back of this approach compared to conventional vector architectures is redundant execution of instructions that are common across multiple threads, resulting in energy inefficiency due to excess instruction dispatch, register file accesses, and memory operations. This paper proposes to alleviate these overheads while retaining the threaded programming model by automatically detecting the scalar operations and factoring them out of the parallel code. We have developed a scalarizing compiler that employs convergence and variance analyses to statically identify values and instructions that are invariant across multiple threads. Our compiler algorithms are effective at identifying convergent execution even in programs with arbitrary control flow, identifying two-thirds of the opportunity captured by a dynamic oracle. The compile-time analysis leads to a reduction in instructions dispatched by 29%, register file reads and writes by 31% memory address counts by 47%, and data access counts by 38%.","","978-1-4673-5525-4","10.1109/CGO.2013.6494995","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6494995","CUDA;GPU;Scalarization","Instruction sets;Convergence;Registers;Kernel;Computer architecture;Graphics processing units;Algorithm design and analysis","convergence;multi-threading;optimising compilers;parallel architectures;power aware computing","data-parallel architecture scalarization;data-parallel architecture convergence;throughput processors;GPUs;data parallelism;application kernels;threaded code;vector architectures;energy inefficiency;instruction dispatch;memory operations;threaded programming model;automatic scalar operation detection;parallel code;scalarizing compiler;compiler algorithms;convergent execution;arbitrary control flow;dynamic oracle;compile-time analysis;register file reads;register file writes;memory address counts;data access counts","","21","3","29","","8 Apr 2013","","","IEEE","IEEE Conferences"
"OpenMPC: Extended OpenMP Programming and Tuning for GPUs","S. Lee; R. Eigenmann","Sch. of ECE, Purdue Univ. West Lafayette, West Lafayette, IN, USA; Sch. of ECE, Purdue Univ. West Lafayette, West Lafayette, IN, USA","SC '10: Proceedings of the 2010 ACM/IEEE International Conference for High Performance Computing, Networking, Storage and Analysis","29 Nov 2010","2010","","","1","11","General-Purpose Graphics Processing Units (GPGPUs) are promising parallel platforms for high performance computing. The CUDA (Compute Unified Device Architecture) programming model provides improved programmability for general computing on GPGPUs. However, its unique execution model and memory model still pose significant challenges for developers of efficient GPGPU code. This paper proposes a new programming interface, called OpenMPC, which builds on OpenMP to provide an abstraction of the complex CUDA programming model and offers high-level controls of the involved parameters and optimizations. We have developed a fully automatic compilation and user-assisted tuning system supporting OpenMPC. In addition to a range of compiler transformations and optimizations, the system includes tuning capabilities for generating, pruning, and navigating the search space of compilation variants. Our results demonstrate that OpenMPC offers both programmability and tunability. Our system achieves 88% of the performance of the hand-coded CUDA programs.","2167-4337","978-1-4244-7559-9","10.1109/SC.2010.36","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5644879","","Graphics processing unit;Kernel;Optimization;Instruction sets;Tuning;Programming;Registers","computer graphic equipment;coprocessors;parallel programming;public domain software","OpenMPC;extended OpenMP programming;GPU;general purpose graphics processing units;high performance computing;CUDA programming model;user assisted tuning system;compiler transformations;compiler optimizations;Compute Unified Device Architecture","","128","1","16","","29 Nov 2010","","","IEEE","IEEE Conferences"
"Medical Imaging Processing on a Big Data Platform Using Python: Experiences with Heterogeneous and Homogeneous Architectures","E. Serrano; J. G. Blas; J. Carretero; M. Abella; M. Desco","Comput. Archit. & Technol. Group, Univ. Carlos III of Madrid, Leganes, Spain; Comput. Archit. & Technol. Group, Univ. Carlos III of Madrid, Leganes, Spain; Comput. Archit. & Technol. Group, Univ. Carlos III of Madrid, Leganes, Spain; Inst. de Investigacin Sanitaria Gregorio Maranon, Madrid, Spain; Inst. de Investigacin Sanitaria Gregorio Maranon, Madrid, Spain","2017 17th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing (CCGRID)","13 Jul 2017","2017","","","830","837","The apparition of new paradigms, programming models, and languages that offer better programmability and better performance turns the implementation of current scientific applications into a less time-consuming task than years ago. One significant example of this trend is the MapReduce programming model and its implementation using Apache Spark. Nowadays, this programming model is mainly used for data analysis and machine learning applications, although it has been expanded to its usage in the HPC community. On the side of programming languages, Python has positioned itself as an alternative to other scientific programming languages, such as Matlab or Julia. In this work we explore the capabilities of Python and Apache Spark as partners in the implementation of the backprojection operator of a CT reconstruction application. We present two interesting approaches with two different types of architectures: a heterogeneous architecture including NVidia GPUs and a full performance CPU mode with the compatibility with C/C++ native source code. We experimentally demonstrate that current CPU-based implementations scale with the number of computational units.","","978-1-5090-6611-7","10.1109/CCGRID.2017.56","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7973788","CUDA;Big Data;Apache Spark;CT;backprojection;Python","Computer architecture;Programming;Computed tomography;Computational modeling;Sparks;Image reconstruction;Big Data","Big Data;C++ language;data analysis;graphics processing units;learning (artificial intelligence);medical image processing;microprocessor chips;parallel processing;programming languages;public domain software;source code (software);workstation clusters","medical imaging processing;Big Data platform;Python;heterogeneous architectures;homogeneous architectures;MapReduce programming model;Apache Spark;data analysis;machine learning;HPC community;programming languages;NVidia GPU;CPU mode;C/C++ native source code","","7","","27","","13 Jul 2017","","","IEEE","IEEE Conferences"
"Porting Real-World Applications to GPU Clusters: A Celerity and Cronos Case Study","P. Gschwandtner; R. Kissmann; D. Huber; P. Salzmann; F. Knorr; P. Thoman; T. Fahringer","University of Innsbruck,Research Center HPC,Innsbruck,Austria; University of Innsbruck,Institute for Astro- and Particle Physics,Innsbruck,Austria; University of Innsbruck,Institute for Astro- and Particle Physics,Innsbruck,Austria; University of Innsbruck,Department of Computer Science,Innsbruck,Austria; University of Innsbruck,Department of Computer Science,Innsbruck,Austria; University of Innsbruck,Department of Computer Science,Innsbruck,Austria; University of Innsbruck,Department of Computer Science,Innsbruck,Austria","2021 IEEE 17th International Conference on eScience (eScience)","26 Oct 2021","2021","","","90","98","Accelerator clusters are an ongoing trend in high performance computing, continuously gaining traction and forming a ubiquitous hardware resource for domain scientists to run large-scale simulations on. However, there is often a gap between new hardware technologies and adoption by legacy code bases. Porting real-world applications to new programming models is a difficult undertaking, aggravated by the need for support for both distributed-memory and accelerator parallelism. In this work, we present a case study of porting Cronos, a real-world code from the field of magnetohydrodynamics, to Celerity, a high-level programming model for distributed-memory accelerator clusters. We discuss the numerical, algorithmic and implementation properties of the application and motivate our decisions for adapting them where necessary. Preliminary results show a parallel efficiency of up to 87% for 16 GPUs.","","978-1-6654-0361-0","10.1109/eScience51609.2021.00019","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9582351","accelerators;gpus;sycl;celerity;distributed memory;parallel programming","Codes;Magnetohydrodynamics;Parallel programming;Computational modeling;High performance computing;Graphics processing units;Parallel processing","","","","","","20","","26 Oct 2021","","","IEEE","IEEE Conferences"
"Impacts of Multi-GPU MPI Collective Communications on Large FFT Computation","A. Ayala; S. Tomov; X. Luo; H. Shaeik; A. Haidar; G. Bosilca; J. Dongarra","University of Tennessee, USA; University of Tennessee, USA; University of Tennessee, USA; University of Tennessee, USA; Nvidia Corporation, USA; University of Tennessee, USA; University of Tennessee, USA","2019 IEEE/ACM Workshop on Exascale MPI (ExaMPI)","13 Jan 2020","2019","","","12","18","Most applications targeting exascale, such as those part of the Exascale Computing Project (ECP), are designed for heterogeneous architectures and rely on the Message Passing Interface (MPI) as their underlying parallel programming model. In this paper we analyze the limitations of collective MPI communication for the computation of fast Fourier transforms (FFTs), which are relied on heavily for large-scale particle simulations. We present experiments made at one of the largest heterogeneous platforms, the Summit supercomputer at ORNL. We discuss communication models from state-of-the-art FFT libraries, and propose a new FFT library, named HEFFTE (Highly Efficient FFTs for Exascale), which supports heterogeneous architectures and yields considerable speedups compared with CPU libraries, while maintaining good weak as well as strong scalability.","","978-1-7281-6009-2","10.1109/ExaMPI49596.2019.00007","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8955469","","","application program interfaces;fast Fourier transforms;graphics processing units;message passing;parallel programming","multiGPU MPI collective communications;FFT computation;MPI communication;fast Fourier transforms;particle simulations;FFT library;Highly Efficient FFTs for Exascale;HEFFTE","","7","","18","","13 Jan 2020","","","IEEE","IEEE Conferences"
"Optimal Kernel Design for Finite-Element Numerical Integration on GPUs","K. Banaś; F. Krużel; J. Bielański",AGH University of Science and Technology; Cracow University of Technology; AGH University of Science and Technology,"Computing in Science & Engineering","13 Oct 2020","2020","22","6","61","74","This article presents the design and optimization of the GPU kernels for numerical integration, as it is applied in the standard form in finite-element codes. The optimization process employs autotuning, with the main emphasis on the placement of variables in the shared memory or registers. OpenCL and the first order finite-element method (FEM) approximation are selected for code design, but the techniques are also applicable to the CUDA programming model and other types of finite-element discretizations (including discontinuous Galerkin and isogeometric). The autotuning optimization is performed for four example graphics processors and the obtained results are discussed.","1558-366X","","10.1109/MCSE.2019.2940656","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8843948","","Finite element analysis;Graphics processing units;Jacobian matrices;Solid modeling;Approximation algorithms;Optimization;Computational modeling","finite element analysis;Galerkin method;graphics processing units;integration;optimisation;parallel architectures;parallel programming;shared memory systems","isogeometric discretization;discontinuous Galerkin discretization;OpenCL;graphics processors;first order finite-element method approximation;autotuning optimization;finite-element discretizations;CUDA programming model;code design;shared memory;finite-element codes;GPU kernels;finite-element numerical integration;optimal kernel design","","","","21","IEEE","18 Sep 2019","","","IEEE","IEEE Magazines"
"Towards an efficient multi-stage Riemann solver for nuclear physics simulations","S. Cygert; J. Porter-Sobieraj; D. Kikoła; J. Sikorski; M. Słodkowski","Warsaw University of Technology, Faculty of Mathematics and Information Science, Koszykowa 75, 00-662, Poland; Warsaw University of Technology, Faculty of Mathematics and Information Science, Koszykowa 75, 00-662, Poland; Purdue University, Department of Physics, 525 Northwestern Ave., West Lafayette, IN 47907, United States; Warsaw University of Technology, Faculty of Physics, Koszykowa 75, 00-662, Poland; Warsaw University of Technology, Faculty of Physics, Koszykowa 75, 00-662, Poland","2013 Federated Conference on Computer Science and Information Systems","7 Nov 2013","2013","","","441","446","Relativistic numerical hydrodynamics is an important tool in high energy nuclear science. However, such simulations are extremely demanding in terms of computing power. This paper focuses on improving the speed of solving the Riemann problem with the MUSTA-FORCE algorithm by employing the CUDA parallel programming model. We also propose a new approach to 3D finite difference algorithms, which employ a GPU that uses surface memory. Numerical experiments show an unprecedented increase in the computing power compared to a CPU.","","978-83-60810-52-1","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6644038","","Graphics processing units;Computational modeling;Instruction sets;Mathematical model;Hydrodynamics;Registers;Numerical models","digital simulation;finite difference methods;hydrodynamics;mathematics computing;nuclear engineering computing;parallel architectures;parallel programming","multistage Riemann solver;nuclear physics simulations;relativistic numerical hydrodynamics;high energy nuclear science;MUSTA-FORCE algorithm;CUDA parallel programming model;3D finite difference algorithms;GPU;surface memory;CPU","","","","15","","7 Nov 2013","","","IEEE","IEEE Conferences"
"Using Fermi Architecture Knowledge to Speed up CUDA and OpenCL Programs","Y. Torres; A. Gonzalez-Escribano; D. R. Llanos","Dipt. Inf., Univ. Valladolid, Valladolid, Spain; Dipt. Inf., Univ. Valladolid, Valladolid, Spain; Dipt. Inf., Univ. Valladolid, Valladolid, Spain","2012 IEEE 10th International Symposium on Parallel and Distributed Processing with Applications","23 Aug 2012","2012","","","617","624","The NVIDIA graphics processing units (GPUs) are playing an important role as general purpose programming devices. The implementation of parallel codes to exploit the GPU hardware architecture is a task for experienced programmers. The threadblock size and shape choice is one of the most important user decisions when a parallel problem is coded. The threadblock configuration has a significant impact on the global performance of the program. While in CUDA parallel programming model it is always necessary to specify the threadblock size and shape, the OpenCL standard also offers an automatic mechanism to take this delicate decision. In this paper we present a study of these criteria for Fermi architecture, introducing a general approach for threadblock choice, and showing that there is considerable room for improvement in OpenCL automatic strategy.","2158-9208","978-1-4673-1631-6","10.1109/ISPA.2012.92","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6280352","GPGPU;automatic code tuning;Fermi;CUDA;OpenCL","Instruction sets;Shape;Graphics processing unit;Computer architecture;Kernel;Benchmark testing;Tuning","graphics processing units;parallel architectures;parallel programming","fermi architecture knowledge;speed up CUDA programs;speed up OpenCL programs;NVIDIA graphics processing units;GPU hardware architecture;threadblock size;parallel problem;threadblock configuration;CUDA parallel programming model;automatic mechanism","","6","","17","","23 Aug 2012","","","IEEE","IEEE Conferences"
"High-Performance and Real-Time Volume Rendering in CUDA","Y. Zhao; X. Cui; Y. Cheng","Sino-Dutch Biomed. & Inf. Eng. Sch., Northeastern Univ., Shenyang, China; Sino-Dutch Biomed. & Inf. Eng. Sch., Northeastern Univ., Shenyang, China; Sino-Dutch Biomed. & Inf. Eng. Sch., Northeastern Univ., Shenyang, China","2009 2nd International Conference on Biomedical Engineering and Informatics","30 Oct 2009","2009","","","1","4","In order to improve the image quality and rendering speed, how to deal with a large scale of voxel computation is a challenge for programmers who work at medical image visualization. CUDA is a parallel programming model and software environment designed to overcome this challenge while maintaining a low learning curve for programmers familiar with standard programming languages such as C. In this paper, we propose an optimization algorithm of volume ray casting using CUDA; compare the performance to previous implementation in old version of GPU. The experiments show that our method can achieve a high image quality and rendering speed.","1948-2922","978-1-4244-4132-7","10.1109/BMEI.2009.5304981","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5304981","","Rendering (computer graphics);Image quality;Programming profession;Large-scale systems;Biomedical imaging;Visualization;Parallel programming;Software maintenance;Software performance;Software design","coprocessors;data visualisation;medical image processing;rendering (computer graphics)","real-time volume rendering;CUDA;image quality;voxel computation;medical image visualization;parallel programming model;C programming language;volume ray casting;GPU;Compute United Device Architecture;graphics processor unit","","6","","21","","30 Oct 2009","","","IEEE","IEEE Conferences"
"Shortening Design Time through Multiplatform Simulations with a Portable OpenCL Golden-model: The LDPC Decoder Case","G. Falcao; M. Owaida; D. Novo; M. Purnaprajna; N. Bellas; C. D. Antonopoulos; G. Karakonstantis; A. Burg; P. Ienne","Dept. of Electr. & Comput. Eng., Univ. of Coimbra, Coimbra, Portugal; Dept. of Comput. & Commun. Eng., Univ. of Thessaly Volos, Volos, Greece; Ecole Polytech. Fed. de Lausanne, Lausanne, Switzerland; Ecole Polytech. Fed. de Lausanne, Lausanne, Switzerland; Dept. of Comput. & Commun. Eng., Univ. of Thessaly Volos, Volos, Greece; Dept. of Comput. & Commun. Eng., Univ. of Thessaly Volos, Volos, Greece; Ecole Polytech. Fed. de Lausanne, Lausanne, Switzerland; Ecole Polytech. Fed. de Lausanne, Lausanne, Switzerland; Ecole Polytech. Fed. de Lausanne, Lausanne, Switzerland","2012 IEEE 20th International Symposium on Field-Programmable Custom Computing Machines","16 Jul 2012","2012","","","224","231","Hardware designers and engineers typically need to explore a multi-parametric design space in order to find the best configuration for their designs using simulations that can take weeks to months to complete. For example, designers of special purpose chips need to explore parameters such as the optimal bit width and data representation. This is the case for the development of complex algorithms such as Low-Density Parity-Check (LDPC) decoders used in modern communication systems. Currently, high-performance computing offers a wide set of acceleration options, that range from multicore CPUs to graphics processing units (GPUs) and FPGAs. Depending on the simulation requirements, the ideal architecture to use can vary. In this paper we propose a new design flow based on Open CL, a unified multiplatform programming model, which accelerates LDPC decoding simulations, thereby significantly reducing architectural exploration and design time. Open CL-based parallel kernels are used without modifications or code tuning on multicore CPUs, GPUs and FPGAs. We use SOpen CL (Silicon to Open CL), a tool that automatically converts Open CL kernels to RTL for mapping the simulations into FPGAs. To the best of our knowledge, this is the first time that a single, unmodified Open CL code is used to target those three different platforms. We show that, depending on the design parameters to be explored in the simulation, on the dimension and phase of the design, the GPU or the FPGA may suit different purposes more conveniently, providing different acceleration factors. For example, although simulations can typically execute more than 3× faster on FPGAs than on GPUs, the overhead of circuit synthesis often outweighs the benefits of FPGA-accelerated execution.","","978-1-4673-1605-7","10.1109/FCCM.2012.46","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6239819","design space exploration;simulation tools;parallel computing;FPGAs;GPUs;LDPC decoding","Kernel;Parity check codes;Field programmable gate arrays;Computational modeling;Decoding;Hardware;Algorithm design and analysis","codecs;field programmable gate arrays;logic design;logic simulation;microprocessor chips;parity check codes;public domain software","design time shortening;multiplatform simulation;portable OpenCL golden model;LDPC decoder case;hardware designers;multiparametric design space;complex algorithms;low density parity check decoders;unified multiplatform programming model;SOpen CL;Silicon to Open CL;RTL;FPGA;GPU;register transfer level","","16","","17","","16 Jul 2012","","","IEEE","IEEE Conferences"
"Accelerating error correction in high-throughput short-read DNA sequencing data with CUDA","H. Shi; B. Schmidt; W. Liu; W. Muller-Wittig","School of Computer Engineering, Nanyang Technological University, Singapore 639798; School of Computer Engineering, Nanyang Technological University, Singapore 639798; School of Computer Engineering, Nanyang Technological University, Singapore 639798; School of Computer Engineering, Nanyang Technological University, Singapore 639798","2009 IEEE International Symposium on Parallel & Distributed Processing","10 Jul 2009","2009","","","1","8","Emerging DNA sequencing technologies open up exciting new opportunities for genome sequencing by generating read data with a massive throughput. However, produced reads are significantly shorter and more error-prone compared to the traditional Sanger shotgun sequencing method. This poses challenges for de-novo DNA fragment assembly algorithms in terms of both accuracy (to deal with short, error-prone reads) and scalability (to deal with very large input data sets). In this paper we present a scalable parallel algorithm for correcting sequencing errors in high-throughput short-read data. It is based on spectral alignment and uses the CUDA programming model. Our computational experiments on a GTX 280 GPU show runtime savings between 10 and 19 times (for different error-rates using simulated datasets as well as real Solexa/Illumina datasets).","1530-2075","978-1-4244-3751-1","10.1109/IPDPS.2009.5160924","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5160924","","Acceleration;Error correction;DNA;Genomics;Bioinformatics;Throughput;Assembly;Scalability;Parallel algorithms;Runtime","biology computing;DNA;genomics;molecular biophysics;parallel algorithms","error correction;high-throughput short-read DNA sequencing data;CUDA programming model;genome sequencing;scalable parallel algorithm;GTX 280 GPU","","2","","20","","10 Jul 2009","","","IEEE","IEEE Conferences"
"Fast BFS-Based Triangle Counting on GPUs","L. Wang; J. D. Owens","University of California,Department of Computer Science,Davis,California,95616; University of California,Department of Electrical & Computer Engineering,Davis,California,95616","2019 IEEE High Performance Extreme Computing Conference (HPEC)","28 Nov 2019","2019","","","1","6","In this paper, we propose a novel method to compute triangle counting on GPUs. Unlike previous formulations of graph matching, our approach is BFS-based by traversing the graph in an all-source-BFS manner and thus can be mapped onto GPUs in a massively parallel fashion. Our implementation uses the Gunrock programming model and we evaluate our implementation in runtime and memory consumption compared with previous state-of-the-art work. We sustain a peak traversed-edgesper-second (TEPS) rate of nearly 10 GTEPS. Our algorithm is the most scalable and parallel among all existing GPU implementations and also outperforms all existing CPU distributed implementations. This work specifically focuses on leveraging our implementation on the triangle counting problem for the Subgraph Isomorphism Graph Challenge 2019, demonstrating a geometric mean speedup over the 2018 champion of 3.84×.","2643-1971","978-1-7281-5020-8","10.1109/HPEC.2019.8916434","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8916434","","Graphics processing units;Memory management;Computational complexity;Parallel algorithms;Decision trees;Graph theory","computational complexity;graph theory;graphics processing units;parallel algorithms;tree searching","Subgraph Isomorphism Graph Challenge 2019;triangle counting problem;existing GPU implementations;peak traversed-edgesper-second rate;previous state-of-the-art work;memory consumption;Gunrock programming model;massively parallel fashion;all-source-BFS manner;graph matching;GPUs;fast BFS-based triangle counting","","3","","11","","28 Nov 2019","","","IEEE","IEEE Conferences"
"Ultra low latency dataflow renderer","S. Friston; A. Steed; S. Tilbury; G. Gaydadjiev","University College London, Computer Science Department, Gower Street, WC1E 6BT, UK; University College London, Computer Science Department, Gower Street, WC1E 6BT, UK; Maxeler Technologies Ltd., 1 Down Place, London W6 9JH, UK; Maxeler Technologies Ltd., 1 Down Place, London W6 9JH, UK","2015 25th International Conference on Field Programmable Logic and Applications (FPL)","8 Oct 2015","2015","","","1","4","Reconfigurable hardware has been used before for low latency image synthesis. These are typically low level implementations with tight vertical integration. For example the apparatus of both Regan et al and Ng et al had the tracker driven by the same device performing the rendering. Reconfigurable hardware combined with the dataflow programming model can make application specific rendering hardware cost effective. Our sprite renderer has comparable scope to both prior examples, but our dataflow graph can be adapted to other use cases with an effort comparable to GPU shader programming.","1946-1488","978-0-9934-2800-5","10.1109/FPL.2015.7293974","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7293974","","Computer architecture;Image color analysis;Hardware;Rendering (computer graphics);Streaming media;Transceivers;Sprites (computer)","graphics processing units;image processing;rendering (computer graphics)","ultra low latency dataflow renderer;low latency image synthesis;tight vertical integration;dataflow programming model;application specific rendering hardware cost;sprite renderer;dataflow graph;GPU shader programming","","","","18","","8 Oct 2015","","","IEEE","IEEE Conferences"
"A Dynamic Task-Based D3Q19 Lattice-Boltzmann Method for Heterogeneous Architectures","J. V. F. Lima; G. Freytag; V. G. Pinto; C. Schepke; P. O. A. Navaux","Universidade Federal de Santa Maria, Brazil; Universidade Federal do Rio Grande do Sul, Brazil; Universidade Federal do Rio Grande do Sul, Brazil; Universidade Federal do Pampa, Campus Alegrete, Brazil; Universidade Federal do Rio Grande do Sul, Brazil","2019 27th Euromicro International Conference on Parallel, Distributed and Network-Based Processing (PDP)","21 Mar 2019","2019","","","108","115","Nowadays computing platforms expose a significant number of heterogeneous processing units such as multicore processors and accelerators. The task-based programming model has been a de facto standard model for such architectures since its model simplifies programming by unfolding parallelism at runtime based on data-flow dependencies between tasks. Many studies have proposed parallel strategies over heterogeneous platforms with accelerators. However, to the best of our knowledge, no dynamic task-based strategy of the Lattice-Boltzmann Method (LBM) has been proposed to exploit CPU+GPU computing nodes. In this paper, we present a dynamic task-based D3Q19 LBM implementation using three runtime systems for heterogeneous architectures: OmpSs, StarPU, and XKaapi. We detail our implementations and compare performance over two heterogeneous platforms. Experimental results demonstrate that our task-based approach attained up to 8.8 of speedup over an OpenMP parallel loop version.","2377-5750","978-1-7281-1644-0","10.1109/EMPDP.2019.8671583","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8671583","","Task analysis;Runtime;Graphics processing units;Computational modeling;Parallel processing;Programming;Computer architecture","flow simulation;graphics processing units;lattice Boltzmann methods;multiprocessing systems;parallel algorithms;parallel architectures;parallel processing;parallel programming;shared memory systems","CPU+GPU computing nodes;dynamic task-based D3Q19 LBM implementation;heterogeneous architectures;heterogeneous platforms;task-based approach;significant number;heterogeneous processing units;multicore processors;accelerators;task-based programming model;facto standard model;data-flow dependencies;parallel strategies;dynamic task-based strategy;dynamic task-based D3Q19 Lattice-Boltzmann method;OmpSs;StarPU;XKaapi;OpenMP parallel loop version","","1","","27","","21 Mar 2019","","","IEEE","IEEE Conferences"
"Breaking Weak 1024-bit RSA Keys with CUDA","K. Scharfglass; D. Weng; J. White; C. Lupo","Comput. Sci. Dept., California Polytech. State Univ., San Luis Obispo, CA, USA; Comput. Sci. Dept., California Polytech. State Univ., San Luis Obispo, CA, USA; Comput. Sci. Dept., California Polytech. State Univ., San Luis Obispo, CA, USA; Comput. Sci. Dept., California Polytech. State Univ., San Luis Obispo, CA, USA","2012 13th International Conference on Parallel and Distributed Computing, Applications and Technologies","9 Sep 2013","2012","","","207","212","An exploit involving the greatest common divisor (GCD) of RSA moduli was recently discovered [1]. This paper presents a tool that can efficiently and completely compare a large number of 1024-bit RSA public keys, and identify any keys that are susceptible to this weakness. NVIDIA's graphics processing units (GPU) and the CUDA massively-parallel programming model are powerful tools that can be used to accelerate this tool. Our method using CUDA has a measured performance speedup of 27.5 compared to a sequential CPU implementation, making it a more practical method to compare large sets of keys. A computation for finding GCDs between 200,000 keys, i.e., approximately 20 billion comparisons, was completed in 113 minutes, the equivalent of approximately 2.9 million 1024-bit GCD comparisons per second.","2379-5352","978-0-7695-4879-1","10.1109/PDCAT.2012.58","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6589265","CUDA;RSA;greatest common divisor;parallel computation","Graphics processing units;Instruction sets;Arrays;Organizations;Public key;Matrix decomposition;Kernel","graphics processing units;parallel architectures;parallel programming;performance evaluation;public key cryptography","CUDA;greatest common divisor;GCD;RSA moduli;1024-bit RSA public keys;NVIDIA;graphics processing units;GPU;massively-parallel programming model;performance speedup;word length 1024 bit","","6","","9","","9 Sep 2013","","","IEEE","IEEE Conferences"
"Simulee: Detecting CUDA Synchronization Bugs via Memory-Access Modeling","M. Wu; Y. Ouyang; H. Zhou; L. Zhang; C. Liu; Y. Zhang","Southern University of Science and Technology,Shenzhen,China; Southern University of Science and Technology,Shenzhen,China; University of Texas at Dallas,Dallas,USA; University of Texas at Dallas,Dallas,USA; University of Texas at Dallas,Dallas,USA; Southern University of Science and Technology,Shenzhen,China","2020 IEEE/ACM 42nd International Conference on Software Engineering (ICSE)","21 Dec 2020","2020","","","937","948","While CUDA has become a mainstream parallel computing platform and programming model for general-purpose GPU computing, how to effectively and efficiently detect CUDA synchronization bugs remains a challenging open problem. In this paper, we propose the first lightweight CUDA synchronization bug detection framework, namely Simulee, to model CUDA program execution by interpreting the corresponding LLVM bytecode and collecting the memory-access information for automatically detecting general CUDA synchronization bugs. To evaluate the effectiveness and efficiency of Simulee, we construct a benchmark with 7 popular CUDA-related projects from GitHub, upon which we conduct an extensive set of experiments. The experimental results suggest that Simulee can detect 21 out of the 24 manually identified bugs in our preliminary study and also 24 previously unknown bugs among all projects, 10 of which have already been confirmed by the developers. Furthermore, Simulee significantly outperforms state-of-the-art approaches for CUDA synchronization bug detection.","1558-1225","978-1-4503-7121-6","10.1145/3377811.3380358","National Natural Science Foundation of China(grant numbers:61902169); Shenzhen Peacock Plan(grant numbers:KQTD2016112514355531); National Science Foundation(grant numbers:CCF-1763906,CCF-1942430); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9284094","","Computational modeling;Computer bugs;Graphics processing units;Benchmark testing;Synchronization;Software engineering;Software development management","graphics processing units;multiprocessing systems;parallel architectures;parallel programming;program compilers;program debugging","Simulee;CUDA program execution;memory-access information;general CUDA synchronization bugs;7 popular CUDA-related projects;24 manually identified bugs;24 previously unknown bugs;memory-access modeling;mainstream parallel computing platform;programming model;general-purpose GPU computing;challenging open problem;lightweight CUDA synchronization bug detection framework","","1","","54","","21 Dec 2020","","","IEEE","IEEE Conferences"
"Performance and Power Efficient Massive Parallel Computational Model for HPC Heterogeneous Exascale Systems","M. U. Ashraf; F. Alburaei Eassa; A. Ahmad Albeshri; A. Algarni","Department of Computer Science, Faculty of Computing and Information Technology, King Abdulaziz University, Jeddah, Saudi Arabia; Department of Computer Science, Faculty of Computing and Information Technology, King Abdulaziz University, Jeddah, Saudi Arabia; Department of Computer Science, Faculty of Computing and Information Technology, King Abdulaziz University, Jeddah, Saudi Arabia; Department of Computer Science, Faculty of Computing and Information Technology, King Abdulaziz University, Jeddah, Saudi Arabia","IEEE Access","15 May 2018","2018","6","","23095","23107","The emerging high-performance computing Exascale supercomputing system, which is anticipated to be available in 2020, will unravel many scientific mysteries. This extraordinary processing framework will accomplish a thousand-folds increment in figuring power contrasted with the current Petascale framework. The prospective framework will help development communities and researchers in exploring from conventional homogeneous to the heterogeneous frameworks that will be joined into energy efficient GPU devices along with traditional CPUs. For accomplishing ExaFlops execution through the Ultrascale framework, the present innovations are confronting several challenges. Huge parallelism is one of these challenges, which requires a novel low power consuming parallel programming approach for attaining massive performance. This paper introduced a new parallel programming model that achieves massive parallelism by combining coarse-grained and fine-grained parallelism over inter-node and intranode computation respectively. The proposed framework is tri-hybrid of MPI, OpenMP, and compute unified device architecture (MOC) that compute input data over heterogeneous framework. We implemented the proposed model in linear algebraic dense matrix multiplication application, and compared the quantified metrics with well-known basic linear algebra subroutine libraries such as CUDA basic linear algebra subroutines library and KAUST basic linear algebra subprograms. MOC outperformed to all implemented methods and achieved massive performance by consuming less power. The proposed MOC approach can be considered an initial and leading model to deal emerging Exascale computing systems.","2169-3536","","10.1109/ACCESS.2018.2823299","Deanship of Scientific Research at King Abdulaziz University, Jeddah(grant numbers:RG-3-611-38); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8334408","Exascale computing;HPC;massive parallelism;super computing;energy efficiency;hybrid programming;CUDA;OpenMP;MPI","Graphics processing units;Computational modeling;Parallel processing;Performance evaluation;Computer architecture;Acceleration;Parallel programming","application program interfaces;graphics processing units;mathematics computing;matrix multiplication;message passing;multiprocessing systems;parallel architectures;parallel machines;parallel programming;power aware computing","achieves massive parallelism;fine-grained parallelism;intranode computation;compute unified device architecture;compute input data;heterogeneous framework;parallel programming model;Ultrascale framework;power efficient massive parallel computational model;OpenMP;MPI;internode computation;coarse-grained parallelism;low power consuming parallel programming approach;ExaFlops execution;Petascale framework;high-performance computing Exascale supercomputing system;traditional CPU;energy efficient GPU devices;development communities;extraordinary processing framework;scientific mysteries;HPC heterogeneous Exascale systems;Exascale computing systems;initial leading model;KAUST basic linear algebra subprograms;CUDA basic linear algebra subroutines library;linear algebraic dense matrix multiplication application","","15","","65","OAPA","9 Apr 2018","","","IEEE","IEEE Journals"
"The Memory Controller Wall: Benchmarking the Intel FPGA SDK for OpenCL Memory Interface","H. R. Zohouri; S. Matsuoka","Tokyo Institute of Technology, Japan; Tokyo Institute of Technology, Japan","2019 IEEE/ACM International Workshop on Heterogeneous High-performance Reconfigurable Computing (H2RC)","2 Jan 2020","2019","","","11","18","Supported by their high power efficiency and recent advancements in High Level Synthesis (HLS), FPGAs are quickly finding their way into HPC and cloud systems. Large amounts of work have been done so far on loop and area optimizations for different applications on FPGAs using HLS. However, a comprehensive analysis of the behavior and efficiency of the memory controller of FPGAs is missing in literature, which becomes even more crucial when the limited memory bandwidth of modern FPGAs compared to their GPU counterparts is taken into account. In this work, we will analyze the memory interface generated by Intel FPGA SDK for OpenCL with different configurations for input/output arrays, vector size, interleaving, kernel programming model, on-chip channels, operating frequency, padding, and multiple types of overlapped blocking. Our results point to multiple shortcomings in the memory controller of Intel FPGAs, especially with respect to memory access alignment, that can hinder the programmer's ability in maximizing memory performance in their design. For some of these cases, we will provide work-arounds to improve memory bandwidth efficiency; however, a general solution will require major changes in the memory controller itself.","","978-1-7281-5999-7","10.1109/H2RC49586.2019.00007","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8945518","","Kernel;Field programmable gate arrays;Memory management;Benchmark testing;Bandwidth;Indexes;Graphics processing units","application program interfaces;cloud computing;electronic engineering computing;field programmable gate arrays;graphics processing units;high level synthesis;optimisation;power aware computing","loop;area optimizations;HLS;Intel FPGA SDK;memory access alignment;memory controller wall;OpenCL memory interface;power efficiency;high level synthesis;cloud systems;GPU;kernel programming model;on-chip channels;operating frequency","","5","","15","","2 Jan 2020","","","IEEE","IEEE Conferences"
"Space-Efficient Pointwise Computation of the Distance Transform on GPUs","N. Khan; M. Zahran","Comput. Sci. Dept., Brown Univ., Providence, RI, USA; Comput. Sci. Dept., New York Univ., New York, NY, USA","2017 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","3 Jul 2017","2017","","","557","566","To minimize the amount of computation, traditional approaches to calculating the distance transform (DT) on a discrete volume propagate distance values in a local neighborhood. This results in recursive dependencies across the volume, requiring the DT to be calculated for all points in the domain en mass and stored as static values in memory. On the other hand, the ability to calculate the distance transform point-wise not only offers the prospect of efficient memory usage and scalability, but also a high degree of flexibility in accommodating the unique requirements of new application domains. However, among the current DT algorithms, the computationally intensive brute-force algorithm is the only one that allows point-wise computation. We demonstrate that the by decomposing it into a map and a reduction pattern on the massively parallel architecture of a modern Graphics Processing Unit (GPU), the brute-force distance transform algorithm achieves the threefold goals of memory efficiency, flexibility, and performance. We discuss a memory constrained implementation in the CUDA parallel programming model. The flexibility of point-wise computation at runtime is demonstrated by presenting an approximate and an anisotropic variant of the standard distance transform algorithm, and using these variants for the rendering of a CT scan image. Our approach allows the distance transform to be calculated for 1024 query points and up to 16 million feature points in 141.25 milliseconds while allowing direct control over the memory working-set size. These results demonstrate the potential of pointwise computation of the DT at runtime and the need for future algorithms to incorporate this capability.","","978-1-5386-3408-0","10.1109/IPDPSW.2017.90","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7965093","Rendering;Medical Imaging;Vision;Map;Reduction;Memory;Patterns;Anisotropic;Approximate","Transforms;Graphics processing units;Approximation algorithms;Memory management;Runtime;Parallel processing;Measurement","graphics processing units;parallel architectures","space-efficient pointwise computation;GPU;discrete volume;memory usage;DT algorithms;point-wise computation;Graphics Processing Unit;brute-force distance transform algorithm;memory efficiency;CUDA parallel programming model;standard distance transform algorithm;rendering;CT scan image;query points;memory working-set size","","","","41","","3 Jul 2017","","","IEEE","IEEE Conferences"
"Pygion: Flexible, Scalable Task-Based Parallelism with Python","E. Slaughter; A. Aiken","SLAC National Accelerator Laboratory, USA; Stanford University, USA","2019 IEEE/ACM Parallel Applications Workshop, Alternatives To MPI (PAW-ATM)","13 Apr 2020","2019","","","58","72","Dynamic languages provide the flexibility needed to implement expressive support for task-based parallel programming constructs. We present Pygion, a Python interface for the Legion task-based programming system, and show that it can provide features comparable to Regent, a statically typed programming language with dedicated support for the Legion programming model. Furthermore, we show that the dynamic nature of Python permits the implementation of several key optimizations (index launches, futures, mapping) currently implemented in the Regent compiler. Together these features enable Pygion code that is comparable in expressiveness but more flexible than Regent, and substantially more concise, less error prone, and easier to use than C++ Legion code. Pygion is designed to interoperate with Regent and can use Regent to generate high- performance CPU and GPU kernel implementations. We show that, in combination with high-performance kernels written in Regent, Pygion is able to achieve efficient, scalable execution on up to 512 nodes of the heterogeneous supercomputer Piz Daint.","","978-1-7281-5979-9","10.1109/PAW-ATM49560.2019.00011","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9062721","task-based parallelism;Pygion;Legion;Python","Task analysis;Runtime;Python;C++ languages;Optimization;Performance analysis","data flow computing;graphics processing units;parallel machines;parallel programming;Python","scalable task-based parallelism;dynamic languages;task-based parallel program;Python interface;statically typed programming language;Legion programming model;Regent compiler;Pygion code;Legion code;GPU kernel implementations;scalable execution;Legion task-based programming","","2","","37","","13 Apr 2020","","","IEEE","IEEE Conferences"
"OpenCL Performance Prediction using Architecture-Independent Features","B. Johnston; G. Falzon; J. Milthorpe","Res. Sch. of Comput. Sci., Australian Nat. Univ., Canberra, ACT, Australia; Sch. of Sci. & Technol., Univ. of New England, Armidale, NSW, Australia; Res. Sch. of Comput. Sci., Australian Nat. Univ., Canberra, ACT, Australia","2018 International Conference on High Performance Computing & Simulation (HPCS)","1 Nov 2018","2018","","","561","569","OpenCL is an attractive programming model for heterogeneous high-performance computing systems, with wide support from hardware vendors and significant performance portability. To support efficient scheduling on HPC systems it is necessary to perform accurate performance predictions for OpenCL workloads on varied compute devices, which is challenging due to diverse computation, communication and memory access characteristics which result in varying performance between devices. The Architecture Independent Workload Characterization (AIWC) tool can be used to characterize OpenCL kernels according to a set of architecture-independent features. This work presents a methodology where AIWC features are used to form a model capable of predicting accelerator execution times. We used this methodology to predict execution times for a set of 37 computational kernels running on 15 different devices representing a broad range of CPU, GPU and MIC architectures. The predictions are highly accurate, differing from the measured experimental run-times by an average of only 1.2%, and correspond to actual execution time mispredictions of 9 ps to 1 sec according to problem size. A previously unencountered code can be instrumented once and the AIWC metrics embedded in the kernel, to allow performance prediction across the full range of modelled devices. The results suggest that this methodology supports correct selection of the most appropriate device for a previously unen- countered code, which is highly relevant to the HPC scheduling setting.","","978-1-5386-7879-4","10.1109/HPCS.2018.00095","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8514400","","Graphics processing units;Computational modeling;Memory management;Predictive models;Kernel;Performance evaluation;Parallel processing","graphics processing units;multiprocessing systems;parallel processing;performance evaluation;scheduling","OpenCL workloads;memory access characteristics;OpenCL kernels;AIWC features;accelerator execution times;AIWC metrics;modelled devices;OpenCL performance prediction;heterogeneous high-performance computing systems;hardware vendors;HPC systems;GPU;CPU;HPC scheduling;MIC architectures;architecture independent workload characterization tool;performance portability;programming model;computational kernels","","4","","24","","1 Nov 2018","","","IEEE","IEEE Conferences"
"A CUDA-enabled Hadoop cluster for fast distributed image processing","R. Malakar; N. Vydyanathan","Corporate Research and Technology, Siemens Technology Services, Bangalore, India; Corporate Research and Technology, Siemens Technology Services, Bangalore, India","2013 National Conference on Parallel Computing Technologies (PARCOMPTECH)","7 Oct 2013","2013","","","1","5","Hadoop is a map-reduce based distributed processing framework, frequently used in the industry today, in areas of big data analysis, particularly text analysis. Graphics processing units (GPUs), on the other hand, are massively parallel platforms with attractive performance to price and power ratios, used extensively in the recent years for acceleration of data parallel computations. CUDA or Compute Unified Device Architecture is a C-based programming model proposed by NVIDIA for leveraging the parallel computing capabilities of the GPU for general purpose computations. This paper attempts to integrate CUDA acceleration into the Hadoop distributed processing framework to create a heterogeneous high performance image processing system. As Hadoop primarily is used for text analysis, this involves facilitating efficient image processing in Hadoop. Our experimental evaluations using a Adaboost based face detection algorithm indicate that CUDA-enabling a Hadoop cluster, even with low-end GPUs, can result in a 25% improvement in data processing throughput, indicating that an integration of these two technologies can help build scalable, high throughput, power and cost-efficient computing platforms.","","978-1-4799-1591-0","10.1109/ParCompTech.2013.6621392","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6621392","Hadoop;Map-reduce;CUDA;GPGPU","Graphics processing units;Face detection;Java;Acceleration;Throughput;Image processing;Streaming media","C language;data analysis;face recognition;graphics processing units;learning (artificial intelligence);parallel architectures;text analysis","CUDA-enabled Hadoop cluster;distributed image processing;Map-reduce based distributed processing framework;big data analysis;text analysis;graphics processing units;GPU;parallel platforms;data parallel computations;Compute Unified Device Architecture;C-based programming model;NVIDIA;general purpose computations;Hadoop distributed processing framework;heterogeneous high performance image processing system;Adaboost based face detection algorithm","","8","","19","","7 Oct 2013","","","IEEE","IEEE Conferences"
"Accelerating a 3D Finite-Difference Earthquake Simulation with a C-to-CUDA Translator","D. Unat; J. Zhou; Y. Cui; S. B. Baden; X. Cai","University of California, San Diego; University of California, San Diego; University of California, San Diego; University of California, San Diego; Simula Research Laboratory, Norway","Computing in Science & Engineering","20 Apr 2012","2012","14","3","48","59","GPUs provide impressive computing power, but GPU programming can be challenging. Here, an experience in porting real-world earthquake code to Nvidia GPUs is described. Specifically, an annotation-based programming model, called Mint, and its accompanying source-to-source translator are used to automatically generate CUDA source code and simplify the exploration of performance tradeoffs.","1558-366X","","10.1109/MCSE.2012.44","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6188562","Code generation;optimization;emerging technologies;Earth and atmospheric sciences;scientific computing","Graphics processing unit;Instruction sets;Three dimensional displays;Optimization;Mathematical model","earthquakes;finite difference methods;graphics processing units;parallel architectures","3D finite difference earthquake simulation;GPU;annotation based programming model;source to source translator;CUDA source code","","9","","15","","20 Apr 2012","","","IEEE","IEEE Magazines"
"OpenCL programmable exposed datapath high performance low-power image signal processor","J. Multanen; H. Kultala; M. Koskela; T. Viitanen; P. Jääskelainen; J. Takala; A. Danielyan; C. Cruz","Tampere University of Technology, Finland; Tampere University of Technology, Finland; Tampere University of Technology, Finland; Tampere University of Technology, Finland; Tampere University of Technology, Finland; Tampere University of Technology, Finland; Noiseless Imaging Ltd, Finland; Noiseless Imaging Ltd, Finland","2016 IEEE Nordic Circuits and Systems Conference (NORCAS)","22 Dec 2016","2016","","","1","6","Sophisticated computational imaging algorithms require both high performance and good energy-efficiency when executed on mobile devices. Recent trend has been to exploit the abundant data-level parallelism found in general purpose programmable GPUs. However, for low-power mobile use cases, generic GPUs consume excessive amounts of power. This paper proposes a programmable computational imaging processor with 16-bit half-precision SIMD floating point vector processing capabilities combined with power efficiency of an exposed datapath. In comparison to traditional VLIW architectures with similar computational resources, the exposed datapath reduces the register file traffic and complexity. These and the specific optimizations enabled by the explicit programming model enable extremely good power-performance. When synthesized on a 28nm ASIC technology, the accelerator consumes 71mW of power while running a state-of-the-art denoising algorithm, and occupies only 0.2mm2 of chip area. For the algorithm, energy usage per frame is 7mJ, which is 10x less than the best found GPU-based implementation.","","978-1-5090-1095-0","10.1109/NORCHIP.2016.7792906","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7792906","","Radio frequency;Registers;VLIW;Computer architecture;Signal processing algorithms;Hardware;Ports (Computers)","application specific integrated circuits;floating point arithmetic;graphics processing units;parallel processing","data-level parallelism;general purpose programmable GPU;low-power mobile use cases;programmable computational imaging processor;half-precision SIMD floating point vector processing capabilities;computational resources;exposed datapath;register file traffic;explicit programming model;ASIC technology;state-of-the-art denoising algorithm;word length 16 bit;size 28 nm;power 71 mW;energy 7 mJ","","1","","15","","22 Dec 2016","","","IEEE","IEEE Conferences"
"Automatic Mapping Single-Device OpenCL Program to Heterogeneous Multi-device Platform","D. Chen; C. Xun; D. Huang; M. Wen; C. Zhang","Nat. Key Lab. of Parallel & Distrib. Process., Nat. Univ. of Defense Technol. Changsha, Changsha, China; Nat. Key Lab. of Parallel & Distrib. Process., Nat. Univ. of Defense Technol. Changsha, Changsha, China; Nat. Key Lab. of Parallel & Distrib. Process., Nat. Univ. of Defense Technol. Changsha, Changsha, China; Nat. Key Lab. of Parallel & Distrib. Process., Nat. Univ. of Defense Technol. Changsha, Changsha, China; Nat. Key Lab. of Parallel & Distrib. Process., Nat. Univ. of Defense Technol. Changsha, Changsha, China","2013 IEEE 10th International Conference on High Performance Computing and Communications & 2013 IEEE International Conference on Embedded and Ubiquitous Computing","12 Jun 2014","2013","","","135","142","In this paper, we propose a framework to automatically map single-device OpenCL programs to heterogeneous multi-device platforms with performance concerns. Our framework is based on the independence of work groups which built inside the OpenCL programming model and relies heavily on the knowledge of global memory access regions of work groups. So global memory access patterns of work groups are analyzed and an abstract representation CCRwS is designed to describe the exact memory access regions of each memory access statement in the kernels. A global memory access analyzer is designed to get CCRwSs by performing static program analysis on kernel codes. Based on CCRwSs, data transfer between multiple devices and host can be fully controlled by our framework. Then a kernel code regenerator is designed to distribute the workload and perform architecture specific optimizations by code transformation. Then we tested our framework on a platform with 2 Intel E5-2650 CPUs and 4 NVIDIA Tesla C2050 GPUs. Compared with the performance on single GPU, the kernels running on all the 6 devices can achieve about 4.5x faster.","","978-0-7695-5088-6","10.1109/HPCC.and.EUC.2013.28","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6825555","Automatic;Performance;Code transformation;multi-device","Kernel;Indexes;Performance evaluation;Benchmark testing;Abstracts;Optimization;Computer architecture","graphics processing units;parallel programming;program diagnostics","automatic mapping single-device OpenCL program;heterogeneous multi-device platform;OpenCL programming model;global memory access regions;global memory access patterns;abstract representation CCRwS;static program analysis;kernel codes;data transfer;multiple devices;code transformation;Intel E5-2650 CPU;NVIDIA Tesla C2050 GPU","","1","","10","","12 Jun 2014","","","IEEE","IEEE Conferences"
"Employing Compression Solutions under OpenACC","E. Salehi; A. Lashgar; A. Baniasadi",NA; NA; NA,"2016 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","4 Aug 2016","2016","","","348","356","For GPUs to achieve their peak performance, effective and efficient usage of memory bandwidth is necessary. To this end, programmers invest extensive development effort to optimize a GPU program, specially its memory bandwidth usage. The OpenACC programming model has been introduced to tackle the accelerators programming complexity. However, this model's coarse-grained control on a program can make the memory bandwidth utilization even worse than the utilization achieved under CUDA. We propose an extension to OpenACC in order to reduce the traffic on the memory interconnection network, using a compression method on floating point numbers. We examine our method on three case studies and achieve up to 1.36X speedup.","","978-1-5090-3682-0","10.1109/IPDPSW.2016.196","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7529890","OpenACC;Compression;Accelerators","Kernel;Graphics processing units;Bandwidth;Programming;Parallel processing;Standards;Data transfer","graphics processing units;parallel architectures;parallel programming;storage management","compression solution;memory bandwidth;GPU program;OpenACC programming model;accelerator programming complexity;coarse-grained control;CUDA;memory interconnection network;floating point number","","","","17","","4 Aug 2016","","","IEEE","IEEE Conferences"
"Fast 1-itemset frequency count using CUDA","R. L. Uy; N. Marcos","Computer Technology Department, De La Salle University, Manila, Philippines; Software Technology Department, De La Salle University, Manila, Philippines","2016 IEEE Region 10 Conference (TENCON)","9 Feb 2017","2016","","","210","213","Frequent itemset mining is one of the main and compute-intensive operations in the field of data mining. The said algorithm is use in finding frequent patterns in transactional databases. The 1-itemset frequent count is used as basis for finding succeeding k-itemset mining. Thus there is a need to speed-up this process. One of the techniques to speed-up the process is using the Single Instruction Multiple Thread (SIMT) architecture. This architecture allows a single instruction to be applied to multiple threads at the same time. Current graphics processing unit (GPU), which contains multiple streaming processing units, uses SIMT architecture. In order to abstract the GPU hardware from the programming model, NVIDIA introduces the compute unified device architecture (CUDA) as an extension to existing programming languages in order to support SIMT. This paper discusses how 1-itemset frequent count is implemented in SIMT using CUDA.","2159-3450","978-1-5090-2597-8","10.1109/TENCON.2016.7847991","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7847991","Frequent itemset mining;CUDA programming;graphics processing unit;data mining;big data","Graphics processing units;Instruction sets;Data mining;Kernel;Itemsets;Hardware;Computer architecture","data mining;graphics processing units;parallel architectures","fast 1-itemset frequency count;CUDA;frequent itemset mining;data mining;k-itemset mining;single-instruction multiple thread architecture;SIMT architecture;graphics processing unit;GPU hardware;NVIDIA;compute unified device architecture","","1","","12","","9 Feb 2017","","","IEEE","IEEE Conferences"
"CUDA: Scalable parallel programming for high-performance scientific computing","D. Luebke","NVIDIA Corporation, U.S.A.","2008 5th IEEE International Symposium on Biomedical Imaging: From Nano to Macro","13 Jun 2008","2008","","","836","838","Graphics processing units (GPUs) originally designed for computer video cards have emerged as the most powerful chip in a high-performance workstation. Unlike multicore CPU architectures, which currently ship with two or four cores, GPU architectures are ""manycore"" with hundreds of cores capable of running thousands of threads in parallel. NVIDIA's CUDA is a co-evolved hardware-software architecture that enables high-performance computing developers to harness the tremendous computational power and memory bandwidth of the GPU in a familiar programming environment - the C programming language. We describe the CUDA programming model and motivate its use in the biomedical imaging community.","1945-8452","978-1-4244-2002-5","10.1109/ISBI.2008.4541126","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4541126","","Parallel programming;Scientific computing;Computer architecture;Biomedical computing;Computer graphics;Workstations;Multicore processing;Central Processing Unit;Marine vehicles;Yarn","biomedical imaging;C language;computer graphic equipment;computer graphics;medical computing;parallel programming","CUDA;scalable parallel programming;high-performance scientific computing;graphics processing units;co-evolved hardware-software architecture;computational power;memory bandwidth;C programming language;biomedical imaging;GPU computing","","71","3","13","","13 Jun 2008","","","IEEE","IEEE Conferences"
"AI Drives Domain Specific Processors","Y. Kang","UNISOC Technologies Inc, Beijing, China","2018 IEEE Asian Solid-State Circuits Conference (A-SSCC)","16 Dec 2018","2018","","","13","16","In this paper we first list some of basic requirements for domain specific processors. Then we discuss several commonly used architectures for artificial intelligence domain applications. Their pros and cons are also compared. A new architecture defined as In-Cluster Coprocessor is presented which can best utilize existing memory hierarchy in a general processor and has an easy programming model. CBC has potential advantages of power saving and low cost. Further investigation on CBC is underway.","","978-1-5386-6413-1","10.1109/ASSCC.2018.8579282","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8579282","Domain-specific;GPU;TPU;SIMD;Vector;Cache Coherence;Cluster;Coprocessors","Computer architecture;Task analysis;Coprocessors;Graphics processing units","artificial intelligence;coprocessors","artificial intelligence domain;in-cluster coprocessor;memory hierarchy;AI drives;domain specific processors","","1","","7","","16 Dec 2018","","","IEEE","IEEE Conferences"
"Design and Experimental Evaluation of Distributed Heterogeneous Graph-Processing Systems","Y. Guo; A. L. Varbanescu; D. Epema; A. Iosup","Tech. Univ. Delft, Delft, Netherlands; Univ. of Amsterdam, Amsterdam, Netherlands; Tech. Univ. Delft, Delft, Netherlands; Tech. Univ. Delft, Delft, Netherlands","2016 16th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing (CCGrid)","21 Jul 2016","2016","","","203","212","Graph processing is increasingly used in a variety of domains, from engineering to logistics and from scientific computing to online gaming. To process graphs efficiently, GPU-enabled graph-processing systems such as TOTEM and Medusa exploit the GPU or the combined CPU+GPU capabilities of a single machine. Unlike scalable distributed CPU-based systems such as Pregel and GraphX, existing GPU-enabled systems are restricted to the resources of a single machine, including the limited amount of GPU memory, and thus cannot analyze the increasingly large-scale graphs we see in practice. To address this problem, we design and implement three families of distributed heterogeneous graph-processing systems that can use both the CPUs and GPUs of multiple machines. We further focus on graph partitioning, for which we compare existing graph-partitioning policies and a new policy specifically targeted at heterogeneity. We implement all our distributed heterogeneous systems based on the programming model of the single-machine TOTEM, to which we add (1) a new communication layer for CPUs and GPUs across multiple machines to support distributed graphs, and (2) a workload partitioning method that uses offline profiling to distribute the work on the CPUs and the GPUs. We conduct a comprehensive real-world performance evaluation for all three families. To ensure representative results, we select 3 typical algorithms and 5 datasets with different characteristics. Our results include algorithm run time, performance breakdown, scalability, graph partitioning time, and comparison with other graph-processing systems. They demonstrate the feasibility of distributed heterogeneous graph processing and show evidence of the high performance that can be achieved by combining CPUs and GPUs in a distributed environment.","","978-1-5090-2453-7","10.1109/CCGrid.2016.53","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7515690","Graph Processing;Distributed Heterogeneous Systems","Central Processing Unit;Graphics processing units;Programming;Partitioning algorithms;Space exploration;Arrays","computer games;engineering;graph theory;graphics processing units;logistics;parallel processing","distributed heterogeneous graph-processing systems;engineering;logistics;scientific computing;online gaming;GPU-enabled graph-processing systems;scalable distributed CPU-based systems;large-scale graphs;single-machine TOTEM;high performance computing","","2","","45","","21 Jul 2016","","","IEEE","IEEE Conferences"
"Neneta: Heterogeneous computing complex-valued neural network framework","V. Lekić; Z. Babić","Faculty of Electrical Engineering, University of Banja Luka, 78000, Bosnia and Herzegovina; Faculty of Electrical Engineering, University of Banja Luka, 78000, Bosnia and Herzegovina","2017 40th International Convention on Information and Communication Technology, Electronics and Microelectronics (MIPRO)","13 Jul 2017","2017","","","192","196","Due to increased demand for computational efficiency for the training, validation and testing of artificial neural networks, many open source software frameworks have emerged. Almost exclusively GPU programming model of choice in such software frameworks is CUDA. Symptomatic is also lack of the support for complex-valued neural networks. With our research going exactly in that direction, we developed and made publicly available yet another software framework, completely based on C++ and OpenCL standards with which we try to solve problems we identified with already existing solutions.","","978-953-233-090-8","10.23919/MIPRO.2017.7973416","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7973416","","Graphics processing units;Training;Neural networks;Kernel;Performance evaluation","C++ language;graphics processing units;neural nets;parallel architectures;public domain software","Neneta;heterogeneous computing;complex-valued neural network;artificial neural networks;open source software frameworks;GPU programming;CUDA;C++ language;OpenCL standards","","","","16","","13 Jul 2017","","","IEEE","IEEE Conferences"
"Parallel implementation of the modified subset sum problem in CUDA","Z. Ristovski; I. Mishkovski; S. Gramatikov; S. Filiposka","Faculty of Computer Sciences and Engineering, P.O. Box 393, 1000 Skopje, R. Macedonia; Faculty of Computer Sciences and Engineering, P.O. Box 393, 1000 Skopje, R. Macedonia; Faculty of Computer Sciences and Engineering, P.O. Box 393, 1000 Skopje, R. Macedonia; Faculty of Computer Sciences and Engineering, P.O. Box 393, 1000 Skopje, R. Macedonia","2014 22nd Telecommunications Forum Telfor (TELFOR)","9 Feb 2015","2014","","","923","926","In the recent years, computing is shifting from “central processing” on the CPU to “co-processing” on the CPU and GPU. This computing paradigm shift is due to the development of CUDA (Compute Unified Device Architecture) parallel computing architecture. CUDA is a programming model for parallel computing in Graphics Processing Units (GPUs). In this work, we have implemented parallel solution of the NP-complete modified subset sum algorithm using CUDA. With our implementation, for a certain problem size, we have obtained speedup of 20 times, compared to the CPU version.","","978-1-4799-6191-7","10.1109/TELFOR.2014.7034556","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7034556","CUDA;Modified subset sum algorithm;GPGPU;Parallel Speedup","Graphics processing units;Vectors;Instruction sets;Central Processing Unit;Programming;Peer-to-peer computing;Computer architecture","graphics processing units;mathematics computing;optimisation;parallel architectures;set theory","CUDA;CPU;GPU;coprocessing;central processing;computing paradigm shift;compute unified device architecture;parallel computing architecture;graphics processing units;NP-complete modified subset sum algorithm","","2","","11","","9 Feb 2015","","","IEEE","IEEE Conferences"
"Throughput-Effective On-Chip Networks for Manycore Accelerators","A. Bakhoda; J. Kim; T. M. Aamodt","ECE Dept., Univ. of British Columbia, Vancouver, BC, Canada; CS Dept., KAIST, Daejeon, South Korea; ECE Dept., Univ. of British Columbia, Vancouver, BC, Canada","2010 43rd Annual IEEE/ACM International Symposium on Microarchitecture","20 Jan 2011","2010","","","421","432","As the number of cores and threads in manycore compute accelerators such as Graphics Processing Units (GPU) increases, so does the importance of on-chip interconnection network design. This paper explores throughput-effective network-on-chips (NoC) for future manycore accelerators that employ bulk-synchronous parallel (BSP) programming models such as CUDA and OpenCL. A hardware optimization is ""throughput-effective"" if it improves parallel application level performance per unit chip area. We evaluate performance of future looking workloads using detailed closed-loop simulations modeling compute nodes, NoC and the DRAM memory system. We start from a mesh design with bisection bandwidth balanced with off-chip demand. Accelerator workloads tend to demand high off-chip memory bandwidth which results in a many-to-few traffic pattern when coupled with expected technology constraints of slow growth in pins-per-chip. Leveraging these observations we reduce NoC area by proposing a ""checkerboard"" NoC which alternates between conventional full-routers and half-routers with limited connectivity. Checkerboard employs a new oblivious routing algorithm that maintains a minimum hop-count for architectures that place L2 cache banks at the half-router nodes. Next, we show that increasing network injection bandwidth for the large amount of read reply traffic at the nodes connected to DRAM controllers alleviates a significant fraction of the remaining imbalance resulting from the many-to-few traffic pattern. The combined effect of the above optimizations with an improved placement of memory controllers in the mesh and channel slicing improves application throughput per unit area by 25.4%.","2379-3155","978-1-4244-9071-4","10.1109/MICRO.2010.50","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5695555","NoC;Compute accelerator;GPGPU","Bandwidth;Throughput;Computational modeling;Instruction sets;Benchmark testing;Computer architecture;Random access memory","circuit optimisation;circuit simulation;multiprocessing systems;multiprocessor interconnection networks;network routing;network-on-chip;parallel programming","manycore compute accelerator;on-chip interconnection network design;throughput-effective network-on-chip;throughput-effective NoC;bulk-synchronous parallel programming model;BSP programming model;hardware optimization;closed-loop simulation;DRAM memory system;off-chip memory bandwidth;pins-per-chip;checkerboard NoC;routing algorithm;L2 cache banks;network injection bandwidth","","94","1","49","","20 Jan 2011","","","IEEE","IEEE Conferences"
"An MDE Approach for Automatic Code Generation from UML/MARTE to OpenCL","A. W. O. Rodrigues; F. Guyomarc'h; J. Dekeyser","Federal Institute of Education, Science, and Technology of Ceará; University of Lille; University of Lille","Computing in Science & Engineering","21 Jan 2013","2013","15","1","46","55","To reduce the design complexity of OpenCL programming, the approach proposed here generates application code automatically, based on model-driven engineering (MDE) and modeling and analysis of real-time and embedded (MARTE) systems. The aim is to provide application-development resources for nonspecialists in parallel programming, exploiting concepts such as reuse and platform independence.","1558-366X","","10.1109/MCSE.2012.35","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6171148","model-driven engineering;MARTE;OpenCL;GPU;high-performance computing;scientific computing","Unified modeling language;Computational modeling;Computer architecture;Software engineering;Resource management;Parallel programming;Scientific computing","computational complexity;program compilers;software engineering;Unified Modeling Language","MDE approach;automatic code generation;UML/MARTE system;OpenCL programming;model-driven engineering;modeling and analysis of real-time and embedded systems;application-development resources;parallel programming;design complexity","","20","","9","","19 Mar 2012","","","IEEE","IEEE Magazines"
"Fast Motion Estimation on Graphics Hardware for H.264 Video Encoding","M. Schwalb; R. Ewerth; B. Freisleben","Dept. of Math. & Comput. Sci., Univ. of Marburg, Marburg; Dept. of Math. & Comput. Sci., Univ. of Marburg, Marburg; Dept. of Math. & Comput. Sci., Univ. of Marburg, Marburg","IEEE Transactions on Multimedia","13 Jan 2009","2009","11","1","1","10","The video coding standard H.264 supports video compression with a higher coding efficiency than previous standards. However, this comes at the expense of an increased encoding complexity, in particular for motion estimation which becomes a very time consuming task even for today's central processing units (CPU). On the other hand, modern graphics hardware includes a powerful graphics processing unit (GPU) whose computing power remains idle most of the time. In this paper, we present a GPU based approach to motion estimation for the purpose of H.264 video encoding. A small diamond search is adapted to the programming model of modern GPUs to exploit their available parallel computing power and memory bandwidth. Experimental results demonstrate a significant reduction of computation time and a competitive encoding quality compared to a CPU UMHexagonS implementation while enabling the CPU to process other encoding tasks in parallel.","1941-0077","","10.1109/TMM.2008.2008873","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4721593","Parallel motion estimation;H.264;GPGPU (general purpose computation on GPU);programmable graphics hardware;MPEG-4 part 10/AVC","Motion estimation;Graphics;Hardware;Encoding;Central Processing Unit;Video compression;Video coding;Parallel programming;Parallel processing;Bandwidth","computer graphic equipment;data compression;motion estimation;video coding","fast motion estimation;graphics hardware;H.264 video encoding;video compression;graphics processing unit;parallel computing","","25","2","12","IEEE","22 Dec 2008","","","IEEE","IEEE Journals"
"Porting an explicit time-domain volume-integral-equation solver on gpus with openacc [open problems in cem]","S. Feki; A. Al-Jarro; A. Clo; H. Bagci","KAUST Supercomputing Laboratory; Division of Computer, Electrical and Mathematical Sciences and Engineering, University College London, London WC1E 7JE, UK; Photonics Group, Department of Electronic and Electrical Engineering, University College London, London WC1E 7JE, UK; KAUST Research Computing, King Abdullah University of Science and Technology (KAUST), Thuwal, 23955-6900, KSA; Division of Computer, Electrical and Mathematical Sciences and Engineering, University College London, London WC1E 7JE, UK","IEEE Antennas and Propagation Magazine","17 Jun 2014","2014","56","2","265","277","Graphics processing units (GPUs) are gradually becoming mainstream in high-performance computing, as their capabilities for enhancing performance of a large spectrum of scientific applications to many fold when compared to multi-core CPUs have been clearly identified and proven. In this paper, implementation and performance-tuning details for porting an explicit marching-on-in-time (MOT)-based time-domain volume-integral-equation (TDVIE) solver onto GPUs are described in detail. To this end, a high-level approach, utilizing the OpenACC directive-based parallel programming model, is used to minimize two often-faced challenges in GPU programming: developer productivity and code portability. The MOT-TDVIE solver code, originally developed for CPUs, is annotated with compiler directives to port it to GPUs in a fashion similar to how OpenMP targets multi-core CPUs. In contrast to CUDA and OpenCL, where significant modifications to CPU-based codes are required, this high-level approach therefore requires minimal changes to the codes. In this work, we make use of two available OpenACC compilers, CAPS and PGI. Our experience reveals that different annotations of the code are required for each of the compilers, due to different interpretations of the fairly new standard by the compiler developers. Both versions of the OpenACC accelerated code achieved significant performance improvements, with up to 30× speedup against the sequential CPU code using recent hardware technology. Moreover, we demonstrated that the GPU-accelerated fully explicit MOT-TDVIE solver leveraged energy-consumption gains of the order of 3× against its CPU counterpart.","1558-4143","","10.1109/MAP.2014.6837098","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6837098","Time domain volume integral equation;explicit marching-on-in-time scheme;parallel programming;parallel processing;graphics processing unit (GPU);OpenACC","Graphics processing units;Acceleration;Finite element analysis;Convolutional codes;Time-domain analysis;Programming","","","","3","","27","IEEE","17 Jun 2014","","","IEEE","IEEE Magazines"
"Speeding Up Homomorpic Hashing Using GPUs","K. Zhao; X. Chu; M. Z. Wang; Y. Jiang","Dept. of Comput. Sci., Hong Kong Baptist Univ., Hong Kong, China; Dept. of Comput. Sci., Hong Kong Baptist Univ., Hong Kong, China; NA; NA","2009 IEEE International Conference on Communications","11 Aug 2009","2009","","","1","5","Homomorphic hash functions (HHFs) have been applied into peer-to-peer networks with erasure coding or network coding to defend against pollution attacks. Unfortunately HHFs are computationally expensive for contemporary CPUs, This paper to exploit the computing power of graphic processing units (GPUs) for homomorphic hashing. Specifically, we demonstrate how to use NVIDIA GPUs and the computer unified device architecture (CUDA) programming model to achieve 38 times of speedup over the CPU counterpart. We also develop a multi-precision modular arithmetic library on CUDA platform, which is not only key to our specific application, but also very useful for a large number of cryptographic applications.","1938-1883","978-1-4244-3435-0","10.1109/ICC.2009.5199483","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5199483","","Application software;Peer to peer computing;Network coding;Pollution;Computer graphics;Computer architecture;Central Processing Unit;Arithmetic;Libraries;Cryptography","computer graphics;coprocessors;cryptography;Internet;peer-to-peer computing;telecommunication security","homomorphic hash functions;NVIDIA GPU;graphic processing units;peer-to-peer networks;erasure coding;network coding;pollution attacks;contemporary CPU;computer unified device architecture programming model;cryptographic applications;Internet applications","","2","","17","","11 Aug 2009","","","IEEE","IEEE Conferences"
"CuMAPz: A tool to analyze memory access patterns in CUDA","Y. Kim; A. Shrivastava","Compiler and Microarchitecture Laboratory, Arizona State University, Tempe 85281, USA; Compiler and Microarchitecture Laboratory, Arizona State University, Tempe 85281, USA","2011 48th ACM/EDAC/IEEE Design Automation Conference (DAC)","11 Aug 2011","2011","","","128","133","CUDA programming model provides a simple interface to program on GPUs, but tuning GPGPU applications for high performance is still quite challenging. Programmers need to consider several architectural details, and small changes in source code, especially on memory access pattern, affect performance significantly. This paper presents CuMAPz, a tool to compare the memory performance of a CUDA program. CuMAPz can help programmers explore different ways of using shared and global memories, and optimize their program for memory behavior. CuMAPz models several memory effects, e.g., data reuse, global memory access coalescing, shared memory bank conflict, channel skew, and branch divergence. By using CuMAPz to explore memory access design space, we could improve the performance of our benchmarks by 62% over the naive cases, and 32% over previous approach.","85-644924","978-1-4503-0636-2","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5981927","GPGPU;CUDA;Memory access pattern;Performance Estimation;Analytical Model","Instruction sets;Graphics processing unit;Kernel;Estimation;Channel estimation;Correlation;Benchmark testing","computer graphic equipment;coprocessors;parallel architectures;parallel programming;storage management","CuMAPz;memory access patterns;CUDA;CUDA programming model;GPU;GPGPU;source code;memory behavior;memory effects;data reuse;global memory access coalescing;shared memory bank conflict;channel skew;branch divergence;graphics processing units","","1","","21","","11 Aug 2011","","","IEEE","IEEE Conferences"
"Legion-based scientific data analytics on heterogeneous processors","L. Yu; H. Yu",University of Nebraska-Lincoln; University of Nebraska-Lincoln,"2016 IEEE International Conference on Big Data (Big Data)","6 Feb 2017","2016","","","2305","2314","We present a study of scientific data analytics on heterogeneous architectures using the Legion runtime system. Legion is a new programming model and runtime system targeting distributed heterogeneous architectures. It introduces logical regions as a new abstraction for describing the structures and usages of program data. We describe how to leverage logical regions to express important properties of program data, such as locality and independence, for scientific data analytics that can consist of multiple operations with different data types. Our approach can help users simplify programming on the data partition, data organization, and data movement for distributed-memory heterogeneous architectures, thereby facilitating a simultaneous execution of multiple analytics operations on modern and future supercomputers. We demonstrate the scalability and the usability of our approach by a hybrid data partitioning and distribution scheme for different data types using both CPUs and GPUs on a heterogeneous system.","","978-1-4673-9005-7","10.1109/BigData.2016.7840863","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7840863","scientific data analytics;heterogeneous processors;Legion","Program processors;Programming;Computer architecture;Data analysis;Supercomputers;Runtime;Parallel processing","data analysis;parallel programming;scientific information systems","legion-based scientific data analytics;heterogeneous processors;Legion runtime system;Legion programming model;logical regions;program data structures;program data usages;logical region leveraging;program data locality property;program data independence property;data partitioning;data organization;data movement;distributed-memory heterogeneous architectures;hybrid data partitioning-and-distribution scheme;CPU;GPU","","","","33","","6 Feb 2017","","","IEEE","IEEE Conferences"
"Intermediate-Level Synthesis of a Gauss-Jordan Elimination Linear Solver","M. Daigneault; J. P. David","Ecole Polytech. de Montreal, Univ. de Montreal, Montreal, QC, Canada; Ecole Polytech. de Montreal, Univ. de Montreal, Montreal, QC, Canada","2015 IEEE International Parallel and Distributed Processing Symposium Workshop","1 Oct 2015","2015","","","176","181","As the world of computing goes more and more parallel, reconfigurable computing can enable interesting compromises in terms of processing speed and power consumption between CPUs and GPUs. Yet, from a developer's perspective, programming Field-Programmable Gate Arrays to implement application specific processors still represents a significant challenge. In this paper, we present the application of an Intermediate-Level Synthesis methodology to the design of a Gauss-Jordan elimination linear solver on FPGA. The ILS methodology takes for input a language offering an Algorithmic-State Machine programming model. Each ASM handles blocking and non-blocking connections between data-synchronized channels having streaming interfaces with implicit ready-to-send/receive signals. Using our compiler, a scalable linear solver design reaching as much as 46.2 GFLOPS was designed and tested in a matter of days, showing how the ILS methodology can enable an interesting design time/performance compromise between RTL and HLS methodologies.","","978-1-4673-7684-6","10.1109/IPDPSW.2015.98","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7284306","","Hardware;Field programmable gate arrays;Synchronization;Data transfer;Algorithm design and analysis;Coprocessors;Clocks","field programmable gate arrays;graphics processing units","Gauss-Jordan elimination linear solver;parallel computing;reconfigurable computing;processing speed;power consumption;CPU;GPU;programming field-programmable gate arrays;application specific processors;intermediate-level synthesis methodology;FPGA;algorithmic-state machine programming model;nonblocking connections;data-synchronized channels;streaming interfaces;compiler;scalable linear solver design","","1","","15","","1 Oct 2015","","","IEEE","IEEE Conferences"
"Efficient Compilation and Execution of JVM-Based Data Processing Frameworks on Heterogeneous Co-Processors","C. Kotselidis; S. Diamantopoulos; O. Akrivopoulos; V. Rosenfeld; K. Doka; H. Mohammed; G. Mylonas; V. Spitadakis; W. Morgan","The University of Manchester; Exus Ltd.; SparkWorks ITC Ltd.; German Research Center for Artificial Intelligence; National Technical University of Athens; Kaleao Ltd.; Computer Technology Institute & Press Diophantus; Neurocom,Luxembourg; IProov Ltd.","2020 Design, Automation & Test in Europe Conference & Exhibition (DATE)","15 Jun 2020","2020","","","175","179","This paper addresses the fundamental question of how modern Big Data frameworks can dynamically and transparently exploit heterogeneous hardware accelerators. After presenting the major challenges that have to be addressed towards this goal, we describe our proposed architecture for automatic and transparent hardware acceleration of Big Data frameworks and applications. Our vision is to retain the uniform programming model of Big Data frameworks and enable automatic, dynamic Just-In-Time compilation of the candidate code segments that benefit from hardware acceleration to the corresponding format. In conjunction with machine learning-based device selection, that respect user-defined constraints (e.g., cost, time, etc.), we enable dynamic code execution on GPUs and FPGAs transparently to the user. In addition, we dynamically re-steer execution at runtime based on the availability of resources. Our preliminary results demonstrate that our approach can accelerate an existing Apache Flink application by up to 16.5x.","1558-1101","978-3-9819263-4-7","10.23919/DATE48585.2020.9116246","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9116246","","Europe;Automation;Task analysis;Artificial intelligence;Presses;Data processing;Engines","Big Data;coprocessors;field programmable gate arrays;graphics processing units;Java;learning (artificial intelligence);parallel programming;program compilers;virtual machines","modern Big Data frameworks;heterogeneous hardware accelerators;automatic hardware acceleration;transparent hardware acceleration;uniform programming model;just-in-time compilation;candidate code segments;machine learning-based device selection;dynamic code execution;heterogeneous coprocessors;JVM-based data processing frameworks;GPU;FPGA","","","","35","","15 Jun 2020","","","IEEE","IEEE Conferences"
"Optimizing sparse matrix-vector multiplication on CUDA","Zhuowei Wang; Xianbin Xu; Wuqing Zhao; Yuping Zhang; Shuibing He","school of computer, wuhan university, China; school of computer, wuhan university, China; school of computer, wuhan university, China; school of computer, wuhan university, China; school of computer, wuhan university, China","2010 2nd International Conference on Education Technology and Computer","29 Jul 2010","2010","4","","V4-109","V4-113","In recent years, GPUs have attracted the attention of many application developers as powerful massively parallel system. CUDA as a general purpose parallel computing architecture make GPUs an appealing choice to solve many complex computational problems in a more efficient way. In this paper, we discuss implementing optimizing spare matrix-vector multiplication on NVIDIA GPUs using CUDA programming model. We outline three optimizations include: (1) optimized CSR storage format, (2) optimized threads mapping, and (3) avoiding divergence judgment. We experimentally evaluate our optimizations on GeForce 9600 GTX, connect to Windows xp 64-bit system. In comparison with NVIDIA's SpMV library and NVIDIA's CUDDPA library, the results show that optimizing sparse matrix-vector multiplication on CUDA achieves better performance than other SpMV implementations.","2155-1812","978-1-4244-6370-1","10.1109/ICETC.2010.5529724","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5529724","GPUs;CUDA;SpMV;NVIDIA's SpMV library;NVIDIA's CUDDPA library","Sparse matrices;Concurrent computing;Libraries;Educational institutions;Graphics processing unit;Parallel processing;Parallel programming;Kernel;Computer science education","microprocessor chips;parallel processing;performance evaluation","sparse matrix-vector multiplication;powerful massively parallel system;general purpose parallel computing architecture;complex computational problem;NVIDIA GPU;CUDA programming model;optimized CSR storage format;optimized thread mapping;GeForce 9600 GTX;Windows xp 64-bit system","","5","","12","","29 Jul 2010","","","IEEE","IEEE Conferences"
"A Comparative Evaluation of Parallel Programming Models for Shared-Memory Architectures","L. M. Sanchez; J. Fernandez; R. Sotomayor; J. D. Garcia","Comput. Sci. Dept., Univ. Carlos III de Madrid, Leganés, Spain; Comput. Sci. Dept., Univ. Carlos III de Madrid, Leganés, Spain; Comput. Sci. Dept., Univ. Carlos III de Madrid, Leganés, Spain; Comput. Sci. Dept., Univ. Carlos III de Madrid, Leganés, Spain","2012 IEEE 10th International Symposium on Parallel and Distributed Processing with Applications","23 Aug 2012","2012","","","363","370","Nowadays, most computers that are commercially available off-the-shelf (COTS) include hardware features that increase the performance of parallel general-purpose threads (hyper threading, multicore, ccNUMA architectures) or SIMD kernels (CPU vector instructions, GPUs). The purpose of this paper is to perform a compared evaluation of several parallel programming models where each one is fitted to exploit some of these features but also each one requires a different level of programming skills. Four parallel programming models (OpenMP, Intel TBB, Intel ArBB, and CUDA) have been selected. The idea is to cover a wide spectrum of programming models and most of the parallel hardware features included in modern computers. On one hand, OpenMP and TBB platforms, that exploits parallel threads running on multicore systems. On the other hand, ArBB, that combines multicore parallel threads and multicore SIMD features with a simpler programming model, and CUDA that exploits SIMD features of the GPU hardware. Our results obtained with the benchmarks used on this paper suggest that OpenMP and TBB have a lower performance compared to ArBB and CUDA. But also that ArBB performance tends to be comparable with CUDA performance in most cases (although it is normally lower). Thus, there are evidences that a careful designed top range multicore and multisocket architecture, can be comparable in terms of performance with top range GPU cards for many applications, with the advantage of a simpler programming model.","2158-9208","978-1-4673-1631-6","10.1109/ISPA.2012.54","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6280314","GPGPU;Paralel computing;SIMD;Multicore","Computer architecture;Graphics processing unit;Parallel processing;Instruction sets;Computers;Benchmark testing;Programming","memory architecture;multi-threading;parallel architectures;performance evaluation;shared memory systems","parallel programming models;shared-memory architectures;commercially available off-the-shelf;COTS;parallel general-purpose threads;hyper threading;ccNUMA architectures;SIMD kernels;CPU vector instructions;GPU cards;programming skills;OpenMP;Intel TBB;Intel ArBB;CUDA;multicore SIMD features;multicore parallel threads;multisocket architecture","","","","28","","23 Aug 2012","","","IEEE","IEEE Conferences"
"Enabling an OpenCL Compiler for Embedded Multicore DSP Systems","J. Li; C. Kuan; T. Wu; J. K. Lee","Dept. of Comput. Sci., Nat. Tsing Hua Univ., Hsinchu, Taiwan; Dept. of Comput. Sci., Nat. Tsing Hua Univ., Hsinchu, Taiwan; Dept. of Comput. Sci., Nat. Tsing Hua Univ., Hsinchu, Taiwan; Dept. of Comput. Sci., Nat. Tsing Hua Univ., Hsinchu, Taiwan","2012 41st International Conference on Parallel Processing Workshops","25 Oct 2012","2012","","","545","552","OpenCL is an industry's attempt to unify heterogeneous multicore programming. With its programming model defining SPMD kernels, vector types, and address space qualifiers, OpenCL allows programmers to exploit data parallelism with multicore processors and SIMD instructions as well as data locality with memory hierarchy. Recently, OpenCL has gained success on many architectures, including multicore CPUs, GPUs, vector processors, embedded systems with application-specific processors, and even FPGAs. However, how to support OpenCL for embedded multicore DSP systems remains unaddressed. In this paper, we illustrate our OpenCL support for embedded multicore DSP systems. Our target platform consists of one MPU and a DSP subsystem with multiple DSPs. The DSPs we address are VLIW processors with clustered functional units and distributed register files. To generate efficient code for such DSPs, compilers are required to consider irregular register file access in many optimization phases. To utilize the DSPs with distributed register files, we propose a cluster-aware work-item dispatching scheme to vectorize OpenCL kernels and assign independent workload to clusters of a DSP. In addition, we also incorporate several optimizations to enable efficient DSP code generation. In our experiments, we employ a set of OpenCL benchmark programs to evaluate the effectiveness of our OpenCL support. The experiments are conducted on a DSP cycle-accurate simulator and a multicore evaluation board. We report average 29% performance improvement with our vectorization scheme and a near 2-fold speedup with two DSPs compared with a single-MPU setup.","2332-5690","978-1-4673-2509-7","10.1109/ICPPW.2012.74","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6337524","","Digital signal processing;Kernel;Vectors;Registers;Program processors;Multicore processing;VLIW","digital signal processing chips;electronic engineering computing;embedded systems;field programmable gate arrays;graphics processing units;multiprocessing systems;operating system kernels;optimising compilers;parallel processing;program compilers;software performance evaluation","OpenCL compiler;embedded multicore DSP systems;heterogeneous multicore programming;programming model;SPMD kernels;vector types;address space qualifiers;data parallelism;multicore processors;SIMD instructions;data locality;memory hierarchy;multicore CPU;GPU;vector processors;embedded systems;application-specific processors;FPGA;OpenCL support;MPU subsystem;DSP subsystem;VLIW processors;clustered functional units;distributed register files;compilers;irregular register file access;optimization phases;cluster-aware work-item dispatching scheme;OpenCL kernels;independent workload;DSP code generation;OpenCL benchmark programs;DSP cycle-accurate simulator;multicore evaluation board;performance improvement;vectorization scheme;single-MPU setup","","7","","15","","25 Oct 2012","","","IEEE","IEEE Conferences"
"OpenACC Cache Directive: Opportunities and Optimizations","A. Lashgar; A. Baniasadi",NA; NA,"2016 Third Workshop on Accelerator Programming Using Directives (WACCPD)","2 Feb 2017","2016","","","46","56","OpenACC's programming model presents a simple interface to programmers, offering a trade-off between performance and development effort. OpenACC relies on compiler technologies to generate efficient code and optimize for performance. Among the difficult to implement directives, is the cache directive. The cache directive allows the programmer to utilize accelerator's hardware- or software-managed caches by passing hints to the compiler. In this paper, we investigate the implementation aspect of cache directive under NVIDIA-like GPUs and propose optimizations for the CUDA backend. We use CUDA's shared memory as the software-managed cache space. We first show that a straightforward implementation can be very inefficient, and downgrade performance. We investigate the differences between this implementation and hand-written CUDA alternatives and introduce the following optimizations to bridge the performance gap between the two: i) improving occupancy by sharing the cache among several parallel threads and ii) optimizing cache fetch and write routines via parallelization and minimizing control flow. We present compiler passes to apply these optimizations. Investigating three test cases, we show that the best cache directive implementation can perform very close to hand-written CUDA equivalent and improve performance up to 2.18X (compared to the baseline OpenACC.).","","978-1-5090-6152-5","10.1109/WACCPD.2016.009","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7836580","OpenACC;Cache memory;CUDA;Software-managed cache;Performance","Indexes;Graphics processing units;Arrays;Optimization;Programming;Acceleration;Hardware","cache storage;multi-threading;parallel architectures;program compilers;shared memory systems","open accelerator;control flow minimization;parallelization;write routines;cache fetch;parallel threads;software-managed cache space;CUDA shared memory;CUDA backend;NVIDIA-like GPU;accelerator hardware;code generation;compiler technologies;programmer interface;OpenACC programming model;OpenACC cache directive","","4","","13","","2 Feb 2017","","","IEEE","IEEE Conferences"
"Flexible Linear Algebra Development and Scheduling with Cholesky Factorization","A. Haidar; A. YarKhan; C. Cao; P. Luszczek; S. Tomov; J. Dongarra","Univ. of Tennessee, Knoxville, TN, USA; Univ. of Tennessee, Knoxville, TN, USA; Univ. of Tennessee, Knoxville, TN, USA; Univ. of Tennessee, Knoxville, TN, USA; Univ. of Tennessee, Knoxville, TN, USA; Univ. of Tennessee, Knoxville, TN, USA","2015 IEEE 17th International Conference on High Performance Computing and Communications, 2015 IEEE 7th International Symposium on Cyberspace Safety and Security, and 2015 IEEE 12th International Conference on Embedded Software and Systems","30 Nov 2015","2015","","","861","864","Modern high performance computing environments are composed of networks of compute nodes that often contain a variety of heterogeneous compute resources, such as multicore CPUs and GPUs. One challenge faced by domain scientists ishow to efficiently use all these distributed, heterogeneous resources. Inorder to use the GPUs effectively, the workload parallelism needs to be muchgreater than the parallelism for a multicore-CPU. Additionally, effectivelyusing distributed memory nodes brings out another level of complexity where theworkload must be carefully partitioned over the nodes. In this work we areusing a lightweight runtime environment to handle many of the complexities insuch distributed, heterogeneous systems. The runtime environment usestask-superscalar concepts to enable the developer to write serial code whileproviding parallel execution. The task-programming model allows the developerto write resource-specialization code, so that each resource gets theappropriate sized workload-grain. Our task-programming abstraction enables thedeveloper to write a single algorithm that will execute efficiently across the distributed heterogeneous machine. We demonstrate the effectiveness of ourapproach with performance results for dense linear algebra applications, specifically the Cholesky factorization.","","978-1-4799-8937-9","10.1109/HPCC-CSS-ICESS.2015.285","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7336271","Cholesky factorization;accelerator-based distributed memory computers;superscalar dataflow scheduling;heterogeneous HPC computing","Multicore processing;Runtime;Hardware;Graphics processing units;Scalability;Linear algebra;Parallel processing","distributed memory systems;graphics processing units;mathematics computing;matrix decomposition;parallel processing;resource allocation;scheduling","flexible linear algebra development;flexible linear algebra scheduling;Cholesky factorization;high performance computing environments;compute nodes;heterogeneous compute resources;distributed resources;GPU;workload parallelism;multicore-CPU;distributed memory nodes;task-superscalar concept;serial code;parallel execution;task-programming model;resource-specialization code;task-programming abstraction;distributed heterogeneous machine","","1","","20","","30 Nov 2015","","","IEEE","IEEE Conferences"
"Portable data-parallel visualization and analysis in distributed memory environments","C. Sewell; L. Lo; J. Ahrens","CCS-7, Los Alamos National Laboratory, USA; CCS-7, Los Alamos National Laboratory, USA; CCS-7, Los Alamos National Laboratory, USA","2013 IEEE Symposium on Large-Scale Data Analysis and Visualization (LDAV)","2 Dec 2013","2013","","","25","33","Data-parallelism is a programming model that maps well to architectures with a high degree of concurrency. Algorithms written using data-parallel primitives can be easily ported to any architecture for which an implementation of these primitives exists, making efficient use of the available parallelism on each. We have previously published results demonstrating our ability to compile the same data-parallel code for several visualization algorithms onto different on-node parallel architectures (GPUs and multi-core CPUs) using our extension of NVIDIA's Thrust library. In this paper, we discuss our extension of Thrust to support concurrency in distributed memory environments across multiple nodes. This enables the application developer to write data-parallel algorithms while viewing the data as single, long vectors, essentially without needing to explicitly take into consideration whether the values are actually distributed across nodes. Our distributed wrapper for Thrust handles the communication in the backend using MPI, while still using the standard Thrust library to take advantage of available on-node parallelism. We describe the details of our distributed implementations of several key data-parallel primitives, including scan, scatter/gather, sort, reduce, and upper/lower bound. We also present two higher-level distributed algorithms developed using these primitives: isosurface and KD-tree construction. Finally, we provide timing results demonstrating the ability of these algorithms to take advantage of available parallelism on nodes and across multiple nodes, and discuss scaling limitations for communication-intensive algorithms such as KD-tree construction.","","978-1-4799-1659-7","10.1109/LDAV.2013.6675155","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6675155","","Program processors;Vectors;Algorithm design and analysis;Indexes;Isosurfaces;Computer architecture;Parallel processing","concurrency control;data analysis;data visualisation;distributed memory systems;parallel algorithms","portable data-parallel visualization;portable data-parallel analysis;distributed memory environments;programming model;concurrency degree;data-parallel primitives;GPU;graphics processing unit;multicore CPU;on-node parallel architectures;visualization algorithms;NVIDIA Thrust library;data-parallel algorithms;MPI;message passing interface;Thrust library;scan primitives;scatter-gather primitives;sort primitives;reduce primitives;upper-lower bound primitives;isosurface primitives;KD-tree construction primitives;distributed algorithms","","5","","23","","2 Dec 2013","","","IEEE","IEEE Conferences"
"Hybrid MPI/OpenMP/OpenACC Implementations for the Solution of Convection-Diffusion Equations with the HOPMOC Method","F. L. Cabral; C. Osthoff; M. Kischinhevsky; D. Brandão","Laboratοrio Nac. de Computacno Cienc., Centro de Computacno de Alto Desempenho, Petrόpolis, Brazil; Laboratοrio Nac. de Computacno Cienc., Centro de Computacno de Alto Desempenho, Petrόpolis, Brazil; Inst. de Comput., Univ. Fed. Fluminense, Niterόi, Brazil; Centro Fed. de Educacno Tecnolοgica, CEFET, Colegiado de Inf., Nova Iguaçu, Brazil","2014 14th International Conference on Computational Science and Its Applications","6 Dec 2014","2014","","","196","199","The need for fast solution of large scientific and industrial problems has long motivated the quest for improvements both in software as well as in hardware, since the inception of computing tools. In this context, vectorization, parallelization of tasks have been important strategies for the improvement of hardware efficiency during the last decades. Operator splitting techniques for the numerical solution of partial differential equations are also an attempt towards the same goal, on the software side. This work presents two parallel implementations of the Hopmoc method to solve parabolic equations with convective dominance on a cluster with multiple multicore nodes or GPUs. The Hopmoc method is based both on the modified method of characteristics and the Hopscotch method. It is implemented through an explicit-implicit operator splitting technique. Hopmoc has been studied on distributed memory machines under MPI. In this work Hopmoc is implemented on clusters of multiple cores or GPUs in one single programming model. Previous results had shown that Hopmoc is a scalable parallel procedure with respect to distributed memory machines. New numerical results of the technique presented herein show performance improvements of up to 300 times when compared with the sequential version.","","978-1-4799-4264-0","10.1109/ICCSA.2014.44","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6976686","Parallel computing;Hopmoc method;Convection-diffusion equation","Mathematical model;Equations;Multicore processing;Message systems;Graphics processing units;Parallel processing","application program interfaces;convection;distributed memory systems;graphics processing units;mathematics computing;message passing;parabolic equations;partial differential equations;public domain software","Hybrid MPI-OpenMP-OpenACC implementation;HOPMOC Method;convection-diffusion equation solution;software improvement;computing tools;task parallelization;task vectorization;hardware efficiency improvement;numerical solution;partial differential equations;parallel implementations;Hopmoc method;parabolic equations;convective dominance;multiple multicore nodes;GPU;explicit-implicit operator splitting technique;distributed memory machines;multiple core clusters;programming model;scalable parallel procedure;performance improvement;numerical analysis","","6","","13","","6 Dec 2014","","","IEEE","IEEE Conferences"
"A Comparative Study of SYCL, OpenCL, and OpenMP","H. C. da Silva; F. Pisani; E. Borin","Inst. of Comput., Univ. of Campinas, Campinas, Brazil; Inst. of Comput., Univ. of Campinas, Campinas, Brazil; Inst. of Comput., Univ. of Campinas, Campinas, Brazil","2016 International Symposium on Computer Architecture and High Performance Computing Workshops (SBAC-PADW)","9 Jan 2017","2016","","","61","66","Recent trends indicate that future computing systems will be composed by a group of heterogeneous computing devices, including CPUs, GPUs, and other hardware accelerators. These devices provide increased processing performance, however, creating efficient code for them may require that programmers manage memory assignments and use specialized APIs, compilers, or runtime systems, thus making their programs dependent on specific tools. In this scenario, SYCL is an emerging C++ programming model for OpenCL that allows developers to write code for heterogeneous computing devices that are compatible with standard C++ compilation frameworks. In this paper, we analyze the performance and programming characteristics of SYCL, OpenMP, and OpenCL using both a benchmark and a real-world application. Our performance results indicate that programs that rely on available SYCL runtimes are not on par with the ones based on OpenMP and OpenCL yet. Nonetheless, the gap is getting smaller if we consider the results reported by previous studies. In terms of programmability, SYCL presents itself as a competitive alternative to OpenCL, requiring fewer lines of code to implement kernels and also fewer calls to essential API functions and methods.","","978-1-5090-4844-1","10.1109/SBAC-PADW.2016.19","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7803697","SYCL;OpenCL;OpenMP;parallel programming;performance evaluation;programmability evaluation","Benchmark testing;Programming;C++ languages;Performance evaluation;Kernel;MOS devices;Program processors","application program interfaces;C++ language;message passing;parallel programming;program compilers","API methods;API functions;programmability;standard C++ compilation frameworks;C++ programming model;runtime systems;compilers;hardware accelerators;GPU;CPU;heterogeneous computing devices;OpenMP;OpenCL;SYCL","","13","","16","","9 Jan 2017","","","IEEE","IEEE Conferences"
"Comparing performance and energy efficiency of FPGAs and GPUs for high productivity computing","B. Betkaoui; D. B. Thomas; W. Luk","Department of Computing, Imperial College London, United Kingdom; Department of Computing, Imperial College London, United Kingdom; Department of Computing, Imperial College London, United Kingdom","2010 International Conference on Field-Programmable Technology","6 Jan 2011","2010","","","94","101","This paper provides the first comparison of performance and energy efficiency of high productivity computing systems based on FPGA (Field-Programmable Gate Array) and GPU (Graphics Processing Unit) technologies. The search for higher performance compute solutions has recently led to great interest in heterogeneous systems containing FPGA and GPU accelerators. While these accelerators can provide significant performance improvements, they can also require much more design effort than a pure software solution, reducing programmer productivity. The CUDA system has provided a high productivity approach for programming GPUs. This paper evaluates the High-Productivity Reconfigurable Computer (HPRC) approach to FPGA programming, where a commodity CPU instruction set architecture is augmented with instructions which execute on a specialised FPGA co-processor, allowing the CPU and FPGA to co-operate closely while providing a programming model similar to that of traditional software. To compare the GPU and FPGA approaches, we select a set of established benchmarks with different memory access characteristics, and compare their performance and energy efficiency on an FPGA-based Hybrid-Core system with a GPU-based system. Our results show that while GPUs excel at streaming applications, high-productivity reconfigurable computing systems outperform GPUs in applications with poor locality characteristics and low memory bandwidth requirements.","","978-1-4244-8983-1","10.1109/FPT.2010.5681761","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5681761","","Benchmark testing;Field programmable gate arrays;Coprocessors;Graphics processing unit;Programming;Kernel;Instruction sets","computer graphic equipment;coprocessors;field programmable gate arrays;reconfigurable architectures","high productivity computing system;field-programmable gate array;graphics processing unit;CUDA system;high-productivity reconfigurable computer approach;FPGA programming;CPU instruction set architecture;FPGA-based hybrid-core system;GPU-based system","","37","","27","","6 Jan 2011","","","IEEE","IEEE Conferences"
"A Light-weight API for Portable Multicore Programming","C. G. Baker; M. A. Heroux; H. C. Edwards; A. B. Williams","Comp. Eng. & Energy Sci., Oak Ridge Nat. Lab., Oak Ridge, TN, USA; Scalable Algorithms, Sandia Nat. Labs., Albuquerque, NM, USA; Comput. Simulation Infrastruct., Sandia Nat. Labs., Albuquerque, NM, USA; Comput. Simulation Infrastruct., Sandia Nat. Labs., Albuquerque, NM, USA","2010 18th Euromicro Conference on Parallel, Distributed and Network-based Processing","22 Apr 2010","2010","","","601","606","Multicore nodes have become ubiquitous in just a few years. At the same time, writing portable parallel software for multicore nodes is extremely challenging. Widely available programming models such as OpenMP and Pthreads are not useful for devices such as graphics cards, and more flexible programming models such as RapidMind are only available commercially. OpenCL represents the first truly portable standard, but its availability is limited. In the presence of such transition, we have developed a minimal application programming interface (API) for multicore nodes that allows us to write portable parallel linear algebra software that can use any of the aforementioned programming models and any future standard models. We utilize C++ template meta-programming to enable users to write parallel kernels that can be executed on a variety of node types, including Cell, GPUs and multicore CPUs. The support for a parallel node is provided by implementing a Node object, according to the requirements specified by the API. This ability to provide custom support for particular node types gives developers a level of control not allowed by the current slate of proprietary parallel programming APIs. We demonstrate implementations of the API for a simple vector dot-product on sequential CPU, multicore CPU and GPU nodes.","2377-5750","978-1-4244-5673-4","10.1109/PDP.2010.49","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5452412","Parallel programming;multicore architectures","Multicore processing;Parallel programming;Linear programming;Writing;Graphics;Application software;Linear algebra;Software standards;Standards development;Kernel","application program interfaces;C++ language;linear algebra;mathematics computing;metacomputing;multiprocessing systems;parallel programming","portable multicore programming;multicore nodes;application programming interface;portable parallel linear algebra software;programming model;C++ template meta-programming;parallel kernels;multicore CPU;node object;parallel programming;vector dot-product;sequential CPU;GPU node","","7","","9","","22 Apr 2010","","","IEEE","IEEE Conferences"
"Implementation of XcalableMP Device Acceleration Extention with OpenCL","T. Nomizu; D. Takahashi; J. Lee; T. Boku; M. Sato","Grad. Sch. of Syst. & Inf. Eng., Univ. of Tsukuba, Tsukuba, Japan; Center for Comput. Sci., Univ. of Tsukuba, Tsukuba, Japan; Grad. Sch. of Syst. & Inf. Eng., Univ. of Tsukuba, Tsukuba, Japan; Fac. of Eng., Inf. & Syst., Univ. of Tsukuba, Tsukuba, Japan; Center for Comput. Sci., Univ. of Tsukuba, Tsukuba, Japan","2012 IEEE 26th International Parallel and Distributed Processing Symposium Workshops & PhD Forum","20 Aug 2012","2012","","","2394","2403","Due to their outstanding computational performance, many acceleration devices, such as GPUs, the Cell Broadband Engine (Cell/B.E.), and multi-core computing are attracting a lot of attention in the field of high-performance computing. Although there are many programming models and languages de-signed for programming accelerators, such as CUDA, AMD Accelerated Parallel Processing (AMD APP), and OpenCL, these models remain difficult and complex. Furthermore, when programming for accelerator-enhanced clusters, we have to use an inter-node programming interface, such as MPI to coordinate the nodes. In order to address these problems and reduce complexity, an extension to XcalableMP (XMP), a PGAS language, for use on accelerator-enhanced clusters, called XcalableMP Device Acceleration Extension (XMP-dev), is proposed. In XMP-dev, a global distributed data is mapped onto distributed memory of each accelerator, and a fragment of codes can be of-floaded to execute in a set of accelerators. It eliminates the complex programming between nodes and accelerators and between nodes. In this paper, we present an implementation of the XMP-dev runtime library with the OpenCL APIs, while the previous implementation targets CUDA-only. Since OpenCL is a standardized interface supported for various kinds of accelerators, it improves the portability of XMP-dev and reduces the cost of development. In the result of performance evaluation, we show that the OpenCL implementation of XMP-dev can generate portable programs that can run on not only NVIDIA GPU-enhanced clusters but also various accelerator-enhanced clusters.","","978-1-4673-0974-5","10.1109/IPDPSW.2012.296","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6270611","Cluster;Accelerator;OpenCL","Graphics processing unit;Acceleration;Kernel;Programming;Synchronization;Arrays","application program interfaces;graphics processing units;message passing;multiprocessing systems;parallel architectures;parallel programming","computational performance;acceleration device;Cell Broadband Engine;Cell/BE;multicore computing;high-performance computing;programming model;programming language;programming accelerator;CUDA;AMD Accelerated Parallel Processing;AMD APP;accelerator-enhanced cluster;internode programming interface;MPI;node coordination;complexity reduction;PGAS language;XcalableMP Device Acceleration Extension;global distributed data mapping;distributed memory;code fragment;XMP-dev runtime library;OpenCL API;standardized interface;XMP-dev portability;performance evaluation;OpenCL implementation;NVIDIA GPU-enhanced cluster","","5","","20","","20 Aug 2012","","","IEEE","IEEE Conferences"
"Automatic Resource Scheduling with Latency Hiding for Parallel Stencil Applications on GPGPU Clusters","K. Maeda; M. Murase; M. Doi; H. Komatsu; S. Noda; R. Himeno","IBM Res. - Tokyo, IBM Japan, Ltd., Tokyo, Japan; IBM Res. - Tokyo, IBM Japan, Ltd., Tokyo, Japan; Syst. & Technol. Group, IBM Japan, Ltd., Tokyo, Japan; IBM Res. - Tokyo, IBM Japan, Ltd., Tokyo, Japan; Adv. Center for Comput. & Commun., RIKEN, Wako, Japan; Adv. Center for Comput. & Commun., RIKEN, Wako, Japan","2012 IEEE 26th International Parallel and Distributed Processing Symposium","16 Aug 2012","2012","","","544","556","Overlapping computations and communication is a key to accelerating stencil applications on parallel computers, especially for GPU clusters. However, such programming is a time-consuming part of the stencil application development. To address this problem, we developed an automatic code generation tool to produce a parallel stencil application with latency hiding automatically from its dataflow model. With this tool, users visually construct the workflows of stencil applications in a dataflow programming model. Our dataflow compiler determines a data decomposition policy for each application, and generates source code that overlaps the stencil computations and communication (MPI and PCIe). We demonstrate two types of overlapping models, a CPU-GPU hybrid execution model and a GPU-only model. We use a CFD benchmark computing 19-point 3D stencils to evaluate our scheduling performance, which results in 1.45 TFLOPS in single precision on a cluster with 64 Tesla C1060 GPUs.","1530-2075","978-1-4673-0975-2","10.1109/IPDPS.2012.57","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6267857","latency hiding;network embedding;resource scheduling;stencil computations","Kernel;Graphics processing unit;Rivers;Hardware;Peer to peer computing;Computational modeling;Jacobian matrices","graphics processing units;parallel processing;partial differential equations;processor scheduling;search problems","automatic resource scheduling;latency hiding;parallel stencil applications;GPGPU Clusters;parallel computers;automatic code generation tool;dataflow programming model;dataflow compiler;data decomposition;source code generation;PDE;partial differential equations","","","","26","","16 Aug 2012","","","IEEE","IEEE Conferences"
"Coordinated static and dynamic cache bypassing for GPUs","X. Xie; Y. Liang; Y. Wang; G. Sun; T. Wang","Center for Energy-Efficient Computing and Applications, School of EECS, Peking University, China; Center for Energy-Efficient Computing and Applications, School of EECS, Peking University, China; Tsinghua National Laboratory for Information Science and Technology, Department of EE, Tsinghua University, China; Center for Energy-Efficient Computing and Applications, School of EECS, Peking University, China; Center for Energy-Efficient Computing and Applications, School of EECS, Peking University, China","2015 IEEE 21st International Symposium on High Performance Computer Architecture (HPCA)","9 Mar 2015","2015","","","76","88","The massive parallel architecture enables graphics processing units (GPUs) to boost performance for a wide range of applications. Initially, GPUs only employ scratchpad memory as on-chip memory. Recently, to broaden the scope of applications that can be accelerated by GPUs, GPU vendors have used caches in conjunction with scratchpad memory as on-chip memory in the new generations of GPUs. Unfortunately, GPU caches face many performance challenges that arise due to excessive thread contention for cache resource. Cache bypassing, where memory requests can selectively bypass the cache, is one solution that can help to mitigate the cache resource contention problem. In this paper, we propose coordinated static and dynamic cache bypassing to improve application performance. At compile-time, we identify the global loads that indicate strong preferences for caching or bypassing through profiling. For the rest global loads, our dynamic cache bypassing has the flexibility to cache only a fraction of threads. In CUDA programming model, the threads are divided into work units called thread blocks. Our dynamic bypassing technique modulates the ratio of thread blocks that cache or bypass at run-time. We choose to modulate at thread block level in order to avoid the memory divergence problems. Our approach combines compile-time analysis that determines the cache or bypass preferences for global loads with run-time management that adjusts the ratio of thread blocks that cache or bypass. Our coordinated static and dynamic cache bypassing technique achieves up to 2.28X (average I.32X) performance speedup for a variety of GPU applications.","2378-203X","978-1-4799-8930-0","10.1109/HPCA.2015.7056023","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7056023","","Instruction sets;Graphics processing units;Synchronization;Kernel;Pipelines;Arrays;System-on-chip","cache storage;graphics processing units;multi-threading;parallel architectures","coordinated static cache bypassing;coordinated dynamic cache bypassing;GPUs;parallel architecture;graphics processing units;scratchpad memory;on-chip memory;thread contention;cache resource contention problem;CUDA programming model;thread blocks;dynamic bypassing technique;memory divergence problems;compile-time analysis;bypass preferences;run-time management","","80","1","46","","9 Mar 2015","","","IEEE","IEEE Conferences"
"Performance characterization of the NAS Parallel Benchmarks in OpenCL","S. Seo; G. Jo; J. Lee","Center for Manycore Programming, School of Computer Science and Engineering, Seoul National University, 151-744, Korea; Center for Manycore Programming, School of Computer Science and Engineering, Seoul National University, 151-744, Korea; Center for Manycore Programming, School of Computer Science and Engineering, Seoul National University, 151-744, Korea","2011 IEEE International Symposium on Workload Characterization (IISWC)","29 Dec 2011","2011","","","137","148","Heterogeneous parallel computing platforms, which are composed of different processors (e.g., CPUs, GPUs, FPGAs, and DSPs), are widening their user base in all computing domains. With this trend, parallel programming models need to achieve portability across different processors as well as high performance with reasonable programming effort. OpenCL (Open Computing Language) is an open standard and emerging parallel programming model to write parallel applications for such heterogeneous platforms. In this paper, we characterize the performance of an OpenCL implementation of the NAS Parallel Benchmark suite (NPB) on a heterogeneous parallel platform that consists of general-purpose CPUs and a GPU. We believe that understanding the performance characteristics of conventional workloads, such as the NPB, with an emerging programming model (i.e., OpenCL) is important for developers and researchers to adopt the programming model. We also compare the performance of the NPB in OpenCL to that of the OpenMP version. We describe the process of implementing the NPB in OpenCL and optimizations applied in our implementation. Experimental results and analysis show that the OpenCL version has different characteristics from the OpenMP version on multicore CPUs and exhibits different performance characteristics depending on different OpenCL compute devices. The results also indicate that the application needs to be rewritten or re-optimized for better performance on a different compute device although OpenCL provides source-code portability.","","978-1-4577-2064-2","10.1109/IISWC.2011.6114174","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6114174","","Kernel;Graphics processing unit;Multicore processing;Indexes;Computational modeling;Optimization","graphics processing units;high level languages;microprocessor chips;parallel programming","NAS parallel benchmarks;OpenCL;heterogeneous parallel computing platforms;CPU;GPU;FPGA;DSP;parallel programming models;Open Computing Language;open standard;parallel applications;heterogeneous platforms;NAS Parallel Benchmark suite;NPB;heterogeneous parallel platform;source-code portability","","99","","36","","29 Dec 2011","","","IEEE","IEEE Conferences"
"The Exploration of Pervasive and Fine-Grained Parallel Model Applied on Intel Xeon Phi Coprocessor","C. Calvin; F. Ye; S. Petiton","DM2S Commissariat a l'Energie Atomique, CEA, France; DM2S Commissariat a l'Energie Atomique, CEA, France; Lab. d'Inf. Fondamentale de Lille, Univ. de Lille 1, Lille, France","2013 Eighth International Conference on P2P, Parallel, Grid, Cloud and Internet Computing","12 Dec 2013","2013","","","166","173","In this paper we investigate the dissimilar multithreading programming paradigms on x86 CPU architectures, where the recently released Intel Xeon Phi Coprocessor and commonly used Intel Xeon processors were studied, as well as the NVIDIA K20 GPU, which represents the cutting-edge general purpose graphics processing unit. The relevant numerical algorithm selected to address the problem is power method, which is widely used to compute the dominant eigenvalue of a matrix. This work focuses on dense linear algebra. The frequently used multi-core or many-core processor parallelism techniques include OpenMP, Intel Cilk Plus, Intel Threading Building Blocks, i.e. TBB, along with the optimized computing libraries such as Intel Math Kernel Library(MKL) or the NVIDIA CUDA Basic Linear Algebra Subroutines(cuBLAS) library. Optimized implementations of these techniques were separately applied to the aforementioned architectures. For the reason that a unitary programming model may not satisfy the growing performance demand, we also explored some possible mix of these languages. The study shows that the hybrid pattern of multithreading and data parallelism via explicit vectorization maximizes the performance on x86 architectures, which allows us to obtain 80% of the sustainable peak performance in double precision on the Intel Many Integrated Core(MIC) Architecture. In the case of single precision, this number reaches even 96%. In addition, this approach enables a reasonable performance by requiring least developing time. The numbers of iterations till convergence are roughly the same in both architectures of CPU and GPU. The GPU performs better in small matrix sizes. However, the Intel Xeon Phi coprocessor excels for large sizes with a better scalability.","","978-0-7695-5094-7","10.1109/3PGCIC.2013.31","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6681224","","Coprocessors;Vectors;Kernel;Graphics processing units;Arrays;Computational modeling","graphics processing units;mathematics computing;matrix algebra;multiprocessing systems;multi-threading;ubiquitous computing","fine-grained parallel model;pervasive model;dissimilar multithreading programming paradigms;Intel Xeon Phi coprocessor;NVIDIA K20 GPU;dense linear algebra;many-core processor parallelism techniques;OpenMP;Building Blocks;Intel Cilk Plus;Intel Threading;optimized computing libraries;Intel Math Kernel Library;NVIDIA CUDA basic linear algebra subroutines library;multithreading;data parallelism;iteration method;multicore processor parallelism techniques;general purpose graphics processing unit","","3","","18","","12 Dec 2013","","","IEEE","IEEE Conferences"
"TARCAD: A template architecture for reconfigurable accelerator designs","M. Shafiq; M. Pericàs; N. Navarro; E. Ayguadé","Computer Sciences, Barcelona Supercomputing Center, Spain; Computer Sciences, Barcelona Supercomputing Center, Spain; Dept. Arquitectura de Computadors, Universitat Politècnica de Catalunya, Barcelona, Spain; Computer Sciences, Barcelona Supercomputing Center, Spain","2011 IEEE 9th Symposium on Application Specific Processors (SASP)","7 Jul 2011","2011","","","8","15","In the race towards computational efficiency, accelerators are achieving prominence. Among the different types, accelerators built using reconfigurable fabric, such as FPGAs, have a tremendous potential due to the ability to customize the hardware to the application. However, the lack of a standard design methodology hinders the adoption of such devices and makes the portability and reusability across designs difficult. In addition, generation of highly customized circuits does not integrate nicely with high level synthesis tools. In this work, we introduce TARCAD, a template architecture to design reconfigurable accelerators. TARCAD enables high customization in the data management and compute engines while retaining a programming model based on generic programming principles. The template provides generality and scalable performance over a range of FPGAs. We describe the template architecture in detail and show how to implement five important scientific kernels: MxM, Acoustic Wave Equation, FFT, SpMV and Smith Waterman. TARCAD is compared with other High Level Synthesis models and is evaluated against GPUs, a well-known architecture that is far less customizable and, therefore, also easier to target from a simple and portable programming model. We analyze the TARCAD template and compare its efficiency on a large Xilinx Virtex-6 device to that of several recent GPU studies.","","978-1-4577-1213-5","10.1109/SASP.2011.5941071","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5941071","","Layout;Kernel;Computer architecture;Field programmable gate arrays;Hardware design languages;Monitoring;Registers","field programmable gate arrays;high level synthesis;reconfigurable architectures","TARCAD;template architecture;reconfigurable accelerator design;reconflgurable fabric;data management;programming model;generic programming;FPGA;acoustic wave equation;Xilinx Virtex-6 device;high level synthesis model","","1","","25","","7 Jul 2011","","","IEEE","IEEE Conferences"
"Meta-programming and Multi-stage Programming for GPGPUs","I. Masliah; M. Baboulin; J. Falcou","Univ. Paris Sud, Orsay, France; Univ. Paris Sud, Orsay, France; Univ. Paris Sud, Orsay, France","2016 IEEE 10th International Symposium on Embedded Multicore/Many-core Systems-on-Chip (MCSOC)","8 Dec 2016","2016","","","369","376","GPGPUs and other accelerators are becoming a mainstream asset for high-performance computing. Raising the programmability of such hardware is essential to enable users to discover, master and subsequently use accelerators in day-to-day simulations. Furthermore, tools for high-level programming of parallel architectures are becoming a great way to simplify the exploitation of such systems. For this reason, we have extended NT2 - the Numerical Template Toolbox - a C++ scientific computing library which can generate code for SIMD and multithreading systems in a transparent way using a MATLAB like syntax. In this paper, we study how to introduce an accelerator based programming model into this library to allow developers to reap the benefits of such an architecture. After a brief description of the NT2 framework, we explain how our accelerator programming model has been designed and integrated in a pure C++ library. We conclude by showing the applicability and performance of this tool on some practical applications.","","978-1-5090-3531-1","10.1109/MCSoC.2016.49","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7774460","GPU;Multi-stage;C++","Libraries;C++ languages;Graphics processing units;Programming;Computational modeling;MATLAB;Mathematical model","C++ language;graphics processing units;high level languages;parallel architectures","meta programming;multistage programming;GPGPUs;high-performance computing;accelerators;high-level programming;parallel architectures;numerical template toolbox;C++ scientific library computing;SIMD;multithreading systems;MATLAB","","","","28","","8 Dec 2016","","","IEEE","IEEE Conferences"
"SOLAR: Services-Oriented Deep Learning Architectures-Deep Learning as a Service","C. Wang; L. Gong; X. Li; Q. Yu; A. Wang; P. Hung; X. Zhou","University of Science and Technology of China, Hefei, Anhui, China; University of Science and Technology of China, Hefei, Anhui, China; University of Science and Technology of China, Hefei, Anhui, China; University of Science and Technology of China, Hefei, Anhui, China; University of Science and Technology of China, Hefei, Anhui, China; Business and Information Technology, University of Ontario Institute of Technology, Oshawa, ON, Canada; University of Science and Technology of China, Hefei, Anhui, China","IEEE Transactions on Services Computing","4 Feb 2021","2021","14","1","262","273","Deep learning has been an emerging field of machine learning during past decades. However, the diversity and large scale data size have posed significant challenge to construct a flexible and high performance implementations of deep learning neural networks. In order to improve the performance as well to maintain the scalability, in this paper we present SOLAR, a services-oriented deep learning architecture using various accelerators like GPU and FPGA. SOLAR provides a uniform programming model to users so that the hardware implementation and the scheduling is invisible to the programmers. At runtime, the services can be executed either on the software processors or the hardware accelerators. To leverage the trade-offs between the metrics among performance, power, energy, and efficiency, we present a multitarget design space exploration. Experimental results on the real state-of-the-art FPGA board demonstrate that the SOLAR is able to provide a ubiquitous framework for diverse applications without increasing the burden of the programmers. Moreover, the speedup of the GPU and FPGA hardware accelerator in SOLAR can achieve significant speedup comparing to the conventional Intel i5 processors with great scalability.","1939-1374","","10.1109/TSC.2017.2777478","NSFC(grant numbers:61379040); Anhui Provincial NSF(grant numbers:1608085QF12); Suzhou Research Foundation(grant numbers:SYG201625); Youth Innovation Promotion Association of the Chinese Academy of Sciences(grant numbers:2017497); Fundamental Research Funds for the Central Universities(grant numbers:WK2150110003); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8119814","Services-oriented architecture;deep learning;neural network;accelerator","Machine learning;Hardware;Service-oriented architecture;Computer architecture;Field programmable gate arrays;Training","field programmable gate arrays;learning (artificial intelligence);service-oriented architecture","hardware implementation;hardware accelerators;FPGA board;SOLAR;machine learning;large scale data size;flexible performance implementations;high performance implementations;deep learning neural networks;services-oriented deep learning architecture;uniform programming model;deep learning as a service","","2","","35","IEEE","24 Nov 2017","","","IEEE","IEEE Journals"
"Design consideration of Network Intrusion detection system using Hadoop and GPGPU","S. R. Bandre; J. N. Nandimath","Department of Computer Engineering, Smt. Kashibai Navale College of Engineering, Affiliated to Savitribai Phule Pune University, India; Department of Computer Engineering, Smt.Kashibai Navale College of Engineering, Affiliated to Savitribai Phule Pune University, India","2015 International Conference on Pervasive Computing (ICPC)","16 Apr 2015","2015","","","1","6","Modern computing has primarily shifted towards the distributed environment using commodity resources which results in increase in data and its security concern. This paper deals with design consideration of Network Intrusion Detection System (NIDS) based on the Hadoop framework and acceleration of its performance by using General Purpose Graphical Processing Unit (GPGPU). The large volume of data from an entire infrastructure is assigned to Hadoop framework and intrusion detections are carried out on GPGPU. This approach improves NIDS performance and it enables to provide quick response to various attacks on the network. In order to perform the general purposed computation on the GPU, NVidia provides the Compute Unified Device Architecture (CUDA) which is a parallel programming model which performs high-end complex operations using GPU. In order to process large volumes of data in distributed networks, Hadoop framework has to configure with various supporting ecosystems like Flume, Pig, Hive and HBase. These ecosystems enable the Hadoop framework to handle streaming data on the network and large log files on servers. The proposed system is capable of performing analytics over intrusion pattern and their behavior on the network, which helps a network administrator to configure network security policy and settings. Analytics over intrusion is done by using a Score-Weight approach called as Pattern Frequency Inverse Cluster Frequency (PF-ICF). The design consideration of accelerated NIDS is a solution towards the performance issues of various NIDS that faces due to the large volumes of the network traffic.","","978-1-4799-6272-3","10.1109/PERVASIVE.2015.7087201","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7087201","CUDA;GPGPU;Hadoop;Network Security;NIDS","Graphics processing units;Intrusion detection;Servers;Ecosystems;Algorithm design and analysis;Telecommunication traffic","data analysis;graphics processing units;parallel architectures;parallel programming;security of data","network intrusion detection system;GPGPU;Hadoop framework;general purpose graphical processing unit;NIDS;NVidia;Compute Unified Device Architecture;CUDA;parallel programming model;Flume;Pig;Hive;HBase;streaming data handling;log files;intrusion pattern analytics;network security policy;score-weight approach;pattern frequency inverse cluster frequency;PF-ICF;network traffic","","8","","15","","16 Apr 2015","","","IEEE","IEEE Conferences"
"An Efficient Acceleration of Symmetric Key Cryptography Using General Purpose Graphics Processing Unit","F. Wu; C. -h. Chen; H. Narang","Comput. Sci. Dept., Tuskegee Univ., Tuskegee, AL, USA; Comput. Sci. Dept., Tuskegee Univ., Tuskegee, AL, USA; Comput. Sci. Dept., Tuskegee Univ., Tuskegee, AL, USA","2010 Fourth International Conference on Emerging Security Information, Systems and Technologies","11 Nov 2010","2010","","","228","233","Graphics Processing Units (GPU) have been the extensive research topic in recent years and have been successfully applied to general purpose applications other than computer graphical area. The nVidia CUDA programming model provides a straightforward means of describing inherently parallel computations. In this paper, we present a study of the efficiency of emerging technology in applying General Purpose Graphics Processing Units (GPGPU) in high performance symmetric key cryptographic solutions. We implemented symmetric key cryptography algorithm using the novel CUDA platform on nVidia Geforce 280 GTX and compared its performance with an optimized CPU implementation on a high-end AMD Opteron Dual Core CPU. Our experimental results show that GPGPU can perform as an efficient cryptographic accelerator and the developed GPU based implementation achieve a significant performance improvement over CPU based implementation and the maximum observed speedups are about 100 times.","2162-2116","978-1-4244-7517-9","10.1109/SECURWARE.2010.44","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5633744","Symmetric Key Cryptography;High Performance Computation;Purpose Graphics Processing Unit;CUDA","Graphics processing unit;Cryptography;Kernel;Instruction sets;Computer architecture;Central Processing Unit","computer graphic equipment;coprocessors;cryptography","efficient acceleration;symmetric key cryptography;general purpose graphics processing unit;computer graphical area;nVidia CUDA programming model;parallel computations;GPGPU;performance symmetric key cryptographic solutions;nVidia Geforce 280 GTX","","1","","12","","11 Nov 2010","","","IEEE","IEEE Conferences"
"A Sparse Matrix Personality for the Convey HC-1","K. K. Nagar; J. D. Bakos","Dept. of Comput. Sci. & Eng., Univ. of South Carolina, Columbia, SC, USA; Dept. of Comput. Sci. & Eng., Univ. of South Carolina, Columbia, SC, USA","2011 IEEE 19th Annual International Symposium on Field-Programmable Custom Computing Machines","19 May 2011","2011","","","1","8","In this paper we describe a double precision floating point sparse matrix-vector multiplier (SpMV) and its performance as implemented on a Convey HC-1 reconfigurable computer. The primary contributions of this work are a novel streaming reduction architecture for floating point accumulation, a novel on-chip cache optimized for streaming compressed sparse row (CSR) matrices, and end-to-end integration with the HC-1's system, programming model, and runtime environment. The design is composed of 32 parallel processing elements, each connected to the HC-1's coprocessor memory and each containing a streaming multiply-accumulator and local vector cache. When used on the HC-1, each PE has a peak throughput of 300 double precision MFLOP/s, giving a total peak throughput of 9.6 GFLOPS/s. For our test matrices, we demonstrate up to 40% of the peak performance and compare these results with results obtained using the CUSparse library on an NVIDIA Tesla S1070 GPU. In most cases our implementation exceeds the performance of the GPU.","","978-1-61284-277-6","10.1109/FCCM.2011.60","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5771239","floating point accumulation;reduction;reconfigurable computing;sparse matrix;SpMV","Adders;Coprocessors;Arrays;Sparse matrices;Field programmable gate arrays;Pipelines","cache storage;coprocessors;floating point arithmetic;matrix multiplication;multiplying circuits;parallel processing;reconfigurable architectures;sparse matrices","sparse matrix personality;double precision floating point sparse matrix-vector multiplier;Convey HC-1 reconfigurable computer;streaming reduction architecture;floating point accumulation;on-chip cache;compressed sparse row matrix;end-to-end integration;HC-1 system;programming model;runtime environment;parallel processing;HC-1 coprocessor memory;multiply-accumulator;local vector cache;CUSparse library","","29","","21","","19 May 2011","","","IEEE","IEEE Conferences"
"Extending OpenACC for Efficient Stencil Code Generation and Execution by Skeleton Frameworks","A. D. Pereira; M. Castro; M. A. R. Dantas; R. C. O. Rocha; L. F. W. Góes","Fed. Univ. of Santa Catarina, Florianopolis, Brazil; Fed. Univ. of Santa Catarina, Florianopolis, Brazil; Fed. Univ. of Santa Catarina, Florianopolis, Brazil; Univ. of Edinburgh, Edinburgh, UK; Pontifical Catholic Univ. of Minas Gerais, Belo Horizonte, Brazil","2017 International Conference on High Performance Computing & Simulation (HPCS)","14 Sep 2017","2017","","","719","726","The OpenACC programming model simplifies the programming for accelerator devices such as GPUs. Its abstract accelerator model defines a least common denominator for accelerator devices, thus it cannot represent architectural specifics of these devices without losing portability. Therefore, this general- purpose approach delivers good performance on average, but it misses optimization opportunities for code generation and execution of specific classes of applications. In this paper, we propose OpenACC extensions to enable efficient code generation and execution of stencil applications by parallel skeleton frameworks such as PSkel. Our results show that our stencil extensions may improve the performance of OpenACC in up to 28% and 45% on GPU and CPU, respectively. Moreover, we show that the work-partitioning mechanism offered by the skeleton framework, which splits the computation across CPU and GPU, may improve even further the performance of the applications in up to 18%.","","978-1-5386-3250-5","10.1109/HPCS.2017.110","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8035149","stencil;skeleton frameworks;source-to-source compilation;CUDA;OpenACC","Graphics processing units;Skeleton;Programming;Jacobian matrices;Optimization;Computer architecture;Runtime","graphics processing units;parallel programming;program compilers;software performance evaluation","OpenACC programming model;accelerator devices;abstract accelerator model;OpenACC extensions;stencil applications;parallel skeleton frameworks;stencil extensions;efficient stencil code generation;least common denominator;general-purpose approach;optimization;code execution;performance improvement;work-partitioning","","4","","27","","14 Sep 2017","","","IEEE","IEEE Conferences"
"Processing of synthetic Aperture Radar data with GPGPU","C. Clemente; M. di Bisceglie; M. Di Santo; N. Ranaldo; M. Spinelli","Università degli Studi del Sannio, Piazza Roma 21, 82100 Benevento, Italy; Università degli Studi del Sannio, Piazza Roma 21, 82100 Benevento, Italy; Università degli Studi del Sannio, Piazza Roma 21, 82100 Benevento, Italy; Università degli Studi del Sannio, Piazza Roma 21, 82100 Benevento, Italy; Università degli Studi del Sannio, Piazza Roma 21, 82100 Benevento, Italy","2009 IEEE Workshop on Signal Processing Systems","17 Nov 2009","2009","","","309","314","Synthetic aperture radar processing is a complex task that involves advanced signal processing techniques and intense computational effort. While the first issue has now reached a mature stage, the question of how to produce accurately focused images in real-time, without mainframe facilities, is still under debate. The recent introduction of general-purpose graphic processing units seems to be quite promising in this view, especially for the decreased per-core cost barrier and for the affordable programming complexity. The authors explain, in this work, the main computational features of a range-Doppler Synthetic Aperture Radar (SAR) processor, trying to disclose the degree of parallelism in the operations at the light of the CUDA programming model. Given the extremely flexible structure of the Single Instruction Multiple Threads (SIMT) model, the authors show that the optimization of a SAR processing unit cannot reduce to an FFT optimization, although this is a quite extensively used kernel. Actually, it is noticeable that the most significant advantage is obtained in the range cell migration correction kernel where a complex interpolation stage is performed very efficiently exploiting the SIMT model. Performance show that, using a single Nvidia Tesla-C1060 GPU board, the obtained processing time is more than fifteen time better than our test workstation.","2162-3570","978-1-4244-4335-2","10.1109/SIPS.2009.5336272","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5336272","Synthetic Aperture Radar;parallel processing;GPU;CUDA","Synthetic aperture radar;Kernel;Radar signal processing;Focusing;Graphics;Costs;Concurrent computing;Parallel processing;Parallel programming;Flexible structures","computer graphic equipment;Doppler radar;interpolation;synthetic aperture radar","synthetic aperture radar;GPGPU;general-purpose graphic processing unit;range-Doppler SAR;single instruction multiple thread model","","15","1","13","","17 Nov 2009","","","IEEE","IEEE Conferences"
"Accelerated solution of stiffness matrix for isoparametric elements based on CUDA","H. Binxing; L. Xinguo; Q. Hao; L. Zenghao","Shaanxi Aerospace Flight Vehicle Design Key Laboratory, Northwestern Polytechnical University, Xi'an, PR China; Shaanxi Aerospace Flight Vehicle Design Key Laboratory, Northwestern Polytechnical University, Xi'an, PR China; Shaanxi Aerospace Flight Vehicle Design Key Laboratory, Northwestern Polytechnical University, Xi'an, PR China; School of Astronautics, Northwestern Polytechnical University, Xi'an, PR China","2017 IEEE International Conference on Signal Processing, Communications and Computing (ICSPCC)","1 Jan 2018","2017","","","1","4","High precision results in structural with the shortest time consumption are expected when methods are introduced to solve FEM(Finite element method). Solving of stiffness matrix assembled by isoparametric elements and solving the assembled stiffness matrix are the most time-consuming. In the previous serial algorithms, there is always a time limitation for some applications and it is hard to achieve. However, break-through in programming and feasibility of general-purpose applications executed on GPU (Graph Processing Unit), such as the parallel computing platform and programming model CUDA (Compute Unified Device Architecture) released by NVIDIA corporation, make it possible for some large scale FEM explicit dynamic simulation in real time. Authors present an approach to accelerate calculation in element stiffness matrices, taking the three-dimensional hexahedral isoparametric element in different scale as an example. A speedup of about 15 times is achieved with respect to parallel algorithms using boost on CPU. The results show that the parallel algorithm based on CUDA can satisfy the fast simulation of finite element model of structural problems with certain computational scale.","","978-1-5386-3142-3","10.1109/ICSPCC.2017.8242497","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8242497","FEM;CUDA;Conjugate gradient;Parallel Computing;GPU acceleration","Finite element analysis;Computers;Graphics processing units;Indexes;Shape;Hardware","finite element analysis;graphics processing units;mathematics computing;matrix algebra;parallel algorithms;parallel architectures","general-purpose applications;finite element method;graph processing unit;large scale FEM explicit dynamic simulation;assembled stiffness matrix;shortest time consumption;isoparametric elements;accelerated solution;finite element model;CUDA;parallel algorithm;three-dimensional hexahedral isoparametric element;element stiffness matrices;Compute Unified Device Architecture;parallel computing platform","","2","","7","","1 Jan 2018","","","IEEE","IEEE Conferences"
"HeTM: Transactional Memory for Heterogeneous Systems","D. Castro; P. Romano; A. Ilic; A. M. Khan","Universidade de Lisboa, Portugal; Universidade de Lisboa, Portugal; Universidade de Lisboa, Portugal; UiT The Arctic University of Norway, Norway","2019 28th International Conference on Parallel Architectures and Compilation Techniques (PACT)","7 Nov 2019","2019","","","232","244","Modern heterogeneous computing architectures, which couple multi-core CPUs with discrete many-core GPUs (or other specialized hardware accelerators), enable unprecedented peak performance and energy efficiency levels. However, developing applications that can take full advantage of the potential of heterogeneous systems is a notoriously hard task. This work takes a step towards reducing the complexity of programming heterogeneous systems by introducing the abstraction of Heterogeneous Transactional Memory (HeTM). HeTM provides programmers with the illusion of a single memory region, shared among the CPUs and the (discrete) GPU(s) of a heterogeneous system, with support for atomic transactions. Besides introducing the abstract semantics and programming model of HeTM, we present the design and evaluation of a concrete implementation of the proposed abstraction, referred herein as Speculative HeTM (SHeTM). SHeTM makes use of a novel design that leverages speculative techniques, which aims at hiding the inherently large communication latency between CPUs and discrete GPUs and at minimizing inter-device synchronization overhead. We demonstrate the efficiency of the SHeTM via an extensive quantitative study based both on synthetic benchmarks and on a popular object caching system.","2641-7936","978-1-7281-3613-4","10.1109/PACT.2019.00026","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8891063","transaction;memory;CPU;GPU;heterogeneous;computing;system","Synchronization;Graphics processing units;Programming;Performance evaluation;Computer architecture;Task analysis","cache storage;graphics processing units;multiprocessing systems;parallel programming;power aware computing","Heterogeneous Transactional Memory;single memory region;Speculative HeTM;modern heterogeneous computing architectures;couple multicore CPUs;many-core GPUs;energy efficiency levels;heterogeneous systems programming;object caching system;SHeTM","","","","59","","7 Nov 2019","","","IEEE","IEEE Conferences"
"A Comparison of Performance Tunabilities between OpenCL and OpenACC","M. Sugawara; S. Hirasawa; K. Komatsu; H. Takizawa; H. Kobayashi","Tohoku Univ., Sendai, Japan; Tohoku Univ., Sendai, Japan; Tohoku Univ., Sendai, Japan; Tohoku Univ., Sendai, Japan; Tohoku Univ., Sendai, Japan","2013 IEEE 7th International Symposium on Embedded Multicore Socs","11 Nov 2013","2013","","","147","152","To design and develop any auto tuning mechanisms for OpenACC, it is important to clarify the differences between conventional GPU programming models and OpenACC in terms of available programming and tuning techniques, called performance tunabilities. This paper hence discusses the performance tunabilities of OpenACC and OpenCL. As OpenACC cannot synchronize threads running on GPUs, some important techniques are not available to OpenACC. Therefore, we also design an additional compiler directive for thread synchronization. Evaluation results show that both OpenCL and OpenACC need architecture-aware optimizations, and similar approaches to performance optimization are effective for both OpenCL and OpenACC. The additional directive can allow OpenACC to describe more tuning techniques in the same approach as OpenCL. As it is obvious that OpenACC is more productive than OpenCL especially for legacy application migration, OpenACC is a very promising programming model if it can achieve the same performance as the conventional GPU programming models such as CUDA and OpenCL.","","978-0-7695-5086-2","10.1109/MCSoC.2013.31","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6657921","Autotuning;OpenCL;OpenACC","Instruction sets;Kernel;Graphics processing units;Optimization;Programming;Synchronization;Data transfer","graphics processing units;parallel architectures;software maintenance","performance tunabilities;OpenCL;OpenACC;auto tuning mechanisms;GPU programming models;compiler directive;thread synchronization;architecture-aware optimizations;performance optimization;legacy application migration;CUDA","","8","","15","","11 Nov 2013","","","IEEE","IEEE Conferences"
"Exploring Programming Multi-GPUs Using OpenMP and OpenACC-Based Hybrid Model","R. Xu; S. Chandrasekaran; B. Chapman","Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA; Dept. of Comput. Sci., Univ. of Houston, Houston, TX, USA","2013 IEEE International Symposium on Parallel & Distributed Processing, Workshops and Phd Forum","31 Oct 2013","2013","","","1169","1176","Heterogeneous computing come with tremendous potential and is a leading candidate for scientific applications that are becoming more and more complex. Accelerators such as GPUs whose computing momentum is growing faster than ever offer application performance when compute intensive portions of an application are offloaded to them. It is quite evident that future computing architectures are moving towards hybrid systems consisting of multi-GPUs and multi-core CPUs. A variety of high-level languages and software tools can simplify programming these systems. Directive-based programming models are being embraced since they not only ease programming complex systems but also abstract low-level details from the programmer. We already know that OpenMP has been making programming CPUs easy and portable. Similarly, a directive-based programming model for accelerators is OpenACC that is gaining popularity since the directives play an important role in developing portable software for GPUs. A combination of OpenMP and OpenACC, a hybrid model, is a plausible solution to port scientific applications to heterogeneous architectures especially when there is more than one GPU on a single node to port an application to. However OpenACC meant for accelerators is yet to provide support for multi-GPUs. But using OpenMP we could conveniently exploit features such as for and section to distribute compute intensive kernels to more than one GPU. We demonstrate the effectiveness of this hybrid approach with some case studies in this paper.","","978-0-7695-4979-8","10.1109/IPDPSW.2013.263","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6651003","GPUs;OpenACC;OpenMP","Graphics processing units;Kernel;Programming;Computational modeling;Computer architecture;Instruction sets;Data transfer","application program interfaces;graphics processing units;high level languages;multiprocessing systems;parallel programming;software tools","heterogeneous architectures;portable software;directive-based programming models;software tools;high-level languages;multicore CPU;heterogeneous computing;OpenMP;OpenACC-based hybrid model;multi-GPU","","11","","20","","31 Oct 2013","","","IEEE","IEEE Conferences"
"A Comprehensive Performance Comparison of CUDA and OpenCL","J. Fang; A. L. Varbanescu; H. Sips","Parallel & Distrib. Syst. Group, Delft Univ. of Technol., Delft, Netherlands; Parallel & Distrib. Syst. Group, Delft Univ. of Technol., Delft, Netherlands; Parallel & Distrib. Syst. Group, Delft Univ. of Technol., Delft, Netherlands","2011 International Conference on Parallel Processing","17 Oct 2011","2011","","","216","225","This paper presents a comprehensive performance comparison between CUDA and OpenCL. We have selected 16 benchmarks ranging from synthetic applications to real-world ones. We make an extensive analysis of the performance gaps taking into account programming models, ptimization strategies, architectural details, and underlying compilers. Our results show that, for most applications, CUDA performs at most 30% better than OpenCL. We also show that this difference is due to unfair comparisons: in fact, OpenCL can achieve similar performance to CUDA under a fair comparison. Therefore, we define a fair comparison of the two types of applications, providing guidelines for more potential analyses. We also investigate OpenCL's portability by running the benchmarks on other prevailing platforms with minor modifications. Overall, we conclude that OpenCL's portability does not fundamentally affect its performance, and OpenCL can be a good alternative to CUDA.","2332-5690","978-1-4577-1336-1","10.1109/ICPP.2011.45","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6047190","Performance Comparison;CUDA;OpenCL","Graphics processing unit;Benchmark testing;Programming;Performance evaluation;Computational modeling;Kernel","benchmark testing;computer graphic equipment;coprocessors;multiprocessing systems;parallel architectures;parallel programming;parallelising compilers","performance comparison;CUDA;performance gap;programming model;optimization strategy;architectural detail;compilers;OpenCL portability;NVIDIA GPU","","121","","30","","17 Oct 2011","","","IEEE","IEEE Conferences"
"Hippogriff: Efficiently moving data in heterogeneous computing systems","Y. Liu; H. -W. Tseng; M. Gahagan; J. Li; Y. Jin; S. Swanson","Department of Computer Science and Engineering, University of California, San Diego, La Jolla, U.S.A.; Department of Computer Science and Engineering, University of California, San Diego, La Jolla, U.S.A.; Department of Computer Science and Engineering, University of California, San Diego, La Jolla, U.S.A.; Department of Computer Science and Engineering, University of California, San Diego, La Jolla, U.S.A.; Department of Computer Science and Engineering, University of California, San Diego, La Jolla, U.S.A.; Department of Computer Science and Engineering, University of California, San Diego, La Jolla, U.S.A.","2016 IEEE 34th International Conference on Computer Design (ICCD)","24 Nov 2016","2016","","","376","379","Data movement between the compute and the storage (e.g., GPU and SSD) has been a long-neglected problem in heterogeneous systems, while the inefficiency in existing systems does cause significant loss in both performance and energy efficiency. This paper presents Hippogriff to provide a high-level programming model to simplify data movement between the compute and the storage, and to dynamically schedule data transfers based on system load. By eliminating unnecessary data movement, Hippogriff can speedup single program workloads by 1.17×, and save 17% energy. For multi-program workloads, Hippogriff shows 1.25× speedup. Hippogriff also improves the performance of a GPU-based MapReduce framework by 27%.","","978-1-5090-5142-7","10.1109/ICCD.2016.7753307","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7753307","","Nonvolatile memory;Graphics processing units;Data transfer;Runtime;Discrete wavelet transforms;Peer-to-peer computing;Benchmark testing","data handling;graphics processing units;parallel processing;storage management","Hippogriff;heterogeneous computing systems;data movement;data storage;high-level programming;GPU-based MapReduce","","8","","17","","24 Nov 2016","","","IEEE","IEEE Conferences"
"Performance Analysis of a Quantum Monte Carlo Application on Multiple Hardware Architectures Using the HPX Runtime","W. Wei; A. Chatterjee; K. Huck; O. Hernandez; H. Kaiser",Louisiana State University; Oak Ridge National Laboratory; University of Oregon; Oak Ridge National Laboratory; Louisiana State University,"2020 IEEE/ACM 11th Workshop on Latest Advances in Scalable Algorithms for Large-Scale Systems (ScalA)","31 Dec 2020","2020","","","77","84","This paper describes how we successfully used the HPX programming model to port the DCA++ application on multiple architectures that include POWER9, x86, ARM v8, and NVIDIA GPUs. We describe the lessons we can learn from this experience as well as the benefits of enabling the HPX in the application to improve the CPU threading part of the code, which led to an overall 21% improvement across architectures. We also describe how we used HPX-APEX to raise the level of abstraction to understand performance issues and to identify tasking optimization opportunities in the code, and how these relate to CPU/GPU utilization counters, device memory allocation over time, and CPU kernel level context switches on a given architecture.","","978-1-6654-2270-3","10.1109/ScalA51936.2020.00015","U.S. Department of Energy; Office of Science; Advanced Scientific Computing Research; Basic Energy Sciences; Office of Science; U.S. Department of Energy; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9308704","Quantum Monte Carlo (QMC);Dynamical Cluster Approximation (DCA);Autonomic Performance Environment for eXascale (APEX);HPX runtime system","Instruction sets;C++ languages;Runtime;Task analysis;Computer architecture;Libraries;Standards","graphics processing units;Monte Carlo methods;multi-threading;parallel architectures;quantum computing;software performance evaluation","x86;POWER9;tasking optimization;CPU threading part;NVIDIA GPUs;ARM v8;DCA++ application;HPX programming model;HPX runtime;hardware architectures;quantum Monte Carlo application;performance analysis;CPU kernel level context;HPX-APEX","","","","33","","31 Dec 2020","","","IEEE","IEEE Conferences"
"Optimal Bidding Strategies for Thermal and Generic Programming Units in the Day-Ahead Electricity Market","F. -. Heredia; M. J. Rider; C. Corchero","Statistics and Operations Research Department, Universitat Politècnica de Catalunya, Barcelona, Spain; Statistics and Operations Research Department, Universitat Politècnica de Catalunya, Barcelona, Spain; Statistics and Operations Research Department, Universitat Politècnica de Catalunya, Barcelona, Spain","IEEE Transactions on Power Systems","19 Jul 2010","2010","25","3","1504","1518","This study has developed a stochastic programming model that integrates the day-ahead optimal bidding problem with the most recent regulation rules of the Iberian Electricity Market (MIBEL) for bilateral contracts (BC), with a special consideration for the new mechanism to balance the competition of the production market, namely virtual power plant (VPP) auctions. The model allows a price-taking generation company (GenCo) to decide on the unit commitment of the thermal units, the economic dispatch of the BCs between the thermal units and the generic programming unit (GPU), and the optimal sale/purchase bids for all units (thermal and generic), by observing the MIBEL regulation. The uncertainty of the spot prices has been represented through scenario sets built from the most recent real data using scenario reduction techniques. The model has been solved using real data from a Spanish generation company and spot prices, and the results have been reported and analyzed.","1558-0679","","10.1109/TPWRS.2009.2038269","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5409525","Bilateral contracts;electricity spot market;optimal bidding strategies;short-term electricity generation planning;stochastic programming;virtual power plant auctions","Electricity supply industry;Power generation;Costs;Marketing and sales;Procurement;Stochastic processes;Contracts;Production;Power system economics;Power generation economics","power markets;pricing;stochastic programming","optimal bidding strategies;generic programming units;thermal programming units;day-ahead electricity market;stochastic programming model;Iberian Electricity Market;bilateral contracts;virtual power plant auctions;production market;price-taking generation company;optimal sale-purchase bids;Spanish generation company;spot prices;scenario reduction techniques","","42","","30","IEEE","8 Feb 2010","","","IEEE","IEEE Journals"
"Parallelizing Back Propagation Neural Network on Speculative Multicores","Y. Wang; H. An; Z. Liu; T. Liu; D. Zhao","Dept. of Comput. Sci. & Technol., Southwest Univ. of Sci. & Technol., Mianyang, China; Dept. of Comput. Sci. & Technol., Univ. of Sci. & Technol. of China, Hefei, China; Dept. of Comput. Sci. & Technol., Southwest Univ. of Sci. & Technol., Mianyang, China; Dept. of Comput. Sci. & Technol., Southwest Univ. of Sci. & Technol., Mianyang, China; Dept. of Comput. Sci. & Technol., Southwest Univ. of Sci. & Technol., Mianyang, China","2016 IEEE 22nd International Conference on Parallel and Distributed Systems (ICPADS)","19 Jan 2017","2016","","","902","907","Applications typically exhibit extremely different performance characteristics depending on the accelerator. Back propagation neural network (BPNN) has been parallelized into different platforms. However, it has not yet been explored on speculative multicore architecture thoroughly. This paper presents a study of parallelizing BPNN on a speculative multicore architecture, including its speculative execution model, hardware design and programming model. The implementation was analyzed with seven well-known benchmark data sets. Furthermore, it trades off several important design factors in coming speculative multicore architecture. The experimental results show that: (1) the BPNN performs well on speculative multicore platform. It can achieve similar speedup (17.7x to 57.4x) compared with graphics processors (GPU) while provides a more friendly programmability. (2) 64 cores' computing resources can be used efficiently and 4k is the proper speculative buffer capacity in the model.","1521-9097","978-1-5090-4457-3","10.1109/ICPADS.2016.0121","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7823836","thread level speculation;parallel programming;back propagation;multicore","Multicore processing;Instruction sets;Graphics processing units;Programming;Neural networks;Hardware","backpropagation;multiprocessing systems;neural nets","backpropagation neural network;multicore architecture;speculative execution model;hardware design;programming model;speculative multicore platform;parallelized BPNN","","","","27","","19 Jan 2017","","","IEEE","IEEE Conferences"
"Task Mapping and Scheduling for OpenVX Applications on Heterogeneous Multi/Many-Core Architectures","F. Lumpp; S. Aldegheri; H. D. Patel; N. Bombieri","Department of Computer Science, University of Verona, Verona, Italy; Department of Computer Science, University of Verona, Verona, Italy; Department of Electrical and Computer Engineering, University of Waterloo, Waterloo, ON, Canada; Department of Computer Science, University of Verona, Verona, Italy","IEEE Transactions on Computers","8 Jul 2021","2021","70","8","1148","1159","Computer vision applications have stringent performance constraints that must be satisfied when they are run at the edge on programmable low-power embedded devices. OpenVX has emerged as the de-facto reference standard to develop such applications. OpenVX uses a primitive-based programming model that results in a directed-acyclic graph (DAG) representation of the application, which can then be used for automatic system-level optimizations and synthesis to heterogeneous multi- and many-core platforms. Although OpenVX has been standardized, its state-of-the-art algorithm for task mapping and scheduling does not deliver the performance necessary for such applications to be deployed on heterogeneous multi-/many-core platforms. This article focuses on addressing this challenge with three main contributions: First, we implemented a static task scheduling and mapping approach for OpenVX using the heterogeneous earliest finish time (HEFT) heuristic. We show that HEFT allows us to improve the system performance up to 70 percent on one of the most widespread smart systems for applying computer vision and intelligent video analytics in general at the edge (i.e., NVIDIA VisionWorks on NVIDIA Jetson TX2). Second, we show that HEFT, in the context of a vision application for edge computing where some primitives may have multiple implementations (e.g., for CPU and GPU), can lead to load imbalance amongst heterogeneous computing elements (CEs), thus suffering from degraded performance. Third, we present an algorithm called exclusive earliest finish time (XEFT) that introduces the notion of exclusive overlap between single implementation primitives to improve the load balancing. We show that XEFT can further improve the system performance up to 33 percent over HEFT, and 82 percent over the native OpenVX scheduler. We present the results on a large set of benchmarks, including a real-world localization and mapping application (ORB-SLAM) combined with an NVIDIA inference application based on convolutional neural networks (CNNs) for object detection.","1557-9956","","10.1109/TC.2021.3059528","Italian Ministry of Education, Univ. and Research; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9354946","Embedded vision applications;static mapping and scheduling;OpenVX;heterogeneous architectures","Task analysis;Computer architecture;Computer vision;Graphics processing units;Optimization;System performance;Kernel","computer vision;convolutional neural nets;directed graphs;embedded systems;low-power electronics;metaheuristics;multiprocessing systems;object detection;parallel architectures;processor scheduling;SLAM (robots);video signal processing","automatic system-level optimizations;static task scheduling;heterogeneous earliest finish time heuristic;NVIDIA Jetson TX2;computer vision;edge computing;heterogeneous computing elements;exclusive earliest finish time;native OpenVX scheduler;primitive-based programming model;directed-acyclic graph representation;HEFT heuristic;programmable low-power embedded devices;XEFT;real-world localization and mapping application;ORB-SLAM;convolutional neural networks;CNN;object detection;NVIDIA VisionWorks;DAG representation;heterogeneous multicore architecture;heterogeneous many-core architecture;intelligent video analytics","","","","30","IEEE","16 Feb 2021","","","IEEE","IEEE Journals"
"Enhancing Performance of Computer Vision Applications on Low-Power Embedded Systems Through Heterogeneous Parallel Programming","S. Aldegheri; S. Manzato; N. Bombieri","Department of Computer Science, University of Verona; Department of Computer Science, University of Verona; Department of Computer Science, University of Verona","2018 IFIP/IEEE International Conference on Very Large Scale Integration (VLSI-SoC)","21 Feb 2019","2018","","","119","124","Enabling computer vision applications on low-power embedded systems gives rise to new challenges for embedded SW developers. Such applications implement different functionalities, like image recognition based on deep learning, simultaneous localization and mapping tasks. They are characterized by stringent performance constraints to guarantee real-time behaviors and, at the same time, energy constraints to save battery on the mobile platform. Even though heterogeneous embedded boards are getting pervasive for their high computational power at low power costs, they need a time consuming customization of the whole application (i.e., mapping of application blocks to CPU-GPU processing elements and their synchronization) to efficiently exploit their potentiality. Different languages and environments have been proposed for such an embedded SW customization. Nevertheless, they often find limitations on complex real cases, as their application is mutual exclusive. This paper presents a comprehensive framework that relies on a heterogeneous parallel programming model, which combines OpenMP, PThreads, OpenVX, OpenCV, and CUDA to best exploit different levels of parallelism while guaranteeing a semi-automatic customization. The paper shows how such languages and API platforms have been interfaced, synchronized, and applied to customize an ORB-SLAM application for an NVIDIA Jetson TX2 board.","2324-8440","978-1-5386-4756-1","10.1109/VLSI-SoC.2018.8644937","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8644937","","Graphics processing units;Computer vision;Kernel;Task analysis;Computational modeling;Power demand;Libraries","application program interfaces;computer vision;coprocessors;embedded systems;graphics processing units;hardware-software codesign;image recognition;microprocessor chips;multiprocessing systems;parallel architectures;parallel programming;SLAM (robots)","low-power embedded systems;embedded SW developers;real-time behaviors;heterogeneous embedded boards;high computational power;low power costs;application blocks;embedded SW customization;heterogeneous parallel programming model;ORB-SLAM application;computer vision applications;performance constraints;OpenMP;PThreads;OpenVX;OpenCV;CUDA","","3","","12","","21 Feb 2019","","","IEEE","IEEE Conferences"
"GasCL: A vertex-centric graph model for GPUs","S. Che","Advanced Micro Devices, USA","2014 IEEE High Performance Extreme Computing Conference (HPEC)","12 Feb 2015","2014","","","1","6","There are increasing research efforts of using GPUs for graph processing. Most prior work on accelerating GPGPU graph algorithms has been focused on algorithm and device-specific optimizations. There is little research on studying high-level programming models and associate run-time systems for graph processing on GPUs, which will be useful to solve diverse real-world problems flexibly. This paper presents a preliminary implementation of a graph framework, GasCL, supporting the well-known “think-like-a-vertex” programming model. The system is built on top of OpenCL and portable across diverse accelerators. We describe our design and use two applications as case studies. The initial performance result shows an average of 2.5× speedup on a GPU compared with a CPU.","","978-1-4799-6233-4","10.1109/HPEC.2014.7040962","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7040962","","Graphics processing units;Kernel;Arrays;Runtime;Computational modeling;Programming","graph theory;graphics processing units;optimisation;parallel programming","GasCL;vertex-centric graph model;graph processing;GPGPU graph algorithms;device-specific optimizations;graph framework;think-like-a-vertex programming model;OpenCL;gather-apply-scatter;general purpose graphics processing unit","","15","","25","","12 Feb 2015","","","IEEE","IEEE Conferences"
"Performance portability of a fluidized bed solver","V. M. Krushnarao Kotteda; V. Kumar; W. Spotz; D. Sunderland","Mechanical Engineering, University of Texas at El Paso, El Paso, USA; Mechanical Engineering, University of Texas at El Paso, El Paso, USA; Multiphysics Applications, Sandia National Laboratories, Albuquerque, USA; Scalable Algorithms, Sandia National Laboratories, Albuquerque, USA","2018 IEEE High Performance extreme Computing Conference (HPEC)","29 Nov 2018","2018","","","1","7","Performance portability is a challenge for application developers as the source code needs to be executed and performant on various hybrid computing architectures. The linear iterative solvers implemented in most applications consume more than 70% of the runtime. This paper presents the results of a linear solver in Trilinos for fluidized bed applications. The linear solver implemented in our code is based on the Kokkos programming model in Trilinos, which uses a library approach to provide performance portability across diverse devices with different memory models. For large scale problems, the numerical experiments on Xeon Phi and Kepler GPU architectures show good performance over the results on Xeon (Haswell) computing architectures.","2377-6943","978-1-5386-5989-2","10.1109/HPEC.2018.8547775","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8547775","performance;portability;fluidized bed;Kokkos;Trilinos;MFiX","Mathematical model;Programming;Graphics processing units;Computational modeling;Computer architecture;Message systems;Libraries","fluidised beds;graphics processing units;iterative methods;mathematics computing;multiprocessing systems;parallel architectures","Kokkos programming model;linear iterative solver;source code;application developers;fluidized bed solver;Xeon computing architectures;performance portability;fluidized bed applications;hybrid computing architectures","","","","31","","29 Nov 2018","","","IEEE","IEEE Conferences"
"STOIC: Serverless Teleoperable Hybrid Cloud for Machine Learning Applications on Edge Device","M. Zhang; C. Krintz; R. Wolski","University of California,Dept. of Computer Science,Santa Barbara; University of California,Dept. of Computer Science,Santa Barbara; University of California,Dept. of Computer Science,Santa Barbara","2020 IEEE International Conference on Pervasive Computing and Communications Workshops (PerCom Workshops)","4 Aug 2020","2020","","","1","6","Serverless computing is a promising new event-driven programming model that was designed by cloud vendors to expedite the development and deployment of scalable web services on cloud computing systems. Using the model, developers write applications that consist of simple, independent, stateless functions that the cloud invokes on-demand (i.e. elastically), in response to system-wide events (data arrival, messages, web requests, etc.). In this work, we present STOIC (Serverless TeleOperable HybrId Cloud), an application scheduling and deployment system that extends the serverless model in two ways. First, it uses the model in a distributed setting and schedules application functions across multiple cloud systems. Second, STOIC supports serverless function execution using hardware acceleration (e.g. GPU resources) when available from the underlying cloud system. We overview the design and implementation of STOIC and empirically evaluate it using real-world machine learning applications and multi-tier (e.g. edge-cloud) deployments. We find that STOIC's combined use of edge and cloud resources is able to outperform using either cloud in isolation for the applications and datasets that we consider.","","978-1-7281-4716-1","10.1109/PerComWorkshops48775.2020.9156239","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9156239","Serverless computing;Edge computing;Image Processing;Internet of Things","Cloud computing;Image edge detection;Runtime;Machine learning;Task analysis;Computer architecture;Graphics processing units","cloud computing;Internet;learning (artificial intelligence);Web services","edge-cloud;STOIC;Serverless teleoperable hybrid Cloud;Serverless computing;event-driven programming model;cloud vendors;scalable web services;cloud computing systems;simple functions;independent functions;stateless functions;system-wide events;Serverless TeleOperable HybrId Cloud;application scheduling;deployment system;serverless model;distributed setting;schedules application functions;multiple cloud systems;serverless function execution;underlying cloud system;real-world machine learning applications","","1","","36","","4 Aug 2020","","","IEEE","IEEE Conferences"
================================================
FILE: notebooks/data/ieee_5.csv
================================================
"Document Title",Authors,"Author Affiliations","Publication Title",Date Added To Xplore,"Publication Year","Volume","Issue","Start Page","End Page","Abstract","ISSN",ISBNs,"DOI",Funding Information,PDF Link,"Author Keywords","IEEE Terms","INSPEC Controlled Terms","INSPEC Non-Controlled Terms","Mesh_Terms",Article Citation Count,Patent Citation Count,"Reference Count","License",Online Date,Issue Date,"Meeting Date","Publisher",Document Identifier
"CUDA accelerated iris template matching on Graphics Processing Units (GPUs)","N. A. Vandal; M. Savvides","Robotics Institute, Carnegie Mellon University, Pittsburgh, PA 15232, USA; Department of Electrical and Computer Engineering, Carnegie Mellon University","2010 Fourth IEEE International Conference on Biometrics: Theory, Applications and Systems (BTAS)","11 Nov 2010","2010","","","1","7","In this paper we develop a parallelized iris template matching implementation on inexpensive Graphics Processing Units (GPUs) with Nvidia's CUDA programming model to achieve matching rates of 44 million iris template comparisons per second without rotation invariance. With tolerance to head tilt, we achieve 4.2 million matches per second and compare our implementation to state of the art prior work performed on GPU and FPGA, emphasizing our improvements. Additionally a comparison to highly optimized CPU implementations of iris template matching is performed, showing a 14X speedup using our approach. In contrast to other published work, we develop an implementation for parallel iris template matching that incorporates iris code shifting for rotation invariance and provide timing data showing our proposed architecture is efficiently implemented, capitalizing on shared and texture memory to speedup the bit shifting process beyond current prior art.","","978-1-4244-7582-7","10.1109/BTAS.2010.5634505","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5634505","","Iris recognition;Instruction sets;Probes;Graphics processing unit;Field programmable gate arrays;Hamming distance;Hardware","computer graphic equipment;coprocessors;field programmable gate arrays;image matching;iris recognition","iris template matching;graphics processing units;Nvidia CUDA programming model;field programmable gate array;bit shifting process","","12","1","20","","11 Nov 2010","","","IEEE","IEEE Conferences"
"GPGPU-Based ATPG System: Myth or Reality?","L. Lai; K. -H. Tsai; H. Li","Department of Electrical Engineering, Shantou University, Shantou, China; Silicon Test Division, Mentor Graphics Corporation, Wilsonville, OR, USA; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China","IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems","23 Dec 2019","2020","39","1","239","247","General-purpose computing on graphics processing units (GPGPUs) is a programming model that uses graphics cards to perform computations traditionally done by CPU. It began to become practical with the advent of programmable shaders and floating-point support on GPU in around 2001. The spread of GPGPU has been accelerated with introduction of CUDA from NVIDIA in 2006 and later OpenCL in 2009. Nowadays GPGPU is widely deployed in various applications, such as data mining, artificial intelligence, and many scientific computations. GPGPU seemingly promises immense parallelism with massive concurrent cores, and thus much shorter run times. This is true for algorithms that bear intrinsic data and task parallelism, such as image and video processing. For an ATPG system where some algorithms are sequential in nature, the speedup is not easy to achieve in the real world. Flaws in setting up speedup evaluation can lead to false promises. Will GPGPU-based ATPG system become a reality? Or it is just a myth. In this paper, we try to provide an answer by surveying state-of-the-art works and by analyzing practical aspects of today's industrial designs.","1937-4151","","10.1109/TCAD.2018.2884992","Shantou University(grant numbers:140-760163); Yangfang Career Award of Guangdong Province, China(grant numbers:140-14600602); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8558526","ATPG;fault simulation;general-purpose computing on graphics processing units (GPGPUs)","Graphics processing units;Memory management;Instruction sets;Integrated circuit modeling;Circuit faults;Test pattern generators;Kernel","automatic test pattern generation;general purpose computers;graphics processing units;parallel architectures","OpenCL;CUDA;task parallelism;floating-point support;programmable shaders;programming model;general-purpose computing;GPGPU-based ATPG system","","1","","42","IEEE","4 Dec 2018","","","IEEE","IEEE Journals"
"Flacc: Towards OpenACC support for Fortran in the LLVM Ecosystem","V. Clement; J. S. Vetter","Oak Ridge National Laboratory,Programming Systems Group; Oak Ridge National Laboratory,Advanced Computing Systems Research Section","2021 IEEE/ACM 7th Workshop on the LLVM Compiler Infrastructure in HPC (LLVM-HPC)","20 Dec 2021","2021","","","12","19","OpenACC is a directive-based programming model for heterogeneous accelerators initially launched in 2010 to provide a portable solution at a level of abstraction above OpenCL, CUDA, and other lower-level programming models. Various implementations of OpenACC for C, C++, and Fortran exist; however, only one open-source, production implementation of OpenACC for Fortran does exist. Moreover, most contemporary compiler tool chains for heterogeneous computing are based on LLVM. This lack of support poses a serious risk for high-performance computing application developers targeting GPUs and other accelerators, and it limits the ability of the community to experiment with, extend, and contribute to the OpenACC specification and open-source implementation itself. To address this gap, we have designed and begun implementing Flacc: an effort funded by the US Exascale Computing Project to develop production OpenACC compiler support for Fortran based on Flang within the LLVM ecosystem. In this paper, we describe the Flacc goals, initial design and prototype, and challenges that we have encountered so far in our prototyping efforts. Flacc is implemented as a MLIR dialect in the Flang Fortran front end in LLVM. The Flacc front end currently supports OpenACC version 3.1, and the Flacc run time is currently under development and relies on contributions from the Clacc project. Current contributions to Flacc are available in the main ${\color{Green}{\mathbf{LLVM}}\;{\mathbf{repository}}}$.1","","978-1-6654-1134-9","10.1109/LLVMHPC54804.2021.00007","Office of Science; UT-Battelle; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9651310","OpenACC;OpenMP;LLVM;MLIR;multicore;GPU;accelerators;compiler","Codes;Exascale computing;Ecosystems;Semantics;Prototypes;Graphics processing units;Production","","","","","","26","","20 Dec 2021","","","IEEE","IEEE Conferences"
"Performance Portability Evaluation of OpenCL Benchmarks across Intel and NVIDIA Platforms","C. Bertoni; J. Kwack; T. Applencourt; Y. Ghadar; B. Homerding; C. Knight; B. Videau; H. Zheng; V. Morozov; S. Parker","Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439; Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439; Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439; Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439; Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439; Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439; Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439; Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439; Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439; Argonne National Laboratory,Argonne Leadership Computing Facility,Lemont,IL,USA,60439","2020 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)","28 Jul 2020","2020","","","330","339","We evaluate the capabilities of vendor-provided OpenCL implementations for performance portability across multiple computing platforms. The Rodinia benchmark suite is used for this evaluation. We apply the metric defined by Pennycook et al., and we use roofline efficiency from the Roofline performance model as the “performance efficiency” in the metric's definition. We found that the delivered performance portability is similar for several benchmarks, even if the roofline-based performance efficiencies across platforms are very different among the benchmarks. To help distinguish between these instances, we extend the metric by adding the standard deviation of the performance efficiencies for each benchmark. We argue that the standard deviation gives additional insight into performance portability assessment since it adds the performance variability across platforms. Additionally, we discuss the challenges to measure performance portability associated with algorithms and system software. In terms of algorithms, we need to carefully construct the benchmarks and appropriately use the concurrency available on a platform. In terms of system software, we depend on the vendor performance tools to support the desired programming model and runtime to be able to measure the metrics of interest.","","978-1-7281-7445-7","10.1109/IPDPSW50202.2020.00067","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9150432","high performance computing;performance efficiency;performance portability;roofline performance analysis;OpenCL;GPU","Benchmark testing;Computer architecture;Measurement;Computational modeling;Kernel;Programming;Bandwidth","application program interfaces;concurrency control;graphics processing units;parallel processing;software metrics;software performance evaluation","performance portability evaluation;OpenCL benchmarks;Rodinia benchmark suite;roofline efficiency;roofline performance model;performance portability assessment;performance variability;vendor performance tools;NVIDIA platform;Intel platform;OpenCL implementations;concurrency","","3","","26","","28 Jul 2020","","","IEEE","IEEE Conferences"
"Reactive Molecular Dynamics on Massively Parallel Heterogeneous Architectures","S. B. Kylasa; H. M. Aktulga; A. Y. Grama","Department of Electrical and Computer Engineering, Purdue University, West Lafayette, IN; Michigan State University, 428 S. Shaw Lane, Room 3115, East Lansing, MI; Department of Computer Science, Purdue University, West Lafayette, IN","IEEE Transactions on Parallel and Distributed Systems","9 Dec 2016","2017","28","1","202","214","We present a parallel implementation of the ReaxFF force field on massively parallel heterogeneous architectures, called PuReMD-Hybrid. PuReMD, on which this work is based, along with its integration into LAMMPS, is currently used by a large number of research groups worldwide. Accelerating this important community codebase that implements a complex reactive force field poses a number of algorithmic, design, and optimization challenges, as we discuss in detail. In particular, different computational kernels are best suited to different computing substrates-CPUs or GPUs. Scheduling these computations requires complex resource management, as well as minimizing data movement across CPUs and GPUs. Integrating powerful nodes, each with multiple CPUs and GPUs, into clusters and utilizing the immense compute power of these clusters requires significant optimizations for minimizing communication and, potentially, redundant computations. From a programming model perspective, PuReMD-Hybrid relies on MPI across nodes, pthreads across cores, and CUDA on the GPUs to address these challenges. Using a variety of innovative algorithms and optimizations, we demonstrate that our code can achieve over 565-fold speedup compared to a single core implementation on a cluster of 36 state-of-the-art GPUs for complex systems. In terms of application performance, our code enables simulations of over 1.8M atoms in under 0.68 seconds per simulation time step.","1558-2183","","10.1109/TPDS.2016.2548462","National Science Foundation(grant numbers:CCF 1533795); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7444209","Reactive molecular dynamics;parallel GPU implementations;material simulations","Graphics processing units;Force;Kernel;Biological system modeling;Computational modeling;Clustering algorithms;Numerical models","graphics processing units;microprocessor chips;molecular dynamics method;parallel architectures","CUDA;pthreads across cores;MPI across nodes;data movement;complex resource management;GPUs;CPUs;computing substrates;computational kernels;complex reactive force field;LAMMPS;PuReMD-hybrid;ReaxFF force field;massively parallel heterogeneous architectures;reactive molecular dynamics","","10","","45","IEEE","30 Mar 2016","","","IEEE","IEEE Journals"
"Understanding Error Propagation in GPGPU Applications","G. Li; K. Pattabiraman; C. -Y. Cher; P. Bose","Univ. of British Columbia, Vancouver, BC, Canada; Univ. of British Columbia, Vancouver, BC, Canada; T.J. Watson Res. Center, IBM, Yorktown Heights, NY, USA; T.J. Watson Res. Center, IBM, Yorktown Heights, NY, USA","SC '16: Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis","16 Mar 2017","2016","","","240","251","GPUs have emerged as general-purpose accelerators in high-performance computing (HPC) and scientific applications. However, the reliability characteristics of GPU applications have not been investigated in depth. While error propagation has been extensively investigated for non-GPU applications, GPU applications have a very different programming model which can have a significant effect on error propagation in them. We perform an empirical study to understand and characterize error propagation in GPU applications. We build a compilerbased fault-injection tool for GPU applications to track error propagation, and define metrics to characterize propagation in GPU applications. We find GPU applications exhibit significant error propagation for some kinds of errors, but not others, and the behaviour is highly application specific. We observe the GPUCPU interaction boundary naturally limits error propagation in these applications compared to traditional non-GPU applications. We also formulate various guidelines for the design of faulttolerance mechanisms in GPU applications based on our results.","2167-4337","978-1-4673-8815-3","10.1109/SC.2016.20","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7877099","Fault Injection;Error Resilience;GPGPU;CUDA;Error Propagation","Graphics processing units;Kernel;Circuit faults;Hardware;Programming;Computational modeling;Central Processing Unit","graphics processing units;parallel processing;program compilers;software reliability","error propagation;GPGPU;general-purpose accelerators;high-performance computing;HPC;reliability characteristics;compiler-based fault-injection tool","","43","","55","","16 Mar 2017","","","IEEE","IEEE Conferences"
"RAJA: Portable Performance for Large-Scale Scientific Applications","D. A. Beckingsale; J. Burmark; R. Hornung; H. Jones; W. Killian; A. J. Kunen; O. Pearce; P. Robinson; B. S. Ryujin; T. R. Scogland","Lawrence Liveremore National Laboratory, USA; Lawrence Liveremore National Laboratory, USA; Lawrence Liveremore National Laboratory, USA; Lawrence Liveremore National Laboratory, USA; Lawrence Liveremore National Laboratory, USA; Lawrence Liveremore National Laboratory, USA; Lawrence Liveremore National Laboratory, USA; Lawrence Liveremore National Laboratory, USA; Lawrence Liveremore National Laboratory, USA; Lawrence Liveremore National Laboratory, USA","2019 IEEE/ACM International Workshop on Performance, Portability and Productivity in HPC (P3HPC)","2 Jan 2020","2019","","","71","81","Modern high-performance computing systems are diverse, with hardware designs ranging from homogeneous multi- core CPUs to GPU or FPGA accelerated systems. Achieving desir- able application performance often requires choosing a program- ming model best suited to a particular platform. For large codes used daily in production that are under continual development, architecture-specific ports are untenable. Maintainability re- quires single-source application code that is performance portable across a range of architectures and programming models. In this paper we describe RAJA, a portability layer that enables C++ applications to leverage various programming models, and thus architectures, with a single-source codebase. We describe preliminary results using RAJA in three large production codes at Lawrence Livermore National Laboratory, observing 17×, 13× and 12× speedup on GPU-only over CPU- only nodes with single-source application code in each case.","","978-1-7281-6003-0","10.1109/P3HPC49587.2019.00012","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8945721","","C++ languages;Graphics processing units;Programming;Production;Computer architecture;Kernel;Libraries","application program interfaces;field programmable gate arrays;graphics processing units;microprocessor chips;multiprocessing systems;parallel processing;software portability","C++ applications;single-source codebase;RAJA;production codes;high-performance computing systems;hardware designs;programming model;architecture-specific ports;homogeneous multicore CPU;Lawrence Livermore National Laboratory","","21","","23","","2 Jan 2020","","","IEEE","IEEE Conferences"
"Directive-based Programming for GPUs: A Comparative Study","R. Reyes; I. López; J. J. Fumero; F. de Sande","Dept. de EIO y Comput., Univ. de La Laguna, La Laguna, Spain; Dept. de EIO y Comput., Univ. de La Laguna, La Laguna, Spain; Dept. de EIO y Comput., Univ. de La Laguna, La Laguna, Spain; Dept. de EIO y Comput., Univ. de La Laguna, La Laguna, Spain","2012 IEEE 14th International Conference on High Performance Computing and Communication & 2012 IEEE 9th International Conference on Embedded Software and Systems","18 Oct 2012","2012","","","410","417","GPUs and other accelerators are available on many different devices, while GPGPU has been massively adopted by the HPC research community. Although a plethora of libraries and applications providing GPU support are available, the need of implementing new algorithms from scratch, or adapting sequential programs to accelerators, will always exist. Writing CUDA or OpenCL codes, although an easier task than using their predecessors, is not trivial. Obtaining performance is even harder, as it requires deep understanding of the underlying architecture. Some efforts have been directed toward the automatic code generation for GPU devices, with different results. In particular, several directive-oriented programming models, taking advantage of the OpenMP success, have been created. Although future OpenMP releases will integrate accelerators into the standard, tools are needed in the meantime. In this work, we present a comparison between three directive-based programming models: hiCUDA, PGI Accelerator and OpenACC, using for the last our novel accULL implementation. With this comparison, we aim to showcase the evolution of the directive-based programming models and how users can guide tools toward better performance results.","","978-1-4673-2164-8","10.1109/HPCC.2012.62","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6332201","OpenACC;PGI;Accelerators;GPGPU;CUDA;OpenCL;OpenMP;compiler;productivity","Graphics processing unit;Kernel;Programming;Standards;Runtime;Performance evaluation","graphics processing units;multiprocessing systems;parallel architectures;program compilers","directive-based programming model;GPGPU;HPC;scratch;automatic code generation;OpenMP;hiCUDA;PGI accelerator;OpenACC;accULL","","13","1","14","","18 Oct 2012","","","IEEE","IEEE Conferences"
"Liszt: A domain specific language for building portable mesh-based PDE solvers","Z. DeVito; N. Joubert; F. Palacios; S. Oakley; M. Medina; M. Barrientos; E. Elsen; F. Ham; A. Aiken; K. Duraisamy; E. Darve; J. Alonso; P. Hanrahan","Department of Computer Science, Stanford University; Department of Computer Science, Stanford University; Department of Aeronautics and Astronautics, Stanford University; Institute for Computational and Mathematical Engineering, Stanford University; Institute for Computational and Mathematical Engineering, Stanford University; Department of Computer Science, Stanford University; Department of Mechanical Engineering, Stanford University; Department of Mechanical Engineering, Stanford University; Department of Computer Science, Stanford University; Department of Aeronautics and Astronautics, Stanford University; Department of Mechanical Engineering, Stanford University; Department of Aeronautics and Astronautics, Stanford University; Department of Computer Science, Stanford University","SC '11: Proceedings of 2011 International Conference for High Performance Computing, Networking, Storage and Analysis","29 Dec 2011","2011","","","1","12","Heterogeneous computers with processors and accelerators are becoming widespread in scientific computing. However, it is difficult to program hybrid architectures and there is no commonly accepted programming model. Ideally, applications should be written in a way that is portable to many platforms, but providing this portability for general programs is a hard problem. By restricting the class of programs considered, we can make this portability feasible. We present Liszt, a domain- specific language for constructing mesh-based PDE solvers. We introduce language statements for interacting with an unstructured mesh, and storing data at its elements. Pro- gram analysis of these statements enables our compiler to expose the parallelism, locality, and synchronization of Liszt programs. Using this analysis, we generate applications for multiple platforms: a cluster, an SMP, and a GPU. This approach allows Liszt applications to perform within 12% of hand-written C++, scale to large clusters, and experience order-of-magnitude speedups on GPUs.","2167-4337","978-1-4503-0771-0","10.1145/2063384.2063396","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6114401","compiler analysis and program transformations;programming and runtime environments for high performance and high throughput computing","Jacobian matrices;Face;Hardware;Computer architecture;Synchronization;Graphics processing unit;Heating","graphics processing units;mathematics computing;mesh generation;partial differential equations;program compilers;program diagnostics;specification languages","domain specific language;portable mesh-based PDE solver;heterogeneous computers;scientific computing;language statements;program analysis;compiler;Liszt programs;cluster;SMP;GPU;C++;partial differential equations","","34","","36","","29 Dec 2011","","","IEEE","IEEE Conferences"
"TC-Release++: An Efficient Timestamp-Based Coherence Protocol for Many-Core Architectures","Y. Yao; W. Chen; T. Mitra; Y. Xiang","School of Computer Science and Technology, Zhejiang University, Hangzhou, P.R. China; School of Computer Science and Technology, Zhejiang University, Hangzhou, P.R. China; School of Computing, National University of Singapore, Singapore; Swinburne Research, Swinburne University of Technology, Hawthorn, Victoria, Australia","IEEE Transactions on Parallel and Distributed Systems","9 Oct 2017","2017","28","11","3313","3327","As we enter the era of many-core, providing the shared memory abstraction through cache coherence has become progressively difficult. The standard directory-based coherence does not scale well with increasing core count. Timestamp-based hardware coherence protocols introduced recently offer an attractive alternative solution. This paper proposes a timestamp-based coherence protocol, called TC-Release++, that efficiently supports cache coherence in large-scale systems. Our approach is inspired by TC-Weak, a recently proposed timestamp-based coherence protocol targeting GPU architectures. We first design TC-Release in an attempt to straightforwardly port TC-Weak to general-purpose many-cores. But re-purposing TC-Weak for general-purpose many-core architectures is challenging due to significant differences both in architecture and the programming model. Indeed the performance of TC-Release turns out to be worse than conventional directory protocols. We overcome the limitations and overheads of TC-Release by exploiting simple hardware support to eliminate frequent memory stalls, and an optimized lifetime prediction mechanism to improve cache performance. The resulting optimized coherence protocol TC-Release++ is highly scalable (storage scales logarithmically with core count) and shows better performance (3.0 percent) and comparable network traffic (within 1.3 percent) relative to the baseline MESI directory protocol. We use Murphi to formally verify that TC-Release++ is error-free and imposes small verification cost.","1558-2183","","10.1109/TPDS.2017.2719679","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7959101","Cache coherence;many-core architecture;timestamp-based system;memory consistency model","Coherence;Protocols;Graphics processing units;Hardware;Memory management;Programming;Electronic mail","cache storage;graphics processing units;multiprocessing systems;protocols;shared memory systems","general-purpose many-cores;re-purposing TC;general-purpose many-core architectures;conventional directory protocols;resulting optimized coherence protocol TC;core count;baseline MESI directory protocol;shared memory abstraction;cache coherence;timestamp-based hardware coherence protocols;GPU architectures;design TC","","2","","43","IEEE","26 Jun 2017","","","IEEE","IEEE Journals"
"Optimal balance between energy and performance in hybrid computing applications","D. LaKomski; Z. Zong; T. Jin; R. Ge","Computer Science Department, Texas State University, USA; Computer Science Department, Texas State University, USA; Ingram School of Engineering, Texas State University, USA; School of Computing, Clemson University, USA","2015 Sixth International Green and Sustainable Computing Conference (IGSC)","28 Jan 2016","2015","","","1","8","The latest top 10 supercomputers are dominated by heterogeneous systems with CPUs and accelerators (GPU or Xeon Phi) tightly coupled together. As the heterogeneity of future high performance computing systems keeps increasing, it becomes paramount to judiciously use CPUs and accelerators to improve performance and/or reduce energy consumption. The widely used programming model today is to offload computation intensive workload to accelerators. Theoretically, the hybrid computing model (i.e. running a subset of calculations concurrently on both CPUs and accelerators) can potentially offer advantages of improved energy efficiency and performance. However, this is not yet a common practice due to the uncertainty of energy/performance benefits as well as the increased programming complexity. In this paper, we conduct a comprehensive study on achieving the balance between energy and performance of hybrid computing applications. We show that performance and energy optimization can be conflicting goals, the sweet spot between performance and energy consumption varies with application characteristics and is highly dependent on specific implementations, that the choice of compiler can not only influence runtime but also energy use, and that the choice of cross platform strategies (e.g. OpenCL) can result in degraded performance and increased energy.","","978-1-5090-0172-9","10.1109/IGCC.2015.7393697","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7393697","energy efficient computing;green programming;hybrid computing;heterogeneous systems;performance optimization","Graphics processing units;Runtime;Programming;Fractals;Energy consumption;Computational modeling;Performance evaluation","energy consumption;graphics processing units;optimisation;parallel machines","optimal balance;hybrid computing application;supercomputers;CPU;accelerator;GPU;Xeon Phi;high performance computing system;energy consumption;energy efficiency;energy optimization;OpenCL","","4","","29","","28 Jan 2016","","","IEEE","IEEE Conferences"
"Towards a robust, real-time face processing system using CUDA-enabled GPUs","B. Sharma; R. Thota; N. Vydyanathan; A. Kale","Siemens Corporate Technology, Bangalore, India; Siemens Corporate Technology, Bangalore, India; Siemens Corporate Technology, Bangalore, India; Siemens Corporate Technology, Bangalore, India","2009 International Conference on High Performance Computing (HiPC)","18 Mar 2010","2009","","","368","377","Processing of human faces finds application in various domains like law enforcement and surveillance, entertainment (interactive video games), information security, smart cards etc. Several of these applications are interactive and require reliable and fast face processing. A generic face processing system may comprise of face detection, recognition, tracking and rendering. In this paper, we develop a GPU accelerated real-time and robust face processing system that does face detection and tracking. Face detection is done by adapting the Viola and Jones algorithm that is based on the Adaboost learning system. For robust tracking of faces across real-life illumination conditions, we leverage the algorithm proposed by Thota and others, that combines the strengths of Adaboost and an image based parametric illumination model. We design and develop optimized parallel implementations of these algorithms on graphics processors using the Compute Unified Device Architecture (CUDA), a C-based programming model from NVIDIA. We evaluate our face processing system using both static image databases as well as using live frames captured from a firewire camera under realistic conditions. Our experimental results indicate that our parallel face detector and tracker achieve much greater detection speeds as compared to existing work, while maintaining accuracy. We also demonstrate that our tracking system is robust to extreme illumination conditions.","1094-7256","978-1-4244-4921-7","10.1109/HIPC.2009.5433189","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5433189","Parallel computing;face detection;face tracking;graphics processors;real-time algorithms","Robustness;Real time systems;Face detection;Lighting;Firewire;Humans;Law enforcement;Surveillance;Games;Information security","C language;computer graphic equipment;computer graphics;coprocessors;face recognition","face processing system;CUDA-enabled GPU;face detection;face tracking;Viola-Jones algorithm;Adaboost learning system;image based parametric illumination model;compute unified device architecture;C-based programming","","30","2","15","","18 Mar 2010","","","IEEE","IEEE Conferences"
"Static WCET Analysis of GPUs with Predictable Warp Scheduling","Y. Huangfu; W. Zhang","Virginia Commonwealth Univ., Richmond, VA, USA; Virginia Commonwealth Univ., Richmond, VA, USA","2017 IEEE 20th International Symposium on Real-Time Distributed Computing (ISORC)","3 Jul 2017","2017","","","101","108","The capability of GPUs to accelerate general-purpose applications that can be parallelized into massive number of threads makes it promising to apply GPUs to real-time applications as well, where high throughput and intensive computation are also needed. However, due to the different architecture and programming model of GPUs, the worst-case execution time (WCET) analysis methods and techniques designed for CPUs cannot be used directly to estimate the WCET of GPUs. In this work, based on the analysis of the architecture and dynamic behavior of GPUs, we propose a WCET timing model and analyzer based on a predictable GPU warp scheduling policy to enable the WCET estimation on GPUs.","2375-5261","978-1-5386-1574-4","10.1109/ISORC.2017.24","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7964876","","Graphics processing units;Instruction sets;Kernel;Analytical models;Computer architecture;Mathematical model;Dynamic scheduling","general purpose computers;graphics processing units;microprocessor chips;parallel processing;program diagnostics;scheduling","GPU;predictable warp scheduling;general purpose applications;static worst-case execution time analysis;static WCET analysis;CPU","","4","","23","","3 Jul 2017","","","IEEE","IEEE Conferences"
"Performance Portability of an SpMV Kernel Across Scientific Computing and Data Science Applications","S. L. Olivier; N. D. Ellingwood; J. Berry; D. M. Dunlavy","Sandia National Laboratories,Albuquerque,NM; Sandia National Laboratories,Albuquerque,NM; Sandia National Laboratories,Albuquerque,NM; Sandia National Laboratories,Albuquerque,NM","2021 IEEE High Performance Extreme Computing Conference (HPEC)","1 Dec 2021","2021","","","1","8","Both the data science and scientific computing communities are embracing GPU acceleration for their most demanding workloads. For scientific computing applications, the massive volume of code and diversity of hardware platforms at supercomputing centers has motivated a strong effort toward performance portability. This property of a program, denoting its ability to perform well on multiple architectures and varied datasets, is heavily dependent on the choice of parallel programming model and which features of the programming model are used. In this paper, we evaluate performance portability in the context of a data science workload in contrast to a scientific computing workload, evaluating the same sparse matrix kernel on both. Among our implementations of the kernel in different performance-portable programming models, we find that many struggle to consistently achieve performance improvements using the GPU compared to simple one-line OpenMP parallelization on high-end multicore CPUs. We show one that does, and its performance approaches and sometimes even matches that of vendor-provided GPU math libraries.","2643-1971","978-1-6654-2369-4","10.1109/HPEC49654.2021.9622869","National Nuclear Security Administration; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9622869","performance portability;SpMV;sparse matrix operations;graph computations","Runtime;Codes;Scientific computing;Multicore processing;Computational modeling;Graphics processing units;Computer architecture","","","","","","27","","1 Dec 2021","","","IEEE","IEEE Conferences"
"Single Kernel Soft Synchronization Technique for Task Arrays on CUDA-enabled GPUs, with Applications","S. Funasaka; K. Nakano; Y. Ito","Dept. of Inf. Eng., Hiroshima Univ., Higashi-Hiroshima, Japan; Dept. of Inf. Eng., Hiroshima Univ., Higashi-Hiroshima, Japan; Dept. of Inf. Eng., Hiroshima Univ., Higashi-Hiroshima, Japan","2017 Fifth International Symposium on Computing and Networking (CANDAR)","26 Apr 2018","2017","","","11","20","A task array is a 2-dimensional array of tasks with dependency relations. Each task uses the resulting values of some tasks in the left columns, and so it can be started only after these left tasks are completed. Conventional CUDA implementations repeatedly perform a separated CUDA kernel call for each column from left to right to synchronize the computation for tasks. However, this conventional CUDA implementation has several drawbacks: a CUDA kernel call has a certain overhead, and the running time of a CUDA kernel is determined by a CUDA block that terminates lastly. Also, every task must write and preserve the resulting values in the global memory with low memory access performance for the following tasks. The main contribution of this paper is to introduce task arrays and to present Single Kernel Soft Synchronization (SKSS) technique that significantly reduces such overheads for task arrays. The SKSS performs only one CUDA kernel call and CUDA blocks assigned to each row of a task array using a global counter. To clarify the potentiality of our SKSS technique, we have implemented the dynamic programming for the 0-1 knapsack problem, the summed area table computation, and the error diffusion of a gray-scale image using our SKSS technique and compared with previously published best GPU implementations. Quite surprisingly, the experimental results using NVIDIA Titan X show that, our SKSS implementations are 1.29-2.11 times faster for the 0-1 knapsack problem, 1.08-1.56 times faster for the summed area table computation, and 1.61-2.11 times faster for the error diffusion.","2379-1896","978-1-5386-2087-8","10.1109/CANDAR.2017.35","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8345405","dynamic programming;knapsack problem;summed area table;error diffusion","Graphics processing units;Task analysis;Kernel;Parallel algorithms;Synchronization;Computer architecture;Dynamic programming","dynamic programming;graphics processing units;operating system kernels;parallel algorithms;parallel architectures;parallel programming;synchronisation","task array;CUDA block;SKSS technique;CUDA-enabled GPUs;Single Kernel Soft Synchronization;CUDA kernel call;dynamic programming;knapsack problem;summed area table computation;error diffusion;parallel computing architecture;Compute Unified Device Architecture;CUDA programming model;parallel algorithms","","12","","16","","26 Apr 2018","","","IEEE","IEEE Conferences"
"Parallelization of Virtual Screening in Drug Discovery on Massively Parallel Architectures","G. D. Guerrero; H. E. Perez-S´nchez; J. M. Cecilia; J. M. Garcia","Dipt. de Ing. y Tecnol. de Comput., Univ. de Murcia, Murcia, Spain; NA; Dipt. de Ing. y Tecnol. de Comput., Univ. de Murcia, Murcia, Spain; Dipt. de Ing. y Tecnol. de Comput., Univ. de Murcia, Murcia, Spain","2012 20th Euromicro International Conference on Parallel, Distributed and Network-based Processing","15 Mar 2012","2012","","","588","595","The current trend in medical research for the discovery of new drugs is the use of Virtual Screening (VS) methods. In these methods, the calculation of the non-bonded interactions, such as electrostatics or van der Waals forces, plays an important role, representing up to 80% of the total execution time. These kernels are computational intensive and massively parallel in nature, and thus they are well suited to be accelerated on parallel architectures. In this work, we discuss the effective parallelization of the non-bonded electrostatic interactions kernel for VS on three different parallel architectures: a shared memory system, a distributed memory system, and a Graphics Processing Units (GPUs). For an efficient handling of the computational intensive and massively parallelism of this kernel, we enable different data policies on those architectures to take advantage of all computational resources offered by them. Four implementations are provided based on MPI, OpenMP, Hybrid MPI Open MP and CUDA programming models. The sequential implementation is defeated by a wide margin by all parallel implementations, obtaining up to 72x speed-up factor on the shared memory system through OpenMP, up to 60x and229x speed-ups factors on the distributed memory system for the MPI implementation and the Hybrid MPI-Open MP implementation respectively, and finally, up to 213x speedup factor for the CUDA implementation on the GPU architecture to offer the best alternative in terms of performance/cost ratio.","2377-5750","978-1-4673-0226-5","10.1109/PDP.2012.26","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6169645","Drug Discovery;Non-bonded interactions;CUDA;OpenMP;MPI;Hybrid OpenMP-MPI;High-Performance Computing","Graphics processing unit;Kernel;Instruction sets;Message systems;Parallel processing;Programming;Computer architecture","application program interfaces;distributed shared memory systems;graphics processing units;medical computing;message passing;parallel architectures","virtual screening parallelization;drug discovery;massively parallel architecture;medical research;virtual screening method;electrostatics;van der Waals force;shared memory system;distributed memory system;graphics processing units;data policy;computational resource;CUDA programming model;message passing interface;compute unified device architecture;sequential implementation;parallel implementation;performance-cost ratio;speedup factor;hybrid MPI openMP","","8","","29","","15 Mar 2012","","","IEEE","IEEE Conferences"
"Scalable Programming Models for Massively Multicore Processors","M. D. McCool","Rapid Mind Inc., Waterloo","Proceedings of the IEEE","15 Apr 2008","2008","96","5","816","831","Including multiple cores on a single chip has become the dominant mechanism for scaling processor performance. Exponential growth in the number of cores on a single processor is expected to lead in a short time to mainstream computers with hundreds of cores. Scalable implementations of parallel algorithms will be necessary in order to achieve improved single-application performance on such processors. In addition, memory access will continue to be an important limiting factor on achieving performance, and heterogeneous systems may make use of cores with varying capabilities and performance characteristics. An appropriate programming model can address scalability and can expose data locality while making it possible to migrate application code between processors with different parallel architectures and variable numbers and kinds of cores. We survey and evaluate a range of multicore processor architectures and programming models with a focus on GPUs and the Cell BE processor. These processors have a large number of cores and are available to consumers today, but the scalable programming models developed for them are also applicable to current and future multicore CPUs.","1558-2256","","10.1109/JPROC.2008.917731","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4490125","Computer architecture;multicore processors;parallel programming and computation;programming and processing models","Multicore processing;Parallel processing;Parallel programming;Concurrent computing;Hardware;Computer architecture;Programming profession;Pipeline processing;Parallel algorithms;Scalability","microprocessor chips;parallel algorithms;parallel architectures","scalable programming models;multicore processors;parallel algorithms;heterogeneous systems;parallel architectures;GPU;cell BE processor;graphics processing units","","32","25","64","","15 Apr 2008","","","IEEE","IEEE Journals"
"Enable OpenCL Compiler with Open64 Infrastructures","Y. Lin; S. Wang; W. Shih; B. K. Hsieh; J. Lee","Dept. of Comput. Sci., Nat. Tsing-Hua Univ., Hsinchu, Taiwan; Dept. of Comput. Sci., Nat. Tsing-Hua Univ., Hsinchu, Taiwan; Dept. of Comput. Sci., Nat. Tsing-Hua Univ., Hsinchu, Taiwan; Cloud Comput. Res. Center for Mobile Applic., Ind. Technol. Res. Inst., Hsinchu, Taiwan; Dept. of Comput. Sci., Nat. Tsing-Hua Univ., Hsinchu, Taiwan","2011 IEEE International Conference on High Performance Computing and Communications","31 Oct 2011","2011","","","863","868","As microprocessors evolve into heterogeneous architectures with multi-cores of MPUs and GPUs, programming model supports become important for programming such architectures. To address this issue, OpenCL is proposed. Currently, most of OpenCL implementations take LLVM as their infrastructures. This presents an opportunity to demonstrate whether OpenCL can be effectively implemented on other compiler infrastructures. For example, Open64, which is another open source compiler and known to generate efficient codes for microprocessors, can contribute further to performance improvements and enhancing the adoption of heterogeneous computing based on OpenCL. In this paper, we describe the flow to enable an OpenCL compiler based on Open64 infrastructures for ATI GPUs. Our work includes the extension of the front-end parser for OpenCL, the generation of high-level intermediate representations with OpenCL linguistics, performing high-level optimization, and finally applying OpenCL specific optimization for code generations. Preliminary experimental results show that our compiler based on Open64 is able to generate efficient codes for OpenCL programs.","","978-1-4577-1564-8","10.1109/HPCC.2011.123","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6063089","","Vectors;Registers;Optimization;Programming;Graphics processing unit;Hardware;Computer architecture","computer architecture;microprocessor chips;optimising compilers","OpenCL compiler;Open64 infrastructure;microprocessor;heterogeneous architecture;MPU;LLVM;open source compiler;ATI GPU;front-end parser;OpenCL linguistics;code generation","","5","","23","","31 Oct 2011","","","IEEE","IEEE Conferences"
"Performance Portability across Diverse Computer Architectures","T. Deakin; S. McIntosh-Smith; J. Price; A. Poenaru; P. Atkinson; C. Popa; J. Salmon","University of Bristol, UK; University of Bristol, UK; University of Bristol, UK; University of Bristol, UK; University of Bristol, UK; University of Bristol, UK; University of Bristol, UK","2019 IEEE/ACM International Workshop on Performance, Portability and Productivity in HPC (P3HPC)","2 Jan 2020","2019","","","1","13","Previous studies into performance portability have typically analysed a single application (and its various imple- mentations) in isolation. In this study we explore the wider landscape of performance portability by considering a number of applications from across the space of dwarfs, written in multiple parallel programming models, and across a diverse set of architectures. We apply rigorous performance portability metrics, as defined by Pennycook et al [1]. We believe this is the broadest and most rigorous performance portability study to date, representing a far reaching exploration of the state of performance portability that is achievable today. We will present a summary of the performance portability of each application and programming model across our diverge range of twelve computer architectures, including six different server CPUs from five different vendors, five different GPUs from two different vendors, and one vector architecture. We will conclude with an analysis of the performance portability of key programming models in general, across different application spaces as well across differing architectures, allowing us to comment on more general performance portability principles.","","978-1-7281-6003-0","10.1109/P3HPC49587.2019.00006","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8945642","performance portability;productivity;mini-app;programming models","Productivity;Analytical models;Computational modeling;Computer architecture;Programming;Hardware;Standards","coprocessors;multiprocessing systems;parallel programming","performance portability principles;performance portability study;performance portability metrics;programming models;GPU","","11","","19","","2 Jan 2020","","","IEEE","IEEE Conferences"
"A CUDA-based parallel implementation of K-nearest neighbor algorithm","S. Liang; Y. Liu; C. Wang; L. Jian","Graduate University of Chinese Academy of Sciences, Beijing, China; Graduate University of Chinese Academy of Sciences, Beijing, China; Agilent Technologies Co. Ltd., Beijing, China; Graduate University of Chinese Academy of Sciences, Beijing, China","2009 International Conference on Cyber-Enabled Distributed Computing and Knowledge Discovery","26 Jan 2010","2009","","","291","296","Recent developments in Graphics Processing Units (GPUs) have enabled inexpensive high performance computing for general-purpose applications. Due to GPU's tremendous computing capability, it has emerged as the co-processor of the CPU to achieve a high overall throughput. CUDA programming model provides the programmers adequate C language like APIs to better exploit the parallel power of the GPU. K-nearest neighbor (KNN) is a widely used classification technique and has significant applications in various domains, especially in text classification. The computational-intensive nature of KNN requires a high performance implementation. In this paper, we present a CUDA-based parallel implementation of KNN, CUKNN, using CUDA multi-thread model, where the data elements are processed in a data-parallel fashion. Various CUDA optimization techniques are applied to maximize the utilization of the GPU. CUKNN outperforms the serial KNN on an HP xw8600 workstation significantly, achieving up to 46.71X speedup including I/O time. It also shows good scalability when varying the dimension of the reference dataset, the number of records in the reference dataset, and the number of records in the query dataset.","","978-1-4244-5218-7","10.1109/CYBERC.2009.5399145","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5399145","KNN, classification, parallel computing, CUDA","High performance computing;Graphics;Coprocessors;Central Processing Unit;Throughput;Parallel programming;Programming profession;Text categorization;Workstations;Scalability","","","","17","","17","","26 Jan 2010","","","IEEE","IEEE Conferences"
"GCN Inference Acceleration using High-Level Synthesis","Y. C. Lin; B. Zhang; V. Prasanna","University of Southern California,Los Angeles,California; University of Southern California,Los Angeles,California; University of Southern California,Los Angeles,California","2021 IEEE High Performance Extreme Computing Conference (HPEC)","1 Dec 2021","2021","","","1","6","GCN (Graph Convolutional Network) has become a promising solution for many applications, such as recommendation systems, social data mining, etc. Many of these applications requires low latency GCN inference.In this paper, we provide a case study of a GCN inference acceleration on FPGA. We explore high-level synthesis programming model to achieve low-latency inference. First, we propose a partition-centric mapping strategy to map the execution tasks of GCN onto FPGA to exploit data reuse, which reduces external memory access overhead. Second, we provide HLS-based kernel design with improved memory performance and achieve massive data parallelism. Third, we perform design space exploration to facilitate feasible pre-placement which avoids potential Place-and-Route (PnR) failures. We evaluate our design on a state-of-the-art FPGA platform using three commonly used datasets: Reddit, Yelp and Amazon-2M. We compare our design with two state-of-the-art libraries PyTorch-Geometric (PyG) and Deep Graph Library (DGL) running on high-end CPU and GPU by evaluating their latency and energy efficiency to perform full-batch GCN inference on a two-layer Vanilla-GCN model. Compared with PyG CPU version, our design reduces the latency by 59.95× and is 96.22× more energy efficient on the average. Compared with DGL, our design achieves 2.9 × –6.4× speedup and is 5.87× more energy efficient compared with the CPU version. Compared with the DGL GPU version, although the latency of our design is 1.67 × –2.5× that of DGL GPU, our design is 1.8× more energy efficient.","2643-1971","978-1-6654-2369-4","10.1109/HPEC49654.2021.9622801","National Science Foundation; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9622801","","Social networking (online);Graphics processing units;Programming;Energy efficiency;Libraries;Space exploration;Low latency communication","","","","","","19","","1 Dec 2021","","","IEEE","IEEE Conferences"
"Network-on-Chip Design for Heterogeneous Multiprocessor System-on-Chip","B. Phanibhushana; S. Kundu","Dept. of Electr. & Comput. Eng., Univ. of Massachusetts Amherst, Amherst, MA, USA; Dept. of Electr. & Comput. Eng., Univ. of Massachusetts Amherst, Amherst, MA, USA","2014 IEEE Computer Society Annual Symposium on VLSI","22 Sep 2014","2014","","","486","491","With burgeoning growth of mobile systems, multiprocessor System-on-Chip (MPSoC) connected via Network-on-Chip (NoC) has become ubiquitous. A typical MPSoC in mobile applications consists of multiple CPU cores of varying capabilities, GPU cores, DSP cores, and crypto accelerators and such cores differ widely in their physical size and their bandwidth requirements. Traditional mesh based NoC systems work well for regular structures, but do not map well to heterogeneous MPSoCs. In MPSoC programming model, an application consists of tasks, that represent a unit of work on a core which can be executed asynchronously. The communication between tasks is represented in the form of a directed acyclic graph. The temporal burstness of data which arise from programming model provide opportunity for multiplexing communication between cores, which may be advantageous in reducing network size. Often a task graph needs to meet a real-time deadline. The actual execution time may vary based on the application data. The uncertainty in the execution time may be modeled by a statistical distribution, which further complicates the NoC design. In this paper, we present a synthesis method for hierarchical design of NoC for a given task graph system deadline, that optimizes for router area. A 2-phase design flow is proposed, which consists of topology generation and statistical analysis in an iterative loop. We adopt proportion of Monte-Carlo test cases that meet the deadline as a metric for goodness. The proposed solution is compared against static design approach and simulated annealing (SA) based network generation. On an average, a performance benefit of 10% over SA, 16% over standard mesh and 30% over static design was obtained and a total router area benefit of 59% over SA, 48% over mesh and 55% over static design was observed.","2159-3477","978-1-4799-3765-3","10.1109/ISVLSI.2014.96","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6903411","Network-on-chip;Realtime systems;Statistical design;Kernighan-Lin","Partitioning algorithms;Bandwidth;Topology;System-on-chip;Monte Carlo methods;Algorithm design and analysis;Cost function","integrated circuit design;Monte Carlo methods;multiprocessing systems;network-on-chip;statistical analysis","network-on-chip design;heterogeneous multiprocessor system-on-chip;hierarchical design;NoC;task graph system deadline;router area;2-phase design flow;topology generation;statistical analysis;iterative loop;Monte-Carlo test cases","","3","","24","","22 Sep 2014","","","IEEE","IEEE Conferences"
"FCUDA: Enabling efficient compilation of CUDA kernels onto FPGAs","A. Papakonstantinou; K. Gururaj; J. A. Stratton; D. Chen; J. Cong; W. W. Hwu","Electrical & Computer Eng. Dept., University of Illinois, Urbana-Champaign, USA; Computer Science Dept., University of California, Los-Angeles, USA; Electrical & Computer Eng. Dept., University of Illinois, Urbana-Champaign, USA; Electrical & Computer Eng. Dept., University of Illinois, Urbana-Champaign, USA; Computer Science Dept., University of California, Los-Angeles, USA; Electrical & Computer Eng. Dept., University of Illinois, Urbana-Champaign, USA","2009 IEEE 7th Symposium on Application Specific Processors","28 Aug 2009","2009","","","35","42","As growing power dissipation and thermal effects disrupted the rising clock frequency trend and threatened to annul Moore's law, the computing industry has switched its route to higher performance through parallel processing. The rise of multicore systems in all domains of computing has opened the door to heterogeneous multiprocessor, where processors of different compute characteristics can be combined to effectively boost the performance per watt of different application kernels. GPUs and FPGAs are becoming very popular in PC-based heterogeneous systems for speeding up compute intensive kernels of scientific, imaging and simulation applications. GPUs can execute hundreds of concurrent threads, while FPGAs provide customized concurrency for highly parallel kernels. However, exploiting the parallelism available in these applications is currently not a push-button task. Often the programmer has to expose the application's fine and coarse grained parallelism by using special APIs. CUDA is such a parallel computing API that is driven by the GPU industry and is gaining significant popularity. In this work, we adapt the CUDA programming model into a new FPGA design flow called FCUDA, which efficiently maps the coarse and fine grained parallelism exposed in CUDA onto the reconfigurable fabric. Our CUDA-to-FPGA flow employs autopilot, an advanced high level synthesis tool which enables high abstraction FPGA programming. FCUDA is based on a source-to-source compilation that transforms the SPMD CUDA thread blocks into parallel C code for autopilot. We describe the details of our CUDA-to-FPGA flow and demonstrate the highly competitive performance of the resulting customized FPGA multi-core accelerators. To the best of our knowledge, this is the first CUDA-to-FPGA flow to demonstrate the applicability and potential advantage of using the CUDA programming model for high-performance computing in FPGAs.","","978-1-4244-4939-2","10.1109/SASP.2009.5226333","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5226333","","Kernel;Field programmable gate arrays;Parallel processing;Concurrent computing;Computer industry;Yarn;Power dissipation;Clocks;Frequency;Moore's Law","application program interfaces;field programmable gate arrays;multiprocessing systems;parallel architectures","CUDA kernel;FPGA programming;field programmable gate array;power dissipation;clock frequency;Moores law;computing industry;parallel processing;multicore system;multiprocessor system;performance per watt boosting;application program interface;compute unified device architecture;graphics processing unit","","82","1","23","","28 Aug 2009","","","IEEE","IEEE Conferences"
"Implementing Performance Portable Graph Algorithms Using Task-Based Execution","Ü. V. Çatalyürek",Georgia Institute of Technology,"2021 IEEE/ACM 11th Workshop on Irregular Applications: Architectures and Algorithms (IA3)","28 Dec 2021","2021","","","1","1","Summary form only given, as follows. The complete presentation was not made available for publication as part of the conference proceedings. Designing flexible graph kernels that can run well on various platforms is a crucial research problem due to the frequent usage of graphs for modeling data and recent architectural advances and variety. In this talk, I will present our recent graph processing model and framework, PGAbB, for modern shared-memory heterogeneous platforms. PGAbB implements a block-based programming model. This allows a user to express a graph algorithm using functors that operate on an ordered list of blocks (subgraphs). Our framework deploys these computations to all available resources in a heterogeneous architecture. We will demonstrate that one can implement a diverse set of graph algorithms in our framework, and task-based execution enables graph computations even on large graphs that do not fit in GPU device memory. Our experimental results show that PGAbB achieves competitive or superior performance compared to hand-optimized implementations or existing state-of-the-art graph computing frameworks.","2767-942X","978-1-6654-1126-4","10.1109/IA354616.2021.00007","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9653075","","","","","","","","","","28 Dec 2021","","","IEEE","IEEE Conferences"
"High Performance Matrix Multiplication on General Purpose Graphics Processing Units","F. Wu; M. Cabral; J. Brazelton","Comput. Sci. Dept., Tuskegee Univ., Tuskegee, AL, USA; Comput. Sci. Dept., Tuskegee Univ., Tuskegee, AL, USA; Comput. Sci. Dept., Tuskegee Univ., Tuskegee, AL, USA","2010 International Conference on Computational Intelligence and Software Engineering","30 Dec 2010","2010","","","1","4","In recent years, there has been significant interest from both academia and industry in applying commodity graphics processing units (GPUs) toward general computing problems. The nVidia CUDA programming model provides a straightforward means of describing inherently parallel computations. In this paper, we present our GPU-based matrix multiplication with high performance on General Purpose Graphics Processing Unit (GPGPUs). We implemented our algorithm using nVidia CUDA API and compared its performance with an optimized CPU-implementation on a high-end AMD Opteron Dual Core CPU. Our experimental results show that a significant performance improvement over CPU-based algorithm and the maximum observed speedups are about 100 times.","","978-1-4244-5391-7","10.1109/CISE.2010.5677044","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5677044","","Graphics processing unit;Kernel;Instruction sets;Computer architecture;Central Processing Unit;Programming","coprocessors;matrix multiplication","matrix multiplication;general purpose graphics processing units;nVidia CUDA programming;parallel computations;AMD Opteron Dual Core CPU","","","","5","","30 Dec 2010","","","IEEE","IEEE Conferences"
"Cellular Neural Networks for FPGAs with OpenCL","F. Richter-Gottfried; D. Fey",NA; NA,"CNNA 2016; 15th International Workshop on Cellular Nanoscale Networks and their Applications","23 Jan 2017","2016","","","1","2","Cellular Neural Networks (CNNs) are an inherently parallel computational model for multiple applications, and they are especially appropriate for image processing tasks. Besides of implementing them with analogue electronic circuits, they can be simulated on digital processor architectures like CPUs and GPUs, with the drawback of limited parallelism. FPGAs offer a fine-grained parallel execution with low power consumption and are thus attractive for embedded systems like smart cameras, for which it is not possible to use a full-featured CPU or GPU with tens or hundrets of watts. The drawback of implementing CNNs with FPGAs, to profit from the high performance-to-power ratio, is the time-consuming design process with conventional hardware descriptions languages. High-level-synthesis, e.g., from OpenCL, eases the process of generating CNNs in FPGAs. By using the OpenCL programming model, the programmer can explicitly express the parallel nature of CNNs in a platform-independent way. To investigate its applicability to CNNs, we compare the execution of an unmodified OpenCL kernel on a recent CPU with an FPGA design generated with Altera's SDK for OpenCL. The results show, that though the CPU is faster, the FPGA solution performs better in terms of energy efficiency and fits for smart camera systems.","","978-3-8007-4252-3","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7827967","","","","","","","","","","23 Jan 2017","","","VDE","VDE Conferences"
"Gemma in April: A matrix-like parallel programming architecture on OpenCL","T. Wu; D. Wu; Y. Wang; X. Zhang; H. Luo; N. Xu; H. Yang","Department of Electronic Engineering, TNList, Tsinghua University; Department of Electronic Engineering, TNList, Tsinghua University; Department of Electronic Engineering, TNList, Tsinghua University; Department of Electronic Engineering, TNList, Tsinghua University; Department of Electronic Engineering, TNList, Tsinghua University; Hardware Computing Group, Microsoft Research Asia; Department of Electronic Engineering, TNList, Tsinghua University","2011 Design, Automation & Test in Europe","5 May 2011","2011","","","1","6","Nowadays, Graphics Processing Unit (GPU), as a kind of massive parallel processor, has been widely used in general purposed computing tasks. Although there have been mature development tools, it is not a trivial task for programmers to write GPU programs. Based on this consideration, we propose a novel parallel computing architecture. The architecture includes a parallel programming model, named Gemma, and a programming framework, named April. Gemma is based on generalized matrix operations, and helps to alleviate the difficulty of describing parallel algorithms. April is a high-level framework that can compile and execute tasks described in Gemma with OpenCL. In particular, April can automatically 1) choose the best parallel algorithm and mapping scheme, and generate OpenCL kernels, 2) schedule Gemma tasks based on execution costs such as data storing and transferring. Our experimental results show that with competitive performance, April considerably reduces the programs' code length compared with OpenCL.","1558-1101","978-3-9810801-8-6","10.1109/DATE.2011.5763119","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5763119","","Graphics processing unit;Computer architecture;Sparse matrices;Computational modeling;Kernel;Parallel programming","computer graphic equipment;coprocessors;parallel programming;programming languages","matrix-like parallel programming architecture;graphics processing unit;parallel computing architecture;Gemma;April;parallel algorithms;OpenCL kernels;data storing;data transferring;open computing language","","","","11","","5 May 2011","","","IEEE","IEEE Conferences"
"Evaluating Performance and Portability of a core bioinformatics kernel on multiple vendor GPUs","M. Haseeb; N. Ding; J. Deslippe; M. Awan","Florida International University,Miami,USA; Lawrence Berkeley National Laboratory,Berkeley,USA; Lawrence Berkeley National Laboratory,Berkeley,USA; Lawrence Berkeley National Laboratory,Berkeley,USA","2021 International Workshop on Performance, Portability and Productivity in HPC (P3HPC)","28 Dec 2021","2021","","","68","78","Traditional scientific simulations have for quite some time, dominated the workloads of high-performance computing infrastructures across the world. With recent advancement in data generation capabilities of systems biology equipment, a rise in bioinformatics workloads has been observed. Bioinformatics applications deploy algorithmic motifs that use unique memory access patterns and rely heavily on integer-only computations. These applications place unique requirements on modern programming environments as well as GPU accelerators which are becoming an integral part of next generation of supercomputers. In this paper, we evaluate the performance and code portability of a core bioinformatics kernel that uses dynamic programming method for performing DNA and protein sequence alignments in several bioinformatics software pipelines. Our study evaluates the performance of a GPU accelerated sequence alignment algorithm across multiple vendor GPUs and programming models. We use a highly optimized adaptation of sequence alignment kernel and find the most productive way of porting it across multiple vendor GPUs and then assess its performance portability using Pennycook's method. Methods used in this paper and the insights drawn from those can be extended to a large number of integer-heavy scientific kernels and may aid in future accelerator design and design of programming model requirements.","","978-1-6654-2439-4","10.1109/P3HPC54578.2021.00010","U.S. Department of Energy(grant numbers:17-SC-20-SC); National Nuclear Security Administration; Oak Ridge National Laboratory; Office of Science of the U.S. Department of Energy(grant numbers:DE-AC05-000R22725); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9652848","Performance;Portability;GPUs;Bioinformatics;DNA;Protein;Sequence Alignment","Performance evaluation;Codes;Biological system modeling;Graphics processing units;Computer architecture;Programming;Supercomputers","","","","","","39","","28 Dec 2021","","","IEEE","IEEE Conferences"
"An open-source solution to performance portability for Summit and Sierra supercomputers","G. T. Bercea; A. Bataev; A. E. Eichenberger; C. Bertolli; J. K. O'Brien",NA; NA; NA; NA; NA,"IBM Journal of Research and Development","13 May 2020","2020","64","3/4","12:1","12:23","Programming models that use a higher level of abstraction to express parallelism can target both CPUs and any attached devices, alleviating the maintainability and portability concerns facing today's heterogenous systems. This article describes the design, implementation, and delivery of a compliant OpenMP device offloading implementation for IBM-NVIDIA heterogeneous servers composing the Summit and Sierra supercomputers in the mainline open-source Clang/LLVM compiler and OpenMP runtime projects. From a performance perspective, reconciling the GPU programming model, best suited for massively parallel workloads, with the generality of the OpenMP model was a significant challenge. To achieve both high performance and full portability, we map high-level programming patterns to fine-tuned code generation schemes and customized runtimes that preserve the OpenMP semantics. In the compiler, we implement a low-overhead single-program multiple-data scheme that leverages the GPU native execution model and a fallback scheme to support the generality of OpenMP. Modular design enables the implementation to be extended with new schemes for frequently occurring patterns. Our implementation relies on key optimizations: sharing data among threads, leveraging unified memory, aggressive inlining of runtime calls, memory coalescing, and runtime simplification. We show that for commonly used patterns, performance on the Summit and Sierra GPUs matches that of hand-written native CUDA code.","0018-8646","","10.1147/JRD.2019.2955944","CORAL(grant numbers:B604142); ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8928619","","Programming;Graphics processing units;Instruction sets;Runtime;Computational modeling;Open source software;Performance evaluation","","","","","","39","IBM","9 Dec 2019","","","IBM","IBM Journals"
"Designing APU Oriented Scientific Computing Applications in OpenCL","M. Doerksen; S. Solomon; P. Thulasiraman","Dept. of Comput. Sci., Univ. of Manitoba, Winnipeg, MB, Canada; Dept. of Comput. Sci., Univ. of Manitoba, Winnipeg, MB, Canada; Dept. of Comput. Sci., Univ. of Manitoba, Winnipeg, MB, Canada","2011 IEEE International Conference on High Performance Computing and Communications","31 Oct 2011","2011","","","587","592","The future of high performance computing is moving towards exa-scale computing. Graphical Processing Units (GPUs) have demonstrated their capabilities beyond graphics rendering or general purpose computing and are well suited for data intensive applications. However, the communication bottleneck for data transfer between the GPU and CPU has led to the design of AMD's Accelerated Processing Unit (APU) which combines the CPU and GPU on a single chip. This new architecture poses new challenges: algorithms must be redesigned to take advantage of this architecture and programming models differ between vendors, hindering the portability of algorithms across heterogeneous platforms. Recently, OpenCL has been regarded as the standard programming model for heterogeneous platforms. With the future of general purpose computing moving towards APUs, in this paper, we study the design and implementation of two problems: 0-1 knapsack and Gaussian Elimination in OpenCL. This pair of algorithms showcases similar synchronization behaviors, enabling a more direct comparison. We discuss the design and performance of these algorithms using OpenCL.","","978-1-4577-1564-8","10.1109/HPCC.2011.83","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6063044","","Graphics processing unit;Instruction sets;Synchronization;Central Processing Unit;Algorithm design and analysis;Computer architecture;Equations","computer graphic equipment;coprocessors;parallel algorithms;programming languages","APU oriented scientific computing application;accelerated processing unit;high performance computing;OpenCL;exascale computing;graphical processing unit;graphics rendering;general purpose computing;0-1 knapsack problem;Gaussian elimination problem;synchronization behavior;open computing language","","9","","12","","31 Oct 2011","","","IEEE","IEEE Conferences"
"Cambricon-G: A Polyvalent Energy-Efficient Accelerator for Dynamic Graph Neural Networks","X. Song; T. Zhi; Z. Fan; Z. Zhang; X. Zeng; W. Li; X. Hu; Z. Du; Q. Guo; Y. Chen","State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China; State Key Laboratory of Computer Architecture, Institute of Computing Technology, Chinese Academy of Sciences, Beijing, China","IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems","22 Dec 2021","2022","41","1","116","128","Graph neural networks (GNNs), which extend traditional neural networks for processing graph-structured data, have been widely used in many fields. The GNN computation mainly consists of the edge processing to generate messages by combining the edge/vertex features and the vertex processing to update the vertex features with aggregated messages. In addition to nontrivial vector operations in the edge processing, huge random accesses and neural network operations in the vertex processing, the graph topology of GNNs may also vary during the computation (i.e., dynamic GNNs). The above characteristics pose significant challenges on existing architectures. In this article, we propose a novel accelerator named CAMBRICON-G for efficient processing of both dynamic and static GNNs. The key of CAMBRICON-G is to abstract the irregular computation of a broad range of GNN variants to the process of regularly tiled adjacent cuboid (which extends the traditional adjacent matrix of graph by adding the dimension of vertex features). The intuition is that the adjacent cuboid facilitates exploitation of both data locality and parallelism by offering multidimensional multilevel tiling (including spatial and temporal tiling) opportunities. To perform the multidimensional spatial tiling, the CAMBRICON-G architecture mainly consists of the cuboid engine (CE) and hybrid on-chip memory. The CE has multiple vertex processing units (VPUs) working in a coordinated manner to efficiently process the sparse data and dynamically update the graph topology with dedicated instructions. The hybrid on-chip memory contains the topology-aware cache and multiple scratchpad memory to reduce off-chip memory access. To perform the multidimensional temporal tiling, an easy-to-use programming model is provided to flexibly explore different tiling options for large graphs. Experimental results show that compared against Nvidia P100 GPU, the performance and energy efficiency can be improved by $7.14\times $ and $20.18\times $ , respectively, on various GNNs, which validates both the versatility and energy efficiency of CAMBRICON-G.","1937-4151","","10.1109/TCAD.2021.3052138","National Key Research and Development Program of China(grant numbers:2017YFA0700900,2017YFA0700902,2017YFA0700901); NSF of China(grant numbers:61925208,61732007,61732002,61702478,61906179,62002338,61702459,U19B2019,U20A20227); Beijing Natural Science Foundation(grant numbers:JQ18013); Key Research Projects in Frontier Science of Chinese Academy of Sciences(grant numbers:QYZDB-SSW-JSC001); Strategic Priority Research Program of Chinese Academy of Science(grant numbers:XDB32050200,XDC05010300,XDC08040102); Beijing Academy of Artificial Intelligence (BAAI) and Beijing Nova Program of Science and Technology(grant numbers:Z191100001119093); Science and Technology Planning Project of Guangdong Province(grant numbers:2019B090909005); Youth Innovation Promotion Association CAS and Xplore Prize; ","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9326339","Accelerator;architecture;graph neural networks (GNNs)","Hardware;Programming;Topology;System-on-chip;Graphics processing units;Convolution;Engines","","","","","","32","IEEE","18 Jan 2021","","","IEEE","IEEE Journals"
"HyGCN: A GCN Accelerator with Hybrid Architecture","M. Yan; L. Deng; X. Hu; L. Liang; Y. Feng; X. Ye; Z. Zhang; D. Fan; Y. Xie","Chinese Academy of Sciences; University of California, Santa Barbara; University of California, Santa Barbara; University of California, Santa Barbara; Chinese Academy of Sciences; Chinese Academy of Sciences; Chinese Academy of Sciences; Chinese Academy of Sciences; University of California, Santa Barbara","2020 IEEE International Symposium on High Performance Computer Architecture (HPCA)","16 Apr 2020","2020","","","15","29","Inspired by the great success of neural networks, graph convolutional neural networks (GCNs) are proposed to analyze graph data. GCNs mainly include two phases with distinct execution patterns. The Aggregation phase, behaves as graph processing, showing a dynamic and irregular execution pattern. The Combination phase, acts more like the neural networks, presenting a static and regular execution pattern. The hybrid execution patterns of GCNs require a design that alleviates irregularity and exploits regularity. Moreover, to achieve higher performance and energy efficiency, the design needs to leverage the high intra-vertex parallelism in Aggregation phase, the highly reusable inter-vertex data in Combination phase, and the opportunity to fuse phase-by-phase execution introduced by the new features of GCNs. However, existing architectures fail to address these demands. In this work, we first characterize the hybrid execution patterns of GCNs on Intel Xeon CPU. Guided by the characterization, we design a GCN accelerator, HyGCN, using a hybrid architecture to efficiently perform GCNs. Specifically, first, we build a new programming model to exploit the fine-grained parallelism for our hardware design. Second, we propose a hardware design with two efficient processing engines to alleviate the irregularity of Aggregation phase and leverage the regularity of Combination phase. Besides, these engines can exploit various parallelism and reuse highly reusable data efficiently. Third, we optimize the overall system via inter-engine pipeline for inter-phase fusion and priority-based off-chip memory access coordination to improve off-chip bandwidth utilization. Compared to the state-of-the-art software framework running on Intel Xeon CPU and NVIDIA V100 GPU, our work achieves on average 1509× speedup with 2500× energy reduction and average 6.5× speedup with 10× energy reduction, respectively.","2378-203X","978-1-7281-6149-5","10.1109/HPCA47549.2020.00012","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9065592","Hardware Accelerator, Graph Convolution Neural Network, Graph Processing, Hybrid Execution Pattern","Computer architecture;Neural networks;Engines;Parallel processing;Aggregates;Fuses;Hardware","convolutional neural nets;graph theory;graphics processing units;microprocessor chips;multiprocessing systems;parallel architectures;parallel processing;power aware computing","hybrid execution patterns;GCNs;energy efficiency;high intra-vertex parallelism;Aggregation phase;phase-by-phase execution;Intel Xeon CPU;GCN accelerator;HyGCN;hybrid architecture;hardware design;inter-phase fusion;priority-based off-chip memory access coordination;graph convolutional neural networks;graph data;graph processing;inter-vertex data;off-chip bandwidth utilization;software framework","","38","","46","","16 Apr 2020","","","IEEE","IEEE Conferences"
"CoSMo: Intent-based composition of shader modules","G. Haaser; H. Steinlechner; M. May; M. Schwärzler; S. Maierhofer; R. Tobler","VRVis Research Center, Donau-City-Strasse 1, Vienna, Austria; VRVis Research Center, Donau-City-Strasse 1, Vienna, Austria; VRVis Research Center, Donau-City-Strasse 1, Vienna, Austria; VRVis Research Center, Donau-City-Strasse 1, Vienna, Austria; VRVis Research Center, Donau-City-Strasse 1, Vienna, Austria; VRVis Research Center, Donau-City-Strasse 1, Vienna, Austria","2014 International Conference on Computer Graphics Theory and Applications (GRAPP)","12 Oct 2015","2014","","","1","11","We propose a novel shader programming model which operates on intent-oriented shader modules instead of specific programs for dedicated GPU rasterization pipeline stages. In constrast to existing pipeline shader frameworks, our system exposes a radically simplified pipeline, which we purposefully aligned with our basic intuition of shaders as per-primitive and per-pixel operations and compositions thereof. This simplicity lends itself to structure modules purely based on their intent, instead of dealing with structure enforced by specific versions of graphics APIs. Consequently, this offers great flexibility when it comes to reusing and combining modules with completely different semantics, or when targeting different graphics APIs. The simplicity and uniformity of our system also motivates automatic parameterization and simplification of shader programs as well as interesting interactive shader development and management techniques.","","978-9-8975-8078-9","","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7296051","Shader;Composition;Rendering;Language;Embedded","Semantics;Pipelines;Programming;Lighting;Rendering (computer graphics);Synthesizers;Surface treatment","","","","","","22","","12 Oct 2015","","","IEEE","IEEE Conferences"
"A Hybrid Cache HW/SW Stack for Optimizing Neural Network Runtime, Power and Endurance","W. A. Simon; A. Levisse; M. Zapater; D. Atienza","Embedded Systems Laboratory (ESL), Swiss Federal Institute of Technology Lausanne (EPFL); Embedded Systems Laboratory (ESL), Swiss Federal Institute of Technology Lausanne (EPFL); University of Applied Sciences Western Switzerland (HEIG-VD / HES-SO); Embedded Systems Laboratory (ESL), Swiss Federal Institute of Technology Lausanne (EPFL)","2020 IFIP/IEEE 28th International Conference on Very Large Scale Integration (VLSI-SOC)","10 Feb 2021","2020","","","94","99","Hybrid caches consisting of both SRAM and emerging Non-Volatile Random Access Memory (eNVRAM) bitcells increase cache capacity and reduce power consumption by taking advantage of eNVRAM's small area footprint and low leakage energy. However, they also inherit eNVRAM's drawbacks, including long write latency and limited endurance. To mitigate these drawbacks, many works propose heuristic strategies to allocate memory blocks into SRAM or eNVRAM arrays at runtime based on block content or access pattern. In contrast, this work presents a HW/SW Stack for Hybrid Caches (SHyCache), consisting of a hybrid cache architecture and supporting programming model, reminiscent of those that enable GP-GPU acceleration, in which application variables can be allocated explicitly to the eNVRAM cache, eliminating the need for heuristics and reducing cache access time, power consumption, and area overhead while maintaining maximal cache utilization efficiency and ease of programming. SHyCache improves performance for applications such as neural networks, which contain large numbers of invariant weight values with high read/write access ratios that can be explicitly allocated to the eNVRAM array. We simulate SHyCache on the gem5-X architectural simulator and demonstrate its utility by benchmarking a range of cache hierarchy variations using three neural networks, namely, Inception v4, ResNet-50, and SqueezeNet 1.0. We demonstrate a design space that can be exploited to optimize performance, power consumption, or endurance, depending on the expected use case of the architecture, while demonstrating maximum performance gains of 1.7 /1.4/1.3x and power consumption reductions of 5.1/5.2/5.4x, for Inception/ResNet/SqueezeNet, respectively.","2324-8440","978-1-7281-5409-1","10.1109/VLSI-SOC46417.2020.9344087","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9344087","eNVRAM;STT-MRAM;hybrid caches;neural networks;low-power systems","Power demand;Runtime;Random access memory;Programming;Benchmark testing;Hybrid power systems;Resource management","","","","","","26","","10 Feb 2021","","","IEEE","IEEE Conferences"
"VSIPL++ Acceleration Using Commodity Graphics Processors","D. Campbell","Georgia Tech Research Institute, Smyrna, GA","2006 HPCMP Users Group Conference (HPCMP-UGC'06)","19 Mar 2007","2006","","","315","320","The High Performance Embedded Computing Software Initiative (HPEC-SI) is developing a unified software framework for computation and communication for high performance signal processing tasks on parallel computers. The goal of the program is to address the high cost of software in Department of Defense (DoD) systems by improving the portability and productivity of signal processing application development, while simultaneously improving performance compared to current practices. The Vector, Signal, and Image Processing Library (VSIPL) is a portable application programming interface (API) that is widely used for embedded DoD signal processing systems. One portion of the HPEC-SI effort includes the development of C++ extensions for the existing VSIPL standard, called VSIPL++. Commodity graphics processing units (GPUs) are application-specific processors that implement a standardized three-dimensional graphics-rendering pipeline, and provide significant floating-point processing capacity at much lower cost, power consumption, and physical space compared to general-purpose processors. Recent changes in GPUs have increased programmability and flexibility in portions of the rendering pipeline, allowing non-graphics applications to exploit their computational capacity. Restrictions on the programming model, lack of appropriate tools, unusual performance behavior, and other factors make exploiting GPUs a costly, difficult, and time-consuming process for application developers. The embedded systems that VSIPL and VSIPL++ are commonly used on share several important characteristics with GPUs, making VSIPL++ well suited to abstract and exploit GPUs. This paper describes GPUVSIPL++, an implementation of portions of the VSIPL++ standard that exploits a GPU to accelerate computation beyond what is possible on a development workstation","","0-7695-2797-3","10.1109/HPCMP-UGC.2006.77","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4134073","","Acceleration;Graphics;Signal processing;Embedded computing;Software performance;Embedded software;Concurrent computing;High performance computing;Costs;Application software","application program interfaces;microprocessor chips","VSIPL++ acceleration;commodity graphics processors;unified software framework;high performance signal processing;parallel computers;portable application programming interface;3D graphics-rendering pipeline;floating-point processing;GPUVSIPL++","","2","","13","","19 Mar 2007","","","IEEE","IEEE Conferences"
"Benchmarking and Extending SYCL Hierarchical Parallelism","T. Deakin; S. McIntosh-Smith; A. Alpay; V. Heuveline","University of Bristol,Department of Computer Science,Bristol,UK; University of Bristol,Department of Computer Science,Bristol,UK; Universität Heidelberg,Engineering Mathematics and Computing Lab and Interdisciplinary Center for Scientific Computing,Heidelberg,Germany; Universität Heidelberg,Engineering Mathematics and Computing Lab and Interdisciplinary Center for Scientific Computing,Heidelberg,Germany","2021 IEEE/ACM International Workshop on Hierarchical Parallelism for Exascale Computing (HiPar)","24 Dec 2021","2021","","","10","19","SYCL is an open-standard, parallel programming model for programming heterogeneous devices from Khronos. It allows single-source programming of diverse attached devices in a cross-platform manner in modern C++. SYCL provides different layers of parallel abstractions, including Same Instruction Multiple Thread (SIMT) kernels, data-parallel loop concurrency and hierarchical parallelism. We discuss Scoped Parallelism as an extension to the existing Hierarchical Parallelism in SYCL, and highlight the advantages and disadvantages of these models from the perspective of the programmer and an implementer of SYCL. In this paper, we compare writing benchmark programs using SIMT kernel, hierarchical parallelism and scoped parallelism paradigms, and present results running on a high-performance CPU and GPU.","","978-1-6654-1132-5","10.1109/HiPar54615.2021.00007","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9654235","","Concurrent computing;Parallel programming;Exascale computing;Conferences;Graphics processing units;C++ languages;Parallel processing","","","","","","8","","24 Dec 2021","","","IEEE","IEEE Conferences"
"CPUs and GPUs: Who Owns the Future?","E. R. Altman",ealtman@us.ibm.com,"IEEE Micro","17 Oct 2011","2011","31","5","2","3","This column addresses issues facing CPUs, GPUs, and how to program them and other computing devices.","1937-4143","","10.1109/MM.2011.84","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6045683","CPU;GPU;performance;application-specific integrated circuit;field-programmable gate array;programming model;productivity","","","","","1","","","IEEE","17 Oct 2011","","","IEEE","IEEE Magazines"
"A nodal discontinuous Galerkin method for reverse-time migration on GPU clusters","A. Modave; A. St-Cyr; W. A. Mulder; T. Warburton",NA; NA; NA; NA,"Geophysical Journal International","18 Jan 2018","2015","203","2","1419","1435","Improving both accuracy and computational performance of numerical tools is a major challenge for seismic imaging and generally requires specialized implementations to make full use of modern parallel architectures. We present a computational strategy for reverse-time migration (RTM) with accelerator-aided clusters. A new imaging condition computed from the pressure and velocity fields is introduced. The model solver is based on a high-order discontinuous Galerkin time-domain (DGTD) method for the pressure–velocity system with unstructured meshes and multirate local time stepping. We adopted the MPI+X approach for distributed programming where X is a threaded programming model. In this work we chose OCCA, a unified framework that makes use of major multithreading languages (e.g. CUDA and OpenCL) and offers the flexibility to run on several hardware architectures. DGTD schemes are suitable for efficient computations with accelerators thanks to localized element-to-element coupling and the dense algebraic operations required for each element. Moreover, compared to high-order finite-difference schemes, the thin halo inherent to DGTD method reduces the amount of data to be exchanged between MPI processes and storage requirements for RTM procedures. The amount of data to be recorded during simulation is reduced by storing only boundary values in memory rather than on disk and recreating the forward wavefields. Computational results are presented that indicate that these methods are strong scalable up to at least 32 GPUs for a three-dimensional RTM case.","1365-246X","","10.1093/gji/ggv380","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8188177","Image processing;Numerical solutions;Computational seismology","","","","","1","","","","18 Jan 2018","","","OUP","OUP Journals"
"Keynote 1 — It's about time","E. A. Lee",U. C. Berkeley,"2014 International Conference on ReConFigurable Computing and FPGAs (ReConFig14)","9 Feb 2015","2014","","","1","1","Summary form only given. Cyber-physical systems are integrations of computation, communication networks, and physical dynamics. Although time plays a central role in the physical world, all widely used software abstractions lack temporal semantics. The notion of correct execution of a program written in every widely-used programming language today does not depend on the temporal behavior of the program. But temporal behavior matters in almost all systems. Even in systems with no particular real-time requirements, timing of programs is relevant to the value delivered by programs, and in the case of concurrent programs, also affects the functionality. In cyber-physical systems, temporal behavior affects not just the value delivered by a system but also its correctness. In this talk, I will argue that time can and must become part of the semantics of programs for a large class of applications. To illustrate that this is both practical and useful, we will describe two recent efforts at Berkeley in the design and implementation of timing-centric software systems. On the implementation side, I will describe PRET machines, which redefine the instruction-set architecture (ISA) of a microprocessor to include temporal semantics. Such machines can be used in high-confidence and safety-critical systems, in energy-constrained systems, in mixed-criticality systems, and as a Real-Time Unit (RTU) that cooperates with a general-purpose processor to provide real-time services, in a manner similar to how a GPU provides graphics services. On the design side, I will briefly describe PTIDES, a programming model for distributed real-time systems.","2325-6532","978-1-4799-5944-0","10.1109/ReConFig.2014.7032479","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7032479","","","instruction sets;programming language semantics","distributed real time systems;programming model;PTIDES;RTU;real time unit;mixed criticality systems;energy constrained systems;safety critical systems;microprocessor;ISA;instruction set architecture;timing centric software systems;Berkeley;concurrent programs;temporal behavior;programming language;program written;software abstractions lack temporal semantics;physical dynamics;communication networks;cyber physical systems","","","","","","9 Feb 2015","","","IEEE","IEEE Conferences"
"[Front matter]","",,"International Symposium on Code Generation and Optimization (CGO 2011)","5 May 2011","2011","","","i","ii","The following topics are dealt with: polyhedral compilation; machine learning; software-hardware co-design; DSP; data parallel heterogeneous system; GPU programming model; source-to-source compiler optimisation; safety-critical real-time system; WCET-aware C compiler; high-level language; low level code optimization; performance asymmetric multicore processors; tagless instruction cache; software transactional memory optimization; multiprocessor chip; vapor SIMD; on-chip cache hierarchy aware tile scheduling; data locality; NoC based multicore; embedded language; virtual machine; Java JIT compiler; highly scalable distributed dataflow analysis; and flow sensitive pointer analysis.","","978-1-61284-357-5","10.1109/CGO.2011.5764642","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5764642","","","cache storage;data flow analysis;hardware-software codesign;Java;multiprocessing systems;network-on-chip;optimising compilers;parallel processing;safety-critical software;virtual machines","polyhedral compilation;machine learning;software-hardware co-design;DSP;data parallel heterogeneous system;GPU programming model;source-to-source compiler optimisation;safety-critical real-time system;WCET-aware C compiler;high-level language;low level code optimization;performance asymmetric multicore processors;tagless instruction cache;software transactional memory optimization;multiprocessor chip;vapor SIMD;on-chip cache hierarchy aware tile scheduling;data locality;NoC based multicore;embedded language;virtual machine;Java JIT compiler;highly scalable distributed dataflow analysis;flow sensitive pointer analysis","","","","","","5 May 2011","","","IEEE","IEEE Conferences"
"[Title page i]","",,"2011 11th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing","11 Jul 2011","2011","","","i","i","The following topics are dealt with: cluster computing; cloud computing; grid computing; virtual machines; GPU-based computing; programming models; runtime systems; volunteer computing; distributed systems; resource scheduling; data streaming; caching memory; shared memory; data-driven computing; fault tolerance; checkpointing; communication management; network management; distributed hash tables; I/O systems; file systems; QoS; data intensive computing; MapReduce; security; social network; business workshop; industry workshop; and enterprise workshop.","","978-1-4577-0129-0","10.1109/CCGrid.2011.1","","https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5948665","","","cache storage;cloud computing;computer graphic equipment;coprocessors;cryptography;data analysis;distributed shared memory systems;fault tolerant computing;grid computing;pattern clustering;quality of service;resource allocation;social networking (online);telecommunication network management;virtual enterprises;virtual machines","cluster computing;cloud computing;grid computing;virtual machine;GPU-based computing;programming model;runtime system;volunteer computing;distributed system;resource scheduling;data streaming;caching memory;shared memory;data-driven computing;fault tolerance;checkpointing;communication management;network management;distributed hash tables;I/O system;QoS;data intensive computing;MapReduce;security;social network;business workshop;industry workshop;enterprise workshop;file system","","","","","","11 Jul 2011","","","IEEE","IEEE Conferences"
================================================
FILE: notebooks/data/springer.csv
================================================
Item Title,Publication Title,Book Series Title,Journal Volume,Journal Issue,Item DOI,Authors,Publication Year,URL,Content Type
"A comparative study of GPU programming models and architectures using neural networks","The Journal of Supercomputing","","61","3","10.1007/s11227-011-0631-3","Vivek K. PallipuramMohammad BhuiyanMelissa C. Smith","2012","http://link.springer.com/article/10.1007/s11227-011-0631-3","Article"
"Extension of the DVM parallel programming model for clusters with heterogeneous nodes","Doklady Mathematics","","84","3","10.1134/S1064562411060408","V. A. BakhtinV. A. KryukovB. N. ChetverushkinE. V. Shil’nikov","2011","http://link.springer.com/article/10.1134/S1064562411060408","Article"
"Parallel programming models for heterogeneous many-cores: a comprehensive survey","CCF Transactions on High Performance Computing","","2","4","10.1007/s42514-020-00039-4","Jianbin FangChun HuangTao TangZheng Wang","2020","http://link.springer.com/article/10.1007/s42514-020-00039-4","Article"
"MapReduce Parallel Programming Model: A State-of-the-Art Survey","International Journal of Parallel Programming","","44","4","10.1007/s10766-015-0395-0","Ren LiHaibo HuHeng LiYunsong WuJianxi Yang","2016","http://link.springer.com/article/10.1007/s10766-015-0395-0","Article"
"Exploring the interoperability of remote GPGPU virtualization using rCUDA and directive-based programming models","The Journal of Supercomputing","","74","11","10.1007/s11227-016-1791-y","Adrián CastellóAntonio J. PeñaRafael MayoJudit PlanasEnrique S. Quintana-OrtíPavan Balaji","2018","http://link.springer.com/article/10.1007/s11227-016-1791-y","Article"
"Porting and scaling OpenACC applications on massively-parallel, GPU-accelerated supercomputers","The European Physical Journal Special Topics","","210","1","10.1140/epjst/e2012-01634-y","A. HartR. AnsaloniA. Gray","2012","http://link.springer.com/article/10.1140/epjst/e2012-01634-y","Article"
"Providing Source Code Level Portability Between CPU and GPU with MapCG","Journal of Computer Science and Technology","","27","1","10.1007/s11390-012-1205-4","Chun-Tao HongDe-Hao ChenYu-Bei ChenWen-Guang ChenWei-Min ZhengHai-Bo Lin","2012","http://link.springer.com/article/10.1007/s11390-012-1205-4","Article"
"Efficiency and productivity for decision making on low-power heterogeneous CPU+GPU SoCs","The Journal of Supercomputing","","77","1","10.1007/s11227-020-03257-3","Denisa-Andreea ConstantinescuAngeles NavarroFrancisco CorberaJuan-Antonio Fernández-MadrigalRafael Asenjo","2021","http://link.springer.com/article/10.1007/s11227-020-03257-3","Article"
"Accelerating incompressible flow computations with a Pthreads-CUDA implementation on small-footprint multi-GPU platforms","The Journal of Supercomputing","","59","2","10.1007/s11227-010-0468-1","Julien C. ThibaultInanc Senocak","2012","http://link.springer.com/article/10.1007/s11227-010-0468-1","Article"
"Panda: A Compiler Framework for Concurrent CPU
$$+$$
+
GPU Execution of 3D Stencil Computations on GPU-accelerated Supercomputers","International Journal of Parallel Programming","","45","3","10.1007/s10766-016-0454-1","Mohammed SourouriScott B. BadenXing Cai","2017","http://link.springer.com/article/10.1007/s10766-016-0454-1","Article"
"CUDA-Zero: a framework for porting shared memory GPU applications to multi-GPUs","Science China Information Sciences","","55","3","10.1007/s11432-011-4497-z","DeHao ChenWenGuang ChenWeiMin Zheng","2012","http://link.springer.com/article/10.1007/s11432-011-4497-z","Article"
"Optimizing Linpack Benchmark on GPU-Accelerated Petascale Supercomputer","Journal of Computer Science and Technology","","26","5","10.1007/s11390-011-0184-1","Feng WangCan-Qun YangYun-Fei DuJuan ChenHui-Zhan YiWei-Xia Xu","2011","http://link.springer.com/article/10.1007/s11390-011-0184-1","Article"
"Parallel optimization of three-dimensional wedge-shaped underwater acoustic propagation based on MPI+OpenMP hybrid programming model","The Journal of Supercomputing","","77","5","10.1007/s11227-020-03466-w","Zijie ZhuYongxian WangXiaoqian ZhuWei LiuQiang LanWenbin XiaoXinghua Cheng","2021","http://link.springer.com/article/10.1007/s11227-020-03466-w","Article"
"Boosting CUDA Applications with CPU–GPU Hybrid Computing","International Journal of Parallel Programming","","42","2","10.1007/s10766-013-0252-y","Changmin LeeWon Woo RoJean-Luc Gaudiot","2014","http://link.springer.com/article/10.1007/s10766-013-0252-y","Article"
"Resource-efficient utilization of CPU/GPU-based heterogeneous supercomputers for Bayesian phylogenetic inference","The Journal of Supercomputing","","66","1","10.1007/s11227-013-0911-1","Jun ChaiHuayou SuMei WenXing CaiNan WuChunyuan Zhang","2013","http://link.springer.com/article/10.1007/s11227-013-0911-1","Article"
"An efficient parallel collaborative filtering algorithm on multi-GPU platform","The Journal of Supercomputing","","72","6","10.1007/s11227-014-1333-4","Zhongya WangYing LiuSteve Chiu","2016","http://link.springer.com/article/10.1007/s11227-014-1333-4","Article"
"Dual buffer rotation four-stage pipeline for CPU–GPU cooperative computing","Soft Computing","","23","3","10.1007/s00500-017-2795-0","Tao LiQiankun DongYifeng WangXiaoli GongYulu Yang","2019","http://link.springer.com/article/10.1007/s00500-017-2795-0","Article"
"A Comparative Survey of Big Data Computing and HPC: From a Parallel Programming Model to a Cluster Architecture","International Journal of Parallel Programming","","","","10.1007/s10766-021-00717-y","Fei YinFeng Shi","2021","http://link.springer.com/article/10.1007/s10766-021-00717-y","Article"
"GPU-accelerated registration of hyperspectral images using KAZE features","The Journal of Supercomputing","","76","12","10.1007/s11227-020-03214-0","Álvaro OrdóñezFrancisco ArgüelloDora B. HerasBegüm Demir","2020","http://link.springer.com/article/10.1007/s11227-020-03214-0","Article"
"On GPU’s viability as a middleware accelerator","Cluster Computing","","12","2","10.1007/s10586-009-0076-0","Samer Al-KiswanyAbdullah GharaibehElizeu Santos-NetoMatei Ripeanu","2009","http://link.springer.com/article/10.1007/s10586-009-0076-0","Article"
"GPU acceleration of subgraph isomorphism search in large scale graph","Journal of Central South University","","22","6","10.1007/s11771-015-2748-7","Bo Yang 杨博Kai Lu 卢凯Ying-hui Gao 高颖慧Xiao-ping Wang 王小平Kai Xu 徐凯","2015","http://link.springer.com/article/10.1007/s11771-015-2748-7","Article"
"Compiler support for general-purpose computation on GPUs","The Journal of Supercomputing","","50","1","10.1007/s11227-008-0252-7","Yu-Te LinPeng-Sheng Chen","2009","http://link.springer.com/article/10.1007/s11227-008-0252-7","Article"
"CUDA compatible GPU cards as efficient hardware accelerators for Smith-Waterman sequence alignment","BMC Bioinformatics","","9","2","10.1186/1471-2105-9-S2-S10","Svetlin A ManavskiGiorgio Valle","2008","http://link.springer.com/article/10.1186/1471-2105-9-S2-S10","Article"
"Implementation and comparison of binary thinning algorithms on GPU","Computing","","101","8","10.1007/s00607-018-0653-2","Lynda Ben BoudaoudBasel SolaimanAbdelkamel Tari","2019","http://link.springer.com/article/10.1007/s00607-018-0653-2","Article"
"Parallel programing templates for remote sensing image processing on GPU architectures: design and implementation","Computing","","98","1 - 2","10.1007/s00607-014-0392-y","Yan MaLajiao ChenPeng LiuKe Lu","2016","http://link.springer.com/article/10.1007/s00607-014-0392-y","Article"
"Multicore and GPU algorithms for Nussinov RNA folding","BMC Bioinformatics","","15","8","10.1186/1471-2105-15-S8-S1","Junjie LiSanjay RankaSartaj Sahni","2014","http://link.springer.com/article/10.1186/1471-2105-15-S8-S1","Article"
"Efficient GPU-based parallelization of solvation calculation for the blind docking problem","The Journal of Supercomputing","","76","3","10.1007/s11227-019-02834-5","Hocine SaadiNadia Nouali TaboudjematAbdellatif RahmounBaldomero imbernónHoracio Pérez-SánchezJosé M. Cecilia","2020","http://link.springer.com/article/10.1007/s11227-019-02834-5","Article"
"Correlation acceleration in GNSS software receivers using a CUDA-enabled GPU","GPS Solutions","","21","1","10.1007/s10291-016-0516-2","Liangchun XuNesreen I. ZiedanXiaoji NiuWenfei Guo","2017","http://link.springer.com/article/10.1007/s10291-016-0516-2","Article"
"Swarm model checking on the GPU","International Journal on Software Tools for Technology Transfer","","22","5","10.1007/s10009-020-00576-x","Richard DeFranciscoShenghsun ChoMichael FerdmanScott A. Smolka","2020","http://link.springer.com/article/10.1007/s10009-020-00576-x","Article"
"A compound OpenMP/MPI program development toolkit for hybrid CPU/GPU clusters","The Journal of Supercomputing","","66","1","10.1007/s11227-013-0912-0","Hung-Fu LiTyng-Yeu LiangJun-Yao Chiu","2013","http://link.springer.com/article/10.1007/s11227-013-0912-0","Article"
"Accelerating MapReduce framework on multi-GPU systems","Cluster Computing","","17","2","10.1007/s10586-013-0276-5","Hai JiangYi ChenZhi QiaoKuan-Ching LiWonWoo RoJean-Luc Gaudiot","2014","http://link.springer.com/article/10.1007/s10586-013-0276-5","Article"
"On construction of a virtual GPU cluster with InfiniBand and 10 Gb Ethernet virtualization","The Journal of Supercomputing","","74","12","10.1007/s11227-018-2484-5","Chao-Tung YangShuo-Tsung ChenYu-Sheng LoEndah KristianiYu-Wei Chan","2018","http://link.springer.com/article/10.1007/s11227-018-2484-5","Article"
"Techniques of medical image processing and analysis accelerated by high-performance computing: a systematic literature review","Journal of Real-Time Image Processing","","16","6","10.1007/s11554-017-0734-z","Carlos A. S. J. GuloAntonio C. SementilleJoão Manuel R. S. Tavares","2019","http://link.springer.com/article/10.1007/s11554-017-0734-z","Article"
"A survey of graph processing on graphics processing units","The Journal of Supercomputing","","74","5","10.1007/s11227-017-2225-1","Ha-Nguyen TranErik Cambria","2018","http://link.springer.com/article/10.1007/s11227-017-2225-1","Article"
"An study of the effect of process malleability in the energy efficiency on GPU-based clusters","The Journal of Supercomputing","","76","1","10.1007/s11227-019-03034-x","Sergio IserteKrzysztof Rojek","2020","http://link.springer.com/article/10.1007/s11227-019-03034-x","Article"
"Performance-aware composition framework for GPU-based systems","The Journal of Supercomputing","","71","12","10.1007/s11227-014-1105-1","Usman DastgeerChristoph Kessler","2015","http://link.springer.com/article/10.1007/s11227-014-1105-1","Article"
"Novel parallel hybrid genetic algorithms on the GPU for the generalized assignment problem","The Journal of Supercomputing","","78","1","10.1007/s11227-021-03882-6","Huang Zhi-BinFu Guang-TaoDong Dan-YangXiao ChenDing Zhe-LunDai Zhi-Tao","2022","http://link.springer.com/article/10.1007/s11227-021-03882-6","Article"
"Box-counting algorithm on GPU and multi-core CPU: an OpenCL cross-platform study","The Journal of Supercomputing","","65","3","10.1007/s11227-013-0885-z","Jesús JiménezJuan Ruiz de Miras","2013","http://link.springer.com/article/10.1007/s11227-013-0885-z","Article"
"Numerical investigation of supersonic transverse jet interaction on CPU/GPU system","Journal of the Brazilian Society of Mechanical Sciences and Engineering","","42","2","10.1007/s40430-019-2160-6","Jianqi LaiZhengyu TianHang YuHua Li","2020","http://link.springer.com/article/10.1007/s40430-019-2160-6","Article"
"Ignite-GPU: a GPU-enabled in-memory computing architecture on clusters","The Journal of Supercomputing","","77","3","10.1007/s11227-020-03390-z","Amir Hossein SojoodiMajid Salimi BeniFarshad Khunjush","2021","http://link.springer.com/article/10.1007/s11227-020-03390-z","Article"
"MVAPICH2-GPU: optimized GPU to GPU communication for InfiniBand clusters","Computer Science - Research and Development","","26","3 - 4","10.1007/s00450-011-0171-3","Hao WangSreeram PotluriMiao LuoAshish Kumar SinghSayantan SurDhabaleswar K. Panda","2011","http://link.springer.com/article/10.1007/s00450-011-0171-3","Article"
"TH-1: China’s first petaflop supercomputer","Frontiers of Computer Science in China","","4","4","10.1007/s11704-010-0383-x","Xuejun YangXiangke LiaoWeixia XuJunqiang SongQingfeng HuJinshu SuLiquan XiaoKai LuQiang DouJuping JiangCanqun Yang","2010","http://link.springer.com/article/10.1007/s11704-010-0383-x","Article"
"A Halide-based Synergistic Computing Framework for Heterogeneous Systems","Journal of Signal Processing Systems","","91","3 - 4","10.1007/s11265-017-1283-1","Shih-Wei LiaoShao-Yun KuangChia-Lung KaoChia-Heng Tu","2019","http://link.springer.com/article/10.1007/s11265-017-1283-1","Article"
"A GPU-based algorithm for fast node label learning in large and unbalanced biomolecular networks","BMC Bioinformatics","","19","10","10.1186/s12859-018-2301-4","Marco FrascaGiuliano GrossiJessica GliozzoMarco MesitiMarco NotaroPaolo PerlascaAlessandro PetriniGiorgio Valentini","2018","http://link.springer.com/article/10.1186/s12859-018-2301-4","Article"
"The GPU on the simulation of cellular computing models","Soft Computing","","16","2","10.1007/s00500-011-0716-1","José M. CeciliaJosé M. GarcíaGinés D. GuerreroMiguel A. Martínez-del-AmorMario J. Pérez-JiménezManuel Ujaldón","2012","http://link.springer.com/article/10.1007/s00500-011-0716-1","Article"
"SkelCL: a high-level extension of OpenCL for multi-GPU systems","The Journal of Supercomputing","","69","1","10.1007/s11227-014-1213-y","Michel SteuwerSergei Gorlatch","2014","http://link.springer.com/article/10.1007/s11227-014-1213-y","Article"
"GPU-Friendly Parallel Genome Matching with Tiled Access and Reduced State Transition Table","International Journal of Parallel Programming","","41","4","10.1007/s10766-012-0234-5","Yunho OhDoohwan OhWon W. Ro","2013","http://link.springer.com/article/10.1007/s10766-012-0234-5","Article"
"GPU Accelerated Digital Volume Correlation","Experimental Mechanics","","56","2","10.1007/s11340-015-0091-4","T. WangZ. JiangQ. KemaoF. LinS. H. Soon","2016","http://link.springer.com/article/10.1007/s11340-015-0091-4","Article"
"OpenMC: Towards Simplifying Programming for TianHe Supercomputers","Journal of Computer Science and Technology","","29","3","10.1007/s11390-014-1447-4","Xiang-Ke LiaoCan-Qun YungTao TangHui-Zhan YiFeng WangQiang WuJingling Xue","2014","http://link.springer.com/article/10.1007/s11390-014-1447-4","Article"
"Non-rigid Registration for Large Sets of Microscopic Images on Graphics Processors","Journal of Signal Processing Systems","","55","1 - 3","10.1007/s11265-008-0208-4","Antonio RuizManuel UjaldonLee CooperKun Huang","2009","http://link.springer.com/article/10.1007/s11265-008-0208-4","Article"
"PartialRC: A Partial Recomputing Method for Efficient Fault Recovery on GPGPUs","Journal of Computer Science and Technology","","27","2","10.1007/s11390-012-1220-5","Xin-Hai XuXue-Jun YangJing-Ling XueYu-Fei LinYi-Song Lin","2012","http://link.springer.com/article/10.1007/s11390-012-1220-5","Article"
"Comparison of analytical and ML-based models for predicting CPU–GPU data transfer time","Computing","","102","9","10.1007/s00607-019-00780-x","Ali RiahiAbdorreza SavadiMahmoud Naghibzadeh","2020","http://link.springer.com/article/10.1007/s00607-019-00780-x","Article"
"Strategies for maximizing utilization on multi-CPU and multi-GPU heterogeneous architectures","The Journal of Supercomputing","","70","2","10.1007/s11227-014-1200-3","Angeles NavarroAntonio VilchesFrancisco CorberaRafael Asenjo","2014","http://link.springer.com/article/10.1007/s11227-014-1200-3","Article"
"An Efficient GPU-Based Multiple Pattern Matching Algorithm for Packet Filtering","Journal of Signal Processing Systems","","86","2 - 3","10.1007/s11265-016-1139-0","Che-Lun HungChun-Yuan LinPo-Chang Wu","2017","http://link.springer.com/article/10.1007/s11265-016-1139-0","Article"
"Performance analysis of a novel GPU computation-to-core mapping scheme for robust facet image modeling","Journal of Real-Time Image Processing","","10","3","10.1007/s11554-012-0272-7","Seung In ParkYong CaoLayne T. WatsonFrancis Quek","2015","http://link.springer.com/article/10.1007/s11554-012-0272-7","Article"
"Transparent partial page migration between CPU and GPU","Frontiers of Computer Science","","14","3","10.1007/s11704-018-7386-4","Shiqing ZhangZheng QinYaohua YangLi ShenZhiying Wang","2019","http://link.springer.com/article/10.1007/s11704-018-7386-4","Article"
"Cardiac simulation on multi-GPU platform","The Journal of Supercomputing","","59","3","10.1007/s11227-010-0540-x","Venkata Krishna NimmagaddaAli AkogluSalim HaririTalal Moukabary","2012","http://link.springer.com/article/10.1007/s11227-010-0540-x","Article"
"GPU-based parallel computation for structural dynamic response analysis with CUDA","Journal of Mechanical Science and Technology","","28","10","10.1007/s12206-014-0928-2","Dong-Keun KangChang-Wan KimHyun-Ik Yang","2014","http://link.springer.com/article/10.1007/s12206-014-0928-2","Article"
"Hierarchical parallel processing of large scale data clustering on a PC cluster with GPU co-processing","The Journal of Supercomputing","","36","3","10.1007/s11227-006-8294-1","Hiroyuki TakizawaHiroaki Kobayashi","2006","http://link.springer.com/article/10.1007/s11227-006-8294-1","Article"
"Implementation of GPU virtualization using PCI pass-through mechanism","The Journal of Supercomputing","","68","1","10.1007/s11227-013-1034-4","Chao-Tung YangJung-Chun LiuHsien-Yi WangChing-Hsien Hsu","2014","http://link.springer.com/article/10.1007/s11227-013-1034-4","Article"
"cuGimli: optimized implementation of the Gimli authenticated encryption and hash function on GPU for IoT applications","Cluster Computing","","25","1","10.1007/s10586-021-03415-z","KyungHyun HanWai-Kong LeeSeong Oun Hwang","2022","http://link.springer.com/article/10.1007/s10586-021-03415-z","Article"
"A high-performance and energy-efficient exhaustive key search approach via GPU on DES-like cryptosystems","The Journal of Supercomputing","","74","1","10.1007/s11227-017-2120-9","Armin AhmadzadehOmid HajihassaniSaeid Gorgin","2018","http://link.springer.com/article/10.1007/s11227-017-2120-9","Article"
"Fast implementation of block ciphers and PRNGs in Maxwell GPU architecture","Cluster Computing","","19","1","10.1007/s10586-016-0536-2","Wai-Kong LeeHon-Sang CheongRaphael C.-W. PhanBok-Min Goi","2016","http://link.springer.com/article/10.1007/s10586-016-0536-2","Article"
"MPtostream: an OpenMP compiler for CPU-GPU heterogeneous parallel systems","Science China Information Sciences","","55","9","10.1007/s11432-011-4342-4","XueJun YangTao TangGuiBin WangJia JiaXinHai Xu","2012","http://link.springer.com/article/10.1007/s11432-011-4342-4","Article"
"Toward a software transactional memory for heterogeneous CPU–GPU processors","The Journal of Supercomputing","","75","8","10.1007/s11227-018-2347-0","Alejandro VillegasAngeles NavarroRafael AsenjoOscar Plata","2019","http://link.springer.com/article/10.1007/s11227-018-2347-0","Article"
"Performance of CPU/GPU compiler directives on ISO/TTI kernels","Computing","","96","12","10.1007/s00607-013-0367-4","Sayan GhoshTerrence LiaoHenri CalandraBarbara M. Chapman","2014","http://link.springer.com/article/10.1007/s00607-013-0367-4","Article"
"Accelerating Data Analytics on Integrated GPU Platforms via Runtime Specialization","International Journal of Parallel Programming","","46","2","10.1007/s10766-016-0482-x","Naila FarooquiIndrajit RoyYuan ChenVanish TalwarRajkishore BarikBrian LewisTatiana ShpeismanKarsten Schwan","2018","http://link.springer.com/article/10.1007/s10766-016-0482-x","Article"
"Transform coding on programmable stream processors","The Journal of Supercomputing","","45","1","10.1007/s11227-008-0192-2","Haiyan LiChunyuan ZhangLi LiJu Ren","2008","http://link.springer.com/article/10.1007/s11227-008-0192-2","Article"
"Highly Parallelable Bidimensional Median Filter for Modern Parallel Programming Models","Journal of Signal Processing Systems","","71","3","10.1007/s11265-012-0715-1","Ricardo M. SánchezPaul A. Rodríguez","2013","http://link.springer.com/article/10.1007/s11265-012-0715-1","Article"
"GPU-based image method for room impulse response calculation","Multimedia Tools and Applications","","75","9","10.1007/s11042-015-2943-4","Zhong-hua FuJian-wei Li","2016","http://link.springer.com/article/10.1007/s11042-015-2943-4","Article"
"An analytical GPU performance model for 3D stencil computations from the angle of data traffic","The Journal of Supercomputing","","71","7","10.1007/s11227-015-1392-1","Huayou SuXing CaiMei WenChunyuan Zhang","2015","http://link.springer.com/article/10.1007/s11227-015-1392-1","Article"
"Design and evaluation of multi-GPU enabled Multiple Symbol Detection algorithm","The Journal of Supercomputing","","72","6","10.1007/s11227-015-1475-z","Ying LiuHaixin ZhengRenliang ZhaoLiheng Jian","2016","http://link.springer.com/article/10.1007/s11227-015-1475-z","Article"
"GPU-Accelerated Simulation of Massive Spatial Data Based on the Modified Planar Rotator Model","Mathematical Geosciences","","52","1","10.1007/s11004-019-09835-3","Milan ŽukovičMichal BorovskýMatúš LachDionissios T. Hristopulos","2020","http://link.springer.com/article/10.1007/s11004-019-09835-3","Article"
"CUDASW++ 3.0: accelerating Smith-Waterman protein database search by coupling CPU and GPU SIMD instructions","BMC Bioinformatics","","14","1","10.1186/1471-2105-14-117","Yongchao LiuAdrianto WirawanBertil Schmidt","2013","http://link.springer.com/article/10.1186/1471-2105-14-117","Article"
"DOPA: GPU-based protein alignment using database and memory access optimizations","BMC Research Notes","","4","1","10.1186/1756-0500-4-261","Laiq HasanMarijn KentieZaid Al-Ars","2011","http://link.springer.com/article/10.1186/1756-0500-4-261","Article"
"GPU implementations of a relaxation scheme for image partitioning: GLSL versus CUDA","Computing and Visualization in Science","","14","5","10.1007/s00791-012-0176-x","Tetyana IvanovskaLars LinsenHorst K. HahnHenry Völzke","2011","http://link.springer.com/article/10.1007/s00791-012-0176-x","Article"
"Addressing Memory and Speed Problems in Nondestructive Defect Characterization: Element-by-Element Processing on a GPU","Journal of Nondestructive Evaluation","","34","2","10.1007/s10921-015-0282-z","S. SivasuthanV. U. KarthikA. RahunanthanP. JayakumarR. S. ThyagarajanLalita UdpaS. R. H. Hoole","2015","http://link.springer.com/article/10.1007/s10921-015-0282-z","Article"
"GPU-accelerated computing for Lagrangian coherent structures of multi-body gravitational regimes","Astrophysics and Space Science","","362","4","10.1007/s10509-017-3050-y","Mingpei LinMing XuXiaoyu Fu","2017","http://link.springer.com/article/10.1007/s10509-017-3050-y","Article"
"Addressing GPU On-Chip Shared Memory Bank Conflicts Using Elastic Pipeline","International Journal of Parallel Programming","","41","3","10.1007/s10766-012-0201-1","Chunyang GouGeorgi N. Gaydadjiev","2013","http://link.springer.com/article/10.1007/s10766-012-0201-1","Article"
"Classification and disease probability prediction via machine learning programming based on multi-GPU cluster MapReduce system","The Journal of Supercomputing","","73","5","10.1007/s11227-016-1883-8","Jinjing LiQingkui ChenBocheng Liu","2017","http://link.springer.com/article/10.1007/s11227-016-1883-8","Article"
"A Generic Paradigm for Accelerating Laplacian-Based Mesh Smoothing on the GPU","Arabian Journal for Science and Engineering","","39","11","10.1007/s13369-014-1406-y","Gang MeiJohn C. TipperNengxiong Xu","2014","http://link.springer.com/article/10.1007/s13369-014-1406-y","Article"
"Scaling up MapReduce-based Big Data Processing on Multi-GPU systems","Cluster Computing","","18","1","10.1007/s10586-014-0400-1","Hai JiangYi ChenZhi QiaoTien-Hsiung WengKuan-Ching Li","2015","http://link.springer.com/article/10.1007/s10586-014-0400-1","Article"
"GPU acceleration of Fitch’s parsimony on protein data: from Kepler to Turing","The Journal of Supercomputing","","76","12","10.1007/s11227-020-03225-x","Sergio Santander-JiménezMiguel A. Vega-RodríguezAntonio Zahinos-MárquezLeonel Sousa","2020","http://link.springer.com/article/10.1007/s11227-020-03225-x","Article"
"A Comparative Study and Evaluation of Parallel Programming Models for Shared-Memory Parallel Architectures","New Generation Computing","","31","3","10.1007/s00354-013-0301-5","Luis Miguel SanchezJavier FernandezRafael SotomayorSoledad EscolarJ. Daniel. Garcia","2013","http://link.springer.com/article/10.1007/s00354-013-0301-5","Article"
"Leveraging HPC accelerator architectures with modern techniques — hydrologic modeling on GPUs with ParFlow","Computational Geosciences","","25","5","10.1007/s10596-021-10051-4","Jaro HokkanenStefan KolletJiri KrausAndreas HertenMarkus HrywniakDirk Pleiter","2021","http://link.springer.com/article/10.1007/s10596-021-10051-4","Article"
"Programming for scientific computing on peta-scale heterogeneous parallel systems","Journal of Central South University","","20","5","10.1007/s11771-013-1602-z","Can-qun Yang 杨灿群Qiang Wu 吴强Tao Tang 唐滔Feng Wang 王锋Jing-ling Xue 薛京灵","2013","http://link.springer.com/article/10.1007/s11771-013-1602-z","Article"
"GPU-based leaves contour generation algorithm","Journal of Shanghai University (English Edition)","","15","5","10.1007/s11741-011-0754-3","Jing-qiao Zhang 张景峤Ting-ting Wang 王廷婷","2011","http://link.springer.com/article/10.1007/s11741-011-0754-3","Article"
"Approximate similarity search for online multimedia services on distributed CPU–GPU platforms","The VLDB Journal","","23","3","10.1007/s00778-013-0329-7","George TeodoroEduardo ValleNathan MarianoRicardo TorresWagner Meira JrJoel H. Saltz","2014","http://link.springer.com/article/10.1007/s00778-013-0329-7","Article"
"GPU-based efficient join algorithms on Hadoop","The Journal of Supercomputing","","77","1","10.1007/s11227-020-03262-6","Hongzhi WangNing LiZheng WangJianing Li","2021","http://link.springer.com/article/10.1007/s11227-020-03262-6","Article"
"Fast kNN query processing over a multi-node GPU environment","The Journal of Supercomputing","","","","10.1007/s11227-021-03975-2","Ricardo J. BarrientosJavier A. RiquelmeRuber Hernández-GarcíaCristóbal A. NavarroWladimir Soto-Silva","2021","http://link.springer.com/article/10.1007/s11227-021-03975-2","Article"
"Stencil computations on heterogeneous platforms for the Jacobi method: GPUs versus Cell BE","The Journal of Supercomputing","","62","2","10.1007/s11227-012-0749-y","José M. CeciliaJosé L. AbellánJuan FernándezManuel E. AcacioJosé M. GarcíaManuel Ujaldón","2012","http://link.springer.com/article/10.1007/s11227-012-0749-y","Article"
"Optimizing dataflow applications on heterogeneous environments","Cluster Computing","","15","2","10.1007/s10586-010-0151-6","George TeodoroTimothy D. R. HartleyUmit V. CatalyurekRenato Ferreira","2012","http://link.springer.com/article/10.1007/s10586-010-0151-6","Article"
"Introducing and Implementing the Allpairs Skeleton for Programming Multi-GPU Systems","International Journal of Parallel Programming","","42","4","10.1007/s10766-013-0265-6","Michel SteuwerMalte FrieseSebastian AlbersSergei Gorlatch","2014","http://link.springer.com/article/10.1007/s10766-013-0265-6","Article"
"Implementation of a High Throughput 3GPP Turbo Decoder on GPU","Journal of Signal Processing Systems","","65","2","10.1007/s11265-011-0617-7","Michael WuYang SunGuohui WangJoseph R. Cavallaro","2011","http://link.springer.com/article/10.1007/s11265-011-0617-7","Article"
"A real-time implementation of SIFT using GPU","Journal of Real-Time Image Processing","","14","2","10.1007/s11554-014-0446-6","K. Aniruddha AcharyaR. Venkatesh BabuSathish S. Vadhiyar","2018","http://link.springer.com/article/10.1007/s11554-014-0446-6","Article"
"Optimizing tensor contraction expressions for hybrid CPU-GPU execution","Cluster Computing","","16","1","10.1007/s10586-011-0179-2","Wenjing MaSriram KrishnamoorthyOreste VillaKarol KowalskiGagan Agrawal","2013","http://link.springer.com/article/10.1007/s10586-011-0179-2","Article"
"Accelerated parametric chamfer alignment using a parallel, pipelined GPU realization","Journal of Real-Time Image Processing","","16","5","10.1007/s11554-017-0668-5","Ahmed ElliethyGaurav Sharma","2019","http://link.springer.com/article/10.1007/s11554-017-0668-5","Article"
"Reveal training performance mystery between TensorFlow and PyTorch in the single GPU environment","Science China Information Sciences","","65","1","10.1007/s11432-020-3182-1","Hulin DaiXuan PengXuanhua ShiLigang HeQian XiongHai Jin","2021","http://link.springer.com/article/10.1007/s11432-020-3182-1","Article"
"GPU computing in discrete optimization. Part I: Introduction to the GPU","EURO Journal on Transportation and Logistics","","2","1 - 2","10.1007/s13676-013-0025-1","André R. BrodtkorbTrond R. HagenChristian SchulzGeir Hasle","2013","http://link.springer.com/article/10.1007/s13676-013-0025-1","Article"
"Accelerating geospatial analysis on GPUs using CUDA","Journal of Zhejiang University SCIENCE C","","12","12","10.1631/jzus.C1100051","Ying-jie XiaLi KuangXiu-mei Li","2011","http://link.springer.com/article/10.1631/jzus.C1100051","Article"
"Multi-device Controllers: A Library to Simplify Parallel Heterogeneous Programming","International Journal of Parallel Programming","","47","1","10.1007/s10766-017-0542-x","Ana Moreton-FernandezArturo Gonzalez-EscribanoDiego R. Llanos","2019","http://link.springer.com/article/10.1007/s10766-017-0542-x","Article"
"Simulation of bevel gear cutting with GPGPUs—performance and productivity","Computer Science - Research and Development","","26","3 - 4","10.1007/s00450-011-0158-0","Sandra WienkeDmytro PlotnikovDieter an MeyChristian BischofArio HardjosuwitoChristof GorgelsChristian Brecher","2011","http://link.springer.com/article/10.1007/s00450-011-0158-0","Article"
"A parallel solving method for block-tridiagonal equations on CPU–GPU heterogeneous computing systems","The Journal of Supercomputing","","73","5","10.1007/s11227-016-1881-x","Wangdong YangKenli LiKeqin Li","2017","http://link.springer.com/article/10.1007/s11227-016-1881-x","Article"
"GMMA: GPU-based multiobjective memetic algorithms for vehicle routing problem with route balancing","Applied Intelligence","","49","1","10.1007/s10489-018-1210-6","Zizhen ZhangYuyan SunHong XieYi TengJiahai Wang","2019","http://link.springer.com/article/10.1007/s10489-018-1210-6","Article"
"A GPU-oriented online recommendation algorithm for efficient processing of time-varying continuous data streams","Knowledge and Information Systems","","53","3","10.1007/s10115-016-0967-3","Chandima HewaNadungodageYuni XiaJohn Jaehwan Lee","2017","http://link.springer.com/article/10.1007/s10115-016-0967-3","Article"
"Static detection of uncoalesced accesses in GPU programs","Formal Methods in System Design","","","","10.1007/s10703-021-00362-8","Rajeev AlurJoseph DeviettiOmar S. Navarro LeijaNimit Singhania","2021","http://link.springer.com/article/10.1007/s10703-021-00362-8","Article"
"Efficient parallel algorithm for computing rough set approximation on GPU","Soft Computing","","22","22","10.1007/s00500-018-3050-z","Si-Yuan JingGong-Liang LiKai ZengWei PanCai-Ming Liu","2018","http://link.springer.com/article/10.1007/s00500-018-3050-z","Article"
"Accelerating the discontinuous Galerkin method for seismic wave propagation simulations using multiple GPUs with CUDA and MPI","Earthquake Science","","26","6","10.1007/s11589-013-0047-7","Dawei MuPo ChenLiqiang Wang","2013","http://link.springer.com/article/10.1007/s11589-013-0047-7","Article"
"Efficient graph computation on hybrid CPU and GPU systems","The Journal of Supercomputing","","71","4","10.1007/s11227-015-1378-z","Tao ZhangJingjie ZhangWei ShuMin-You WuXiaoyao Liang","2015","http://link.springer.com/article/10.1007/s11227-015-1378-z","Article"
"Real-time patch-based medical image modality propagation by GPU computing","Journal of Real-Time Image Processing","","13","1","10.1007/s11554-016-0568-0","Eduardo AlcaínAngel Torrado-CarvajalAntonio S. MontemayorNorberto Malpica","2017","http://link.springer.com/article/10.1007/s11554-016-0568-0","Article"
"Parallel implementation of 3D protein structure similarity searches using a GPU and the CUDA","Journal of Molecular Modeling","","20","2","10.1007/s00894-014-2067-1","Dariusz MrozekMiłosz BrożekBożena Małysiak-Mrozek","2014","http://link.springer.com/article/10.1007/s00894-014-2067-1","Article"
"Implementation of the moving particle semi-implicit method on GPU","Science China Physics, Mechanics and Astronomy","","54","3","10.1007/s11433-010-4241-5","XiaoSong ZhuLiang ChengLin LuBin Teng","2011","http://link.springer.com/article/10.1007/s11433-010-4241-5","Article"
"Evaluating application performance and energy consumption on hybrid CPU+GPU architecture","Cluster Computing","","16","3","10.1007/s10586-012-0219-6","Edson Luiz PadoinLaércio Lima PillaFrancieli Zanon BoitoRodrigo Virote KassickPedro VelhoPhilippe O. A. Navaux","2013","http://link.springer.com/article/10.1007/s10586-012-0219-6","Article"
"Optimization and acceleration of flow simulations for CFD on CPU/GPU architecture","Journal of the Brazilian Society of Mechanical Sciences and Engineering","","41","7","10.1007/s40430-019-1793-9","Jiang LeiDa-li LiYun-long ZhouWei Liu","2019","http://link.springer.com/article/10.1007/s40430-019-1793-9","Article"
"ADEPT: a domain independent sequence alignment strategy for gpu architectures","BMC Bioinformatics","","21","1","10.1186/s12859-020-03720-1","Muaaz G. AwanJack DeslippeAydin BulucOguz SelvitopiSteven HofmeyrLeonid OlikerKatherine Yelick","2020","http://link.springer.com/article/10.1186/s12859-020-03720-1","Article"
"GPU Based N-Gram String Matching Algorithm with Score Table Approach for String Searching in Many Documents","Journal of The Institution of Engineers (India): Series B","","98","5","10.1007/s40031-017-0295-3","K. G. SrinivasaB. N. Shree Devi","2017","http://link.springer.com/article/10.1007/s40031-017-0295-3","Article"
"A GPU implementation of a hybrid evolutionary algorithm: GPuEGO","The Journal of Supercomputing","","70","2","10.1007/s11227-014-1136-7","J. M. García-MartínezE. M. GarzónP. M. Ortigosa","2014","http://link.springer.com/article/10.1007/s11227-014-1136-7","Article"
"NMF-mGPU: non-negative matrix factorization on multi-GPU systems","BMC Bioinformatics","","16","1","10.1186/s12859-015-0485-4","Edgardo Mejía-RoaDaniel Tabas-MadridJavier SetoainCarlos GarcíaFrancisco TiradoAlberto Pascual-Montano","2015","http://link.springer.com/article/10.1186/s12859-015-0485-4","Article"
"A Parallel Algorithm for UAV Flight Route Planning on GPU","International Journal of Parallel Programming","","39","6","10.1007/s10766-011-0171-8","Seçkin SancıVeysi İşler","2011","http://link.springer.com/article/10.1007/s10766-011-0171-8","Article"
"Accelerating data gravitation-based classification using GPU","The Journal of Supercomputing","","75","6","10.1007/s11227-018-2253-5","Lizhi PengHaibo ZhangHoucine HassanYuehui ChenBo Yang","2019","http://link.springer.com/article/10.1007/s11227-018-2253-5","Article"
"CMSA: a heterogeneous CPU/GPU computing system for multiple similar RNA/DNA sequence alignment","BMC Bioinformatics","","18","1","10.1186/s12859-017-1725-6","Xi ChenChen WangShanjiang TangCe YuQuan Zou","2017","http://link.springer.com/article/10.1186/s12859-017-1725-6","Article"
"Accelerating the problem of microrheology in colloidal systems on a GPU","The Journal of Supercomputing","","73","1","10.1007/s11227-016-1867-8","G. OrtegaA. M. PuertasE. M. Garzón","2017","http://link.springer.com/article/10.1007/s11227-016-1867-8","Article"
"Offloading data encryption to GPU in database systems","The Journal of Supercomputing","","69","1","10.1007/s11227-014-1159-0","Heeseung JoSeung-Tae HongJae-Woo ChangDong Hoon Choi","2014","http://link.springer.com/article/10.1007/s11227-014-1159-0","Article"
"Accelerating electron tomography reconstruction algorithm ICON with GPU","Biophysics Reports","","3","1 - 3","10.1007/s41048-017-0041-z","Yu ChenZihao WangJingrong ZhangLun LiXiaohua WanFei SunFa Zhang","2017","http://link.springer.com/article/10.1007/s41048-017-0041-z","Article"
"GPU-based exhaustive algorithms processing kNN queries","The Journal of Supercomputing","","73","10","10.1007/s11227-017-2110-y","Ricardo J. BarrientosFabricio MillaguirJosé L. SánchezEnrique Arias","2017","http://link.springer.com/article/10.1007/s11227-017-2110-y","Article"
"GPU parallel strategy for parameterized LSM-based topology optimization using isogeometric analysis","Structural and Multidisciplinary Optimization","","56","2","10.1007/s00158-017-1672-x","Zhaohui XiaYingjun WangQifu WangChao Mei","2017","http://link.springer.com/article/10.1007/s00158-017-1672-x","Article"
"Physically based visual simulation of the Lattice Boltzmann method on the GPU: a survey","The Journal of Supercomputing","","74","7","10.1007/s11227-018-2392-8","Octavio Navarro-HinojosaSergio Ruiz-LozaMoisés Alencastre-Miranda","2018","http://link.springer.com/article/10.1007/s11227-018-2392-8","Article"
"A review of CUDA optimization techniques and tools for structured grid computing","Computing","","102","4","10.1007/s00607-019-00744-1","Mayez A. Al-MouhamedAyaz H. KhanNazeeruddin Mohammad","2020","http://link.springer.com/article/10.1007/s00607-019-00744-1","Article"
"Scalable CAIM discretization on multiple GPUs using concurrent kernels","The Journal of Supercomputing","","69","1","10.1007/s11227-014-1151-8","Alberto CanoSebastián VenturaKrzysztof J. Cios","2014","http://link.springer.com/article/10.1007/s11227-014-1151-8","Article"
"Understanding co-run performance on CPU-GPU integrated processors: observations, insights, directions","Frontiers of Computer Science","","11","1","10.1007/s11704-016-5468-8","Qi ZhuBo WuXipeng ShenKai ShenLi ShenZhiying Wang","2017","http://link.springer.com/article/10.1007/s11704-016-5468-8","Article"
"High-Level Programming for Many-Cores Using C++14 and the STL","International Journal of Parallel Programming","","46","1","10.1007/s10766-017-0497-y","Michael HaidlSergei Gorlatch","2018","http://link.springer.com/article/10.1007/s10766-017-0497-y","Article"
"RT-CUDA: A Software Tool for CUDA Code Restructuring","International Journal of Parallel Programming","","45","3","10.1007/s10766-016-0433-6","Ayaz H. KhanMayez Al-MouhamedMuhammed Al-MulhemAdel F. Ahmed","2017","http://link.springer.com/article/10.1007/s10766-016-0433-6","Article"
"Parallel data mining techniques on Graphics Processing Unit with Compute Unified Device Architecture (CUDA)","The Journal of Supercomputing","","64","3","10.1007/s11227-011-0672-7","Liheng JianCheng WangYing LiuShenshen LiangWeidong YiYong Shi","2013","http://link.springer.com/article/10.1007/s11227-011-0672-7","Article"
"Locality-Aware Automatic Parallelization for GPGPU with OpenHMPP Directives","International Journal of Parallel Programming","","44","3","10.1007/s10766-015-0362-9","José M. AndiónManuel ArenazFrançois BodinGabriel RodríguezJuan Touriño","2016","http://link.springer.com/article/10.1007/s10766-015-0362-9","Article"
"GPUs-RRTMG_LW: high-efficient and scalable computing for a longwave radiative transfer model on multiple GPUs","The Journal of Supercomputing","","77","5","10.1007/s11227-020-03451-3","Yuzhu WangMingxin GuoYuan ZhaoJinrong Jiang","2021","http://link.springer.com/article/10.1007/s11227-020-03451-3","Article"
"SEIP: System for Efficient Image Processing on Distributed Platform","Journal of Computer Science and Technology","","30","6","10.1007/s11390-015-1595-1","Tao LiuYi LiuQin LiXiang-Rong WangFei GaoYan-Chao ZhuDe-Pei Qian","2015","http://link.springer.com/article/10.1007/s11390-015-1595-1","Article"
"Guest Editorial for Programming Models and Algorithms for Data Analysis in HPC Systems","International Journal of Parallel Programming","","46","3","10.1007/s10766-017-0531-0","Salvatore CuomoMarco AldinucciMassimo Torquati","2018","http://link.springer.com/article/10.1007/s10766-017-0531-0","Article"
"Automatic CPU/GPU Generation of Multi-versioned OpenCL Kernels for C++ Scientific Applications","International Journal of Parallel Programming","","45","2","10.1007/s10766-016-0425-6","Rafael SotomayorLuis Miguel SanchezJavier Garcia BlasJavier FernandezJ. Daniel Garcia","2017","http://link.springer.com/article/10.1007/s10766-016-0425-6","Article"
"A fast GPU-based hybrid algorithm for addition chains","Cluster Computing","","21","4","10.1007/s10586-018-2840-5","Hatem M. BahigKhaled A. AbdElbari","2018","http://link.springer.com/article/10.1007/s10586-018-2840-5","Article"
"Hydrodynamic modeling of flash flood in mountain watersheds based on high-performance GPU computing","Natural Hazards","","91","2","10.1007/s11069-017-3141-7","Xiaozhang HuLixiang Song","2018","http://link.springer.com/article/10.1007/s11069-017-3141-7","Article"
"GPU-based parallel Shadow Features generation at neural system for improving gait human activity recognition","Multimedia Tools and Applications","","80","8","10.1007/s11042-020-10274-0","Ricardo BritoRobert P. Biuk-AghaiSimon Fong","2021","http://link.springer.com/article/10.1007/s11042-020-10274-0","Article"
"Parallel SUMIS soft detector for large MIMO systems on multicore and GPU","The Journal of Supercomputing","","75","3","10.1007/s11227-018-2403-9","Carla RamiroM. Ángeles SimarroAlberto GonzalezAntonio M. Vidal","2019","http://link.springer.com/article/10.1007/s11227-018-2403-9","Article"
"CUDAMPF: a multi-tiered parallel framework for accelerating protein sequence search in HMMER on CUDA-enabled GPU","BMC Bioinformatics","","17","1","10.1186/s12859-016-0946-4","Hanyu JiangNarayan Ganesan","2016","http://link.springer.com/article/10.1186/s12859-016-0946-4","Article"
"GPU acceleration of a 2D compressible Euler solver on CUDA-based block-structured Cartesian meshes","Journal of the Brazilian Society of Mechanical Sciences and Engineering","","42","5","10.1007/s40430-020-02290-w","Feng WeiLiang JinJun LiuFeng DingXinping Zheng","2020","http://link.springer.com/article/10.1007/s40430-020-02290-w","Article"
"Implementation of a High Throughput Soft MIMO Detector on GPU","Journal of Signal Processing Systems","","64","1","10.1007/s11265-010-0523-4","Michael WuYang SunSiddharth GuptaJoseph R. Cavallaro","2011","http://link.springer.com/article/10.1007/s11265-010-0523-4","Article"
"A GPU implementation of a structural-similarity-based aerial-image classification","The Journal of Supercomputing","","65","2","10.1007/s11227-013-0875-1","Rok ČešnovarVladimir RisojevićZdenka BabićTomaž DobravecPatricio Bulić","2013","http://link.springer.com/article/10.1007/s11227-013-0875-1","Article"
"Adaptive Optimization
$$l_1$$
l
1
-Minimization Solvers on GPU","International Journal of Parallel Programming","","45","3","10.1007/s10766-016-0430-9","Jiaquan GaoZejie LiRonghua LiangGuixia He","2017","http://link.springer.com/article/10.1007/s10766-016-0430-9","Article"
"A fast Hough Transform algorithm for straight lines detection in an image using GPU parallel computing with CUDA-C","The Journal of Supercomputing","","73","11","10.1007/s11227-017-2051-5","R. Yam-UicabJ. L. Lopez-MartinezJ. A. Trejo-SanchezH. Hidalgo-SilvaS. Gonzalez-Segura","2017","http://link.springer.com/article/10.1007/s11227-017-2051-5","Article"
"GPU-accelerated level-set segmentation","Journal of Real-Time Image Processing","","12","1","10.1007/s11554-013-0378-6","Julián Lamas-RodríguezDora B. HerasFrancisco ArgüelloDagmar KainmuellerStefan ZachowMontserrat Bóo","2016","http://link.springer.com/article/10.1007/s11554-013-0378-6","Article"
"Complex shading efficiently for ray tracing on GPU","Multimedia Tools and Applications","","74","3","10.1007/s11042-013-1712-5","Xin YangDuan-qing XuLei ZhaoBing Yang","2015","http://link.springer.com/article/10.1007/s11042-013-1712-5","Article"
"GPU-accelerated computing of three-dimensional solar wind background","Science China Earth Sciences","","56","11","10.1007/s11430-013-4661-y","XueShang FengDingKun ZhongChangQing XiangYao Zhang","2013","http://link.springer.com/article/10.1007/s11430-013-4661-y","Article"
"An efficient parallel entropy coding method for JPEG compression based on GPU","The Journal of Supercomputing","","","","10.1007/s11227-021-03971-6","Fushun ZhuHua Yan","2021","http://link.springer.com/article/10.1007/s11227-021-03971-6","Article"
"Matrix-free GPU implementation of a preconditioned conjugate gradient solver for anisotropic elliptic PDEs","Computing and Visualization in Science","","16","2","10.1007/s00791-014-0223-x","Eike MüllerXu GuoRobert ScheichlSinan Shi","2013","http://link.springer.com/article/10.1007/s00791-014-0223-x","Article"
"GPU-based MapReduce for large-scale near-duplicate video retrieval","Multimedia Tools and Applications","","74","23","10.1007/s11042-014-2185-x","Hanli WangFengkuangtian ZhuBo XiaoLei WangYu-Gang Jiang","2015","http://link.springer.com/article/10.1007/s11042-014-2185-x","Article"
"Gene regulatory networks inference using a multi-GPU exhaustive search algorithm","BMC Bioinformatics","","14","18","10.1186/1471-2105-14-S18-S5","Fabrizio F BorelliRaphael Y de CamargoDavid C Martins JrLuiz CS Rozante","2013","http://link.springer.com/article/10.1186/1471-2105-14-S18-S5","Article"
"Evolutionary induction of a decision tree for large-scale data: a GPU-based approach","Soft Computing","","21","24","10.1007/s00500-016-2280-1","Krzysztof JurczukMarcin CzajkowskiMarek Kretowski","2017","http://link.springer.com/article/10.1007/s00500-016-2280-1","Article"
"Adapting hierarchical bidirectional inter prediction on a GPU-based platform for 2D and 3D H.264 video coding","EURASIP Journal on Advances in Signal Processing","","2013","1","10.1186/1687-6180-2013-67","Rafael Rodríguez-SánchezJosé Luis MartínezJan De CockGerardo Fernández–EscribanoBart PietersJosé L SánchezJosé M ClaverRik Van de Walle","2013","http://link.springer.com/article/10.1186/1687-6180-2013-67","Article"
"HFPaC: GPU friendly height field parallel compression","GeoInformatica","","17","1","10.1007/s10707-012-0171-x","Đorđe M. ĐurđevićIgor I. Tartalja","2013","http://link.springer.com/article/10.1007/s10707-012-0171-x","Article"
"GPU-based segmentation of retinal blood vessels","Journal of Real-Time Image Processing","","14","4","10.1007/s11554-014-0469-z","Francisco ArgüelloDavid L. VilariñoDora B. HerasAlejandro Nieto","2018","http://link.springer.com/article/10.1007/s11554-014-0469-z","Article"
"GPU accelerated manifold correction method for spinning compact binaries","Astrophysics and Space Science","","363","4","10.1007/s10509-018-3265-6","Chong-xi RanSong LiuShuang-ying Zhong","2018","http://link.springer.com/article/10.1007/s10509-018-3265-6","Article"
"CGMBE: a model-based tool for the design and implementation of real-time image processing applications on CPU–GPU platforms","Journal of Real-Time Image Processing","","18","3","10.1007/s11554-020-00994-9","Jiahao WuJing XieAlexandre BardakoffTimothy BlattnerWalid KeyrouzShuvra S. Bhattacharyya","2021","http://link.springer.com/article/10.1007/s11554-020-00994-9","Article"
"Improving GPU-accelerated adaptive IDW interpolation algorithm using fast kNN search","SpringerPlus","","5","1","10.1186/s40064-016-3035-2","Gang MeiNengxiong XuLiangliang Xu","2016","http://link.springer.com/article/10.1186/s40064-016-3035-2","Article"
"GPU accelerated novel particle filtering method","Computing","","96","8","10.1007/s00607-014-0400-2","Subhra Kanti DasChandan MazumdarKumardeb Banerjee","2014","http://link.springer.com/article/10.1007/s00607-014-0400-2","Article"
"Global optimization model on power efficiency of GPU and multicore processing element for SIMD computing with CUDA","Computer Science - Research and Development","","27","4","10.1007/s00450-011-0197-6","Da-Qi RenReiji Suda","2012","http://link.springer.com/article/10.1007/s00450-011-0197-6","Article"
"Efficient adaptive load balancing approach for compressive background subtraction algorithm on heterogeneous CPU–GPU platforms","Journal of Real-Time Image Processing","","17","5","10.1007/s11554-019-00916-4","Lhoussein MabroukSylvain HuetDominique HouzetSaid BelkouchAbdelkrim HamzaouiYahya Zennayi","2020","http://link.springer.com/article/10.1007/s11554-019-00916-4","Article"
"GPU implementation of Jacobi Method and Gauss-Seidel Method for Data Arrays that Exceed GPU-dedicated Memory Size","Journal of Mathematical Modelling and Algorithms in Operations Research","","14","4","10.1007/s10852-015-9272-5","Aleksandr KochurovDimitrii Golovashkin","2015","http://link.springer.com/article/10.1007/s10852-015-9272-5","Article"
"CLUS_GPU-BLASTP: accelerated protein sequence alignment using GPU-enabled cluster","The Journal of Supercomputing","","73","10","10.1007/s11227-017-2036-4","Sita RaniO. P. Gupta","2017","http://link.springer.com/article/10.1007/s11227-017-2036-4","Article"
"Fault Table Computation on GPUs","Journal of Electronic Testing","","26","2","10.1007/s10836-010-5147-x","Kanupriya GulatiSunil P. Khatri","2010","http://link.springer.com/article/10.1007/s10836-010-5147-x","Article"
"MPFFT: An Auto-Tuning FFT Library for OpenCL GPUs","Journal of Computer Science and Technology","","28","1","10.1007/s11390-013-1314-8","Yan LiYun-Quan ZhangYi-Qun LiuGuo-Ping LongHai-Peng Jia","2013","http://link.springer.com/article/10.1007/s11390-013-1314-8","Article"
"High-speed TCP flow record extraction using GPUs","The Journal of Supercomputing","","71","10","10.1007/s11227-015-1478-9","Paula RoqueroJavier RamosVictor MorenoIván GonzálezJavier Aracil","2015","http://link.springer.com/article/10.1007/s11227-015-1478-9","Article"
"Performance evaluation of a 3D multi-view-based particle filter for visual object tracking using GPUs and multicore CPUs","Journal of Real-Time Image Processing","","15","2","10.1007/s11554-014-0483-1","David ConchaRaúl CabidoJuan José PantrigoAntonio S. Montemayor","2018","http://link.springer.com/article/10.1007/s11554-014-0483-1","Article"
"Fast computer simulation of reconstructed image from rainbow hologram based on GPU","Optical Review","","22","5","10.1007/s10043-015-0102-9","Jiao ShumingHiroshi Yoshikawa","2015","http://link.springer.com/article/10.1007/s10043-015-0102-9","Article"
"Approaches of enhancing interoperations among high performance computing and big data analytics via augmentation","Cluster Computing","","23","2","10.1007/s10586-019-02960-y","Ajeet Ram PathakManjusha PandeySiddharth S. Rautaray","2020","http://link.springer.com/article/10.1007/s10586-019-02960-y","Article"
"Parallel implementation of a spatio-temporal visual saliency model","Journal of Real-Time Image Processing","","6","1","10.1007/s11554-010-0164-7","A. RahmanD. HouzetD. PellerinS. MaratN. Guyader","2011","http://link.springer.com/article/10.1007/s11554-010-0164-7","Article"
"Massively Parallel Computation Using Graphics Processors with Application to Optimal Experimentation in Dynamic Control","Computational Economics","","40","2","10.1007/s10614-011-9297-4","Sergei MorozovSudhanshu Mathur","2012","http://link.springer.com/article/10.1007/s10614-011-9297-4","Article"
"Tuning remote GPU virtualization for InfiniBand networks","The Journal of Supercomputing","","72","12","10.1007/s11227-016-1754-3","Carlos ReañoFederico Silla","2016","http://link.springer.com/article/10.1007/s11227-016-1754-3","Article"
"GPU-accelerated Gibbs sampling: a case study of the Horseshoe Probit model","Statistics and Computing","","29","2","10.1007/s11222-018-9809-3","Alexander TereninShawfeng DongDavid Draper","2019","http://link.springer.com/article/10.1007/s11222-018-9809-3","Article"
"Reconstruction of 3D human motion in real-time using particle swarm optimization with GPU-accelerated fitness function","Journal of Real-Time Image Processing","","17","4","10.1007/s11554-018-0825-5","Bogdan KwolekBoguslaw Rymut","2020","http://link.springer.com/article/10.1007/s11554-018-0825-5","Article"
"Hybrid CPU–GPU execution support in the skeleton programming framework SkePU","The Journal of Supercomputing","","76","7","10.1007/s11227-019-02824-7","Tomas ÖhbergAugust ErnstssonChristoph Kessler","2020","http://link.springer.com/article/10.1007/s11227-019-02824-7","Article"
"Kernel concurrency opportunities based on GPU benchmarks characterization","Cluster Computing","","23","1","10.1007/s10586-018-02901-1","Pablo CarvalhoRommel CruzLucia M. A. DrummondCristiana BentesEsteban CluaEdson CataldoLeandro A. J. Marzulo","2020","http://link.springer.com/article/10.1007/s10586-018-02901-1","Article"
"Fast weighting method for plasma PIC simulation on GPU-accelerated heterogeneous systems","Journal of Central South University","","20","6","10.1007/s11771-013-1644-2","Can-qun Yang 杨灿群Qiang Wu 吴强Hui-li Hu 胡慧俐Zhi-cai Shi 石志才Juan Chen 陈娟Tao Tang 唐滔","2013","http://link.springer.com/article/10.1007/s11771-013-1644-2","Article"
"CPU versus GPU: which can perform matrix computation faster—performance comparison for basic linear algebra subprograms","Neural Computing and Applications","","31","8","10.1007/s00521-018-3354-z","Feng LiYunming YeZhaoyang TianXiaofeng Zhang","2019","http://link.springer.com/article/10.1007/s00521-018-3354-z","Article"
"On the Virtualization of CUDA Based GPU Remoting on ARM and X86 Machines in the GVirtuS Framework","International Journal of Parallel Programming","","45","5","10.1007/s10766-016-0462-1","Raffaele MontellaGiulio GiuntaGiuliano LaccettiMarco LapegnaCarlo PalmieriCarmine FerraroValentina PellicciaCheol-Ho HongIvor SpenceDimitrios S. Nikolopoulos","2017","http://link.springer.com/article/10.1007/s10766-016-0462-1","Article"
"GPU-Based Iterative Medical CT Image Reconstructions","Journal of Signal Processing Systems","","91","3 - 4","10.1007/s11265-018-1352-0","Xiaodong YuHao WangWu-chun FengHao GongGuohua Cao","2019","http://link.springer.com/article/10.1007/s11265-018-1352-0","Article"
"Efficient implementation of data flow graphs on multi-gpu clusters","Journal of Real-Time Image Processing","","9","1","10.1007/s11554-012-0279-0","Vincent BoulosSylvain HuetVincent FristotLuc SalvoDominique Houzet","2014","http://link.springer.com/article/10.1007/s11554-012-0279-0","Article"
"DEMCMC-GPU: An Efficient Multi-Objective Optimization Method with GPU Acceleration on the Fermi Architecture","New Generation Computing","","29","2","10.1007/s00354-010-0103-y","Weihang ZhuAshraf YaseenYaohang Li","2011","http://link.springer.com/article/10.1007/s00354-010-0103-y","Article"
"Automatic Halo Management for the Uintah GPU-Heterogeneous Asynchronous Many-Task Runtime","International Journal of Parallel Programming","","47","5 - 6","10.1007/s10766-018-0619-1","Brad PetersonAlan HumphreyDan SunderlandJames SutherlandTony SaadHarish DasariMartin Berzins","2019","http://link.springer.com/article/10.1007/s10766-018-0619-1","Article"
"Heterogeneous CPU-GPU Epsilon Grid Joins: Static and Dynamic Work Partitioning Strategies","Data Science and Engineering","","6","1","10.1007/s41019-020-00145-x","Benoit GalletMichael Gowanlock","2021","http://link.springer.com/article/10.1007/s41019-020-00145-x","Article"
"A Survey on Graph Processing Accelerators: Challenges and Opportunities","Journal of Computer Science and Technology","","34","2","10.1007/s11390-019-1914-z","Chuang-Yi GuiLong ZhengBingsheng HeCheng LiuXin-Yu ChenXiao-Fei LiaoHai Jin","2019","http://link.springer.com/article/10.1007/s11390-019-1914-z","Article"
"Extending OpenMP to Survive the Heterogeneous Multi-Core Era","International Journal of Parallel Programming","","38","5 - 6","10.1007/s10766-010-0135-4","Eduard AyguadéRosa M. BadiaPieter BellensDaniel CabreraAlejandro DuranRoger FerrerMarc GonzàlezFrancisco IgualDaniel Jiménez-GonzálezJesús LabartaLuis MartinellXavier MartorellRafael MayoJosep M. PérezJudit PlanasEnrique S. Quintana-Ortí","2010","http://link.springer.com/article/10.1007/s10766-010-0135-4","Article"
"Speeding up the evaluation phase of GP classification algorithms on GPUs","Soft Computing","","16","2","10.1007/s00500-011-0713-4","Alberto CanoAmelia ZafraSebastián Ventura","2012","http://link.springer.com/article/10.1007/s00500-011-0713-4","Article"
"Algorithmic Patterns for
$$\mathcal {H}$$
H
-Matrices on Many-Core Processors","Journal of Scientific Computing","","78","2","10.1007/s10915-018-0809-4","Peter Zaspel","2019","http://link.springer.com/article/10.1007/s10915-018-0809-4","Article"
"Remote display solution for video surveillance in multimedia cloud","Multimedia Tools and Applications","","75","21","10.1007/s11042-015-2816-x","Biao SongMohammad Mehedi HassanYuan TianM. Shamim HossainAtif Alamri","2016","http://link.springer.com/article/10.1007/s11042-015-2816-x","Article"
"Medical image segmentation with deformable models on graphics processing units","The Journal of Supercomputing","","68","1","10.1007/s11227-013-1042-4","Rigo AlvaradoJuan J. TapiaJulio C. Rolón","2014","http://link.springer.com/article/10.1007/s11227-013-1042-4","Article"
"Correlating Radio Astronomy Signals with Many-Core Hardware","International Journal of Parallel Programming","","39","1","10.1007/s10766-010-0144-3","Rob V. van NieuwpoortJohn W. Romein","2011","http://link.springer.com/article/10.1007/s10766-010-0144-3","Article"
"Simulation at Extreme-Scale: Co-Design Thinking and Practices","Archives of Computational Methods in Engineering","","21","1","10.1007/s11831-014-9095-y","Rong Tian","2014","http://link.springer.com/article/10.1007/s11831-014-9095-y","Article"
"Computer Vision Accelerators for Mobile Systems based on OpenCL GPGPU Co-Processing","Journal of Signal Processing Systems","","76","3","10.1007/s11265-014-0878-z","Guohui WangYingen XiongJay YunJoseph R. Cavallaro","2014","http://link.springer.com/article/10.1007/s11265-014-0878-z","Article"
"High-Throughput FFT-SPA Decoder Implementation for Non-Binary LDPC Codes on x86 Multicore Processors","Journal of Signal Processing Systems","","92","1","10.1007/s11265-019-01447-8","Bertrand Le GalChristophe Jego","2020","http://link.springer.com/article/10.1007/s11265-019-01447-8","Article"
"Heterogeneous parallel computing accelerated iterative subpixel digital image correlation","Science China Technological Sciences","","61","1","10.1007/s11431-017-9168-0","JianWen HuangLingQi ZhangZhenYu JiangShouBin DongWei ChenYiPing LiuZeJia LiuLiCheng ZhouLiQun Tang","2018","http://link.springer.com/article/10.1007/s11431-017-9168-0","Article"
"A GPU Implementation of OLPCA Method in Hybrid Environment","International Journal of Parallel Programming","","46","3","10.1007/s10766-017-0505-2","Pasquale De MicheleFrancesco MaioranoLivia MarcellinoFrancesco Piccialli","2018","http://link.springer.com/article/10.1007/s10766-017-0505-2","Article"
"Impacts of optimization strategies on performance, power/energy consumption of a GPU based parallel reduction","Journal of Central South University","","24","11","10.1007/s11771-017-3676-5","Thi Yen PhuongDeok-Young LeeJeong-Gun Lee","2017","http://link.springer.com/article/10.1007/s11771-017-3676-5","Article"
"GPU Framework for Change Detection in Multitemporal Hyperspectral Images","International Journal of Parallel Programming","","47","2","10.1007/s10766-017-0547-5","Javier López-FandiñoDora B. HerasFrancisco ArgüelloMauro Dalla Mura","2019","http://link.springer.com/article/10.1007/s10766-017-0547-5","Article"
"A heterogeneous parallel implementation of the Markov clustering algorithm for large-scale biological networks on distributed CPU–GPU clusters","The Journal of Supercomputing","","","","10.1007/s11227-021-04204-6","You FuWei Zhou","2022","http://link.springer.com/article/10.1007/s11227-021-04204-6","Article"
"Real-time dynamic tone-mapping operator on GPU","Journal of Real-Time Image Processing","","7","3","10.1007/s11554-011-0196-7","Mohamed AkilThierry GrandpierreLaurent Perroton","2012","http://link.springer.com/article/10.1007/s11554-011-0196-7","Article"
"Non-dominated sorting procedure for Pareto dominance ranking on multicore CPU and/or GPU","Journal of Global Optimization","","69","3","10.1007/s10898-016-0468-7","G. OrtegaE. FilatovasE. M. GarzónL. G. Casado","2017","http://link.springer.com/article/10.1007/s10898-016-0468-7","Article"
"Optimizing seam carving on multi-GPU systems for real-time content-aware image resizing","The Journal of Supercomputing","","71","9","10.1007/s11227-015-1446-4","Ikjoon KimJidong ZhaiYan LiWenguang Chen","2015","http://link.springer.com/article/10.1007/s11227-015-1446-4","Article"
"High performance data clustering: a comparative analysis of performance for GPU, RASC, MPI, and OpenMP implementations","The Journal of Supercomputing","","70","1","10.1007/s11227-013-0906-y","Luobin YangSteve C. ChiuWei-Keng LiaoMichael A. Thomas","2014","http://link.springer.com/article/10.1007/s11227-013-0906-y","Article"
"GPU-based parallel optimization for real-time scale-invariant feature transform in binocular visual registration","Personal and Ubiquitous Computing","","23","3 - 4","10.1007/s00779-019-01222-3","Jiashen LiYun Pan","2019","http://link.springer.com/article/10.1007/s00779-019-01222-3","Article"
"Heterogeneous parallel_for Template for CPU–GPU Chips","International Journal of Parallel Programming","","47","2","10.1007/s10766-018-0555-0","Angeles NavarroFrancisco CorberaAndres RodriguezAntonio VilchesRafael Asenjo","2019","http://link.springer.com/article/10.1007/s10766-018-0555-0","Article"
"Scalable hybrid implementation of the Schur complement method for multi-GPU systems","The Journal of Supercomputing","","69","1","10.1007/s11227-014-1209-7","Sergey KopysovIgor KuzminNikita NedozhoginAlexander NovikovYulia Sagdeeva","2014","http://link.springer.com/article/10.1007/s11227-014-1209-7","Article"
"Power Analysis Attack of an AES GPU Implementation","Journal of Hardware and Systems Security","","2","1","10.1007/s41635-018-0032-7","Chao LuoYunsi FeiLiwei ZhangA. Adam DingPei LuoSaoni MukherjeeDavid Kaeli","2018","http://link.springer.com/article/10.1007/s41635-018-0032-7","Article"
"GPU parallel computing: Programming language, debugging tools and data structures","Frontiers of Electrical and Electronic Engineering","","7","1","10.1007/s11460-012-0187-x","Kun Zhou","2012","http://link.springer.com/article/10.1007/s11460-012-0187-x","Article"
"Fast motion estimation for HEVC on graphics processing unit (GPU)","Journal of Real-Time Image Processing","","12","2","10.1007/s11554-015-0522-6","Dongkyu LeeDonggyu SimKeeseong ChoSeoung-Jun Oh","2016","http://link.springer.com/article/10.1007/s11554-015-0522-6","Article"
"Parallel MRI Reconstruction Algorithm Implementation on GPU","Applied Magnetic Resonance","","47","1","10.1007/s00723-015-0728-6","H. ShahzadM. F. SadaqatB. HassanW. AbbasiH. Omer","2016","http://link.springer.com/article/10.1007/s00723-015-0728-6","Article"
"A GPU-based implementations of the fuzzy C-means algorithms for medical image segmentation","The Journal of Supercomputing","","71","8","10.1007/s11227-015-1431-y","Mahmoud Al-AyyoubAnsam M. Abu-DaloYaser JararwehMoath JarrahMohammad Al Sa’d","2015","http://link.springer.com/article/10.1007/s11227-015-1431-y","Article"
"Improving the performance and energy of Non-Dominated Sorting for evolutionary multiobjective optimization on GPU/CPU platforms","Journal of Global Optimization","","71","3","10.1007/s10898-018-0669-3","J. J. MorenoG. OrtegaE. FilatovasJ. A. MartínezE. M. Garzón","2018","http://link.springer.com/article/10.1007/s10898-018-0669-3","Article"
"Fast calculation of HELAS amplitudes using graphics processing unit (GPU)","The European Physical Journal C","","66","3 - 4","10.1140/epjc/s10052-010-1276-8","K. HagiwaraJ. KanzakiN. OkamuraD. RainwaterT. Stelzer","2010","http://link.springer.com/article/10.1140/epjc/s10052-010-1276-8","Article"
"GPU-accelerated uncapacitated facility location and semi-dense SymStereo pipelines for piecewise-planar-based 3D reconstruction","Journal of Real-Time Image Processing","","18","3","10.1007/s11554-020-00974-z","Carlos GracaCarolina RaposoJoao P. BarretoUrbano NunesGabriel Falcao","2021","http://link.springer.com/article/10.1007/s11554-020-00974-z","Article"
"GENIE: a software package for gene-gene interaction analysis in genetic association studies using multiple GPU or CPU cores","BMC Research Notes","","4","1","10.1186/1756-0500-4-158","Satish ChikkagoudarKai WangMingyao Li","2011","http://link.springer.com/article/10.1186/1756-0500-4-158","Article"
"Accelerating finite difference wavefield-continuation depth migration by GPU","Applied Geophysics","","9","1","10.1007/s11770-012-0312-x","Guo-Feng LiuXiao-Hong MengHong Liu","2012","http://link.springer.com/article/10.1007/s11770-012-0312-x","Article"
"Adaptive fast multipole methods on the GPU","The Journal of Supercomputing","","63","3","10.1007/s11227-012-0836-0","Anders GoudeStefan Engblom","2013","http://link.springer.com/article/10.1007/s11227-012-0836-0","Article"
"Convolution of large 3D images on GPU and its decomposition","EURASIP Journal on Advances in Signal Processing","","2011","1","10.1186/1687-6180-2011-120","Pavel KarasDavid Svoboda","2011","http://link.springer.com/article/10.1186/1687-6180-2011-120","Article"
"A memory-driven scheduling scheme and optimization for concurrent execution in GPU","Cluster Computing","","19","4","10.1007/s10586-016-0656-8","Bao-yu XuWu ZhangXian-he SunYang Wang","2016","http://link.springer.com/article/10.1007/s10586-016-0656-8","Article"
"Kernel Polynomial Method on GPU","International Journal of Parallel Programming","","41","1","10.1007/s10766-012-0204-y","Shixun ZhangShinichi YamagiwaMasahiko OkumuraSeiji Yunoki","2013","http://link.springer.com/article/10.1007/s10766-012-0204-y","Article"
"Parallelization of large vector similarity computations in a hybrid CPU+GPU environment","The Journal of Supercomputing","","74","2","10.1007/s11227-017-2159-7","Paweł Czarnul","2018","http://link.springer.com/article/10.1007/s11227-017-2159-7","Article"
"Speeding up the high-accuracy surface modelling method with GPU","Environmental Earth Sciences","","74","8","10.1007/s12665-015-4138-8","Changqing YanGang ZhaoTianxiang YueChuanfa ChenJimin LiuHan LiNa Su","2015","http://link.springer.com/article/10.1007/s12665-015-4138-8","Article"
"Multi-GPU approach to global induction of classification trees for large-scale data mining","Applied Intelligence","","51","8","10.1007/s10489-020-01952-5","Krzysztof JurczukMarcin CzajkowskiMarek Kretowski","2021","http://link.springer.com/article/10.1007/s10489-020-01952-5","Article"
"An Autotuning Engine for the 3D Fast Wavelet Transform on Clusters with Hybrid CPU + GPU Platforms","International Journal of Parallel Programming","","43","6","10.1007/s10766-014-0328-3","Gregorio BernabéJavier CuencaDomingo Giménez","2015","http://link.springer.com/article/10.1007/s10766-014-0328-3","Article"
"Financial applications on multi-CPU and multi-GPU architectures","The Journal of Supercomputing","","71","2","10.1007/s11227-014-1316-5","Emilio CastilloCristóbal CamareroAna BorregoJose Luis Bosque","2015","http://link.springer.com/article/10.1007/s11227-014-1316-5","Article"
"CPU-GPU hybrid accelerating the Zuker algorithm for RNA secondary structure prediction applications","BMC Genomics","","13","1","10.1186/1471-2164-13-S1-S14","Guoqing LeiYong DouWen WanFei XiaRongchun LiMeng MaDan Zou","2012","http://link.springer.com/article/10.1186/1471-2164-13-S1-S14","Article"
"Efficient Memory Access Patterns for Solving 3D Laplace Equation on GPU","Iranian Journal of Science and Technology, Transactions A: Science","","42","2","10.1007/s40995-016-0042-7","Muhammad Naveed AkhtarMuhammad Hanif DuradAnila UsmanMuhammad Abid Mughal","2018","http://link.springer.com/article/10.1007/s40995-016-0042-7","Article"
"GPU-accelerated phase field simulation of directional solidification","Science China Technological Sciences","","57","6","10.1007/s11431-014-5541-1","Ang GaoYanSu HuZhiJun WangDeJun MuJunJie LiJinCheng Wang","2014","http://link.springer.com/article/10.1007/s11431-014-5541-1","Article"
"GASAL2: a GPU accelerated sequence alignment library for high-throughput NGS data","BMC Bioinformatics","","20","1","10.1186/s12859-019-3086-9","Nauman AhmedJonathan LévyShanshan RenHamid MushtaqKoen BertelsZaid Al-Ars","2019","http://link.springer.com/article/10.1186/s12859-019-3086-9","Article"
"GPU-assisted HEVC intra decoder","Journal of Real-Time Image Processing","","12","2","10.1007/s11554-015-0519-1","Diego F. de SouzaAleksandar IlicNuno RomaLeonel Sousa","2016","http://link.springer.com/article/10.1007/s11554-015-0519-1","Article"
"Monte Carlo integration on GPU","The European Physical Journal C","","71","2","10.1140/epjc/s10052-011-1559-8","J. Kanzaki","2011","http://link.springer.com/article/10.1140/epjc/s10052-011-1559-8","Article"
"Colloquium: Large scale simulations on GPU clusters","The European Physical Journal B","","88","6","10.1140/epjb/e2015-60180-8","Massimo BernaschiMauro BissonMassimiliano Fatica","2015","http://link.springer.com/article/10.1140/epjb/e2015-60180-8","Article"
"Parallel Computer System for 3D Visualization Stereo on GPU","3D Research","","9","1","10.1007/s13319-018-0159-x","Anas M. Al-OraiqatSergii A. Zori","2018","http://link.springer.com/article/10.1007/s13319-018-0159-x","Article"
"Efficient OLAP algorithms on GPU-accelerated Hadoop clusters","Distributed and Parallel Databases","","37","4","10.1007/s10619-018-7239-z","Hongzhi WangZheng WangNing LiXinxin Kong","2019","http://link.springer.com/article/10.1007/s10619-018-7239-z","Article"
"Resolving the GPU responsiveness dilemma through program transformations","Frontiers of Computer Science","","12","3","10.1007/s11704-016-6206-y","Qi ZhuBo WuXipeng ShenKai ShenLi ShenZhiying Wang","2018","http://link.springer.com/article/10.1007/s11704-016-6206-y","Article"
"Accelerating 2D orthogonal matching pursuit algorithm on GPU","The Journal of Supercomputing","","69","3","10.1007/s11227-014-1188-8","Yuan DaiDongjian HeYong FangLong Yang","2014","http://link.springer.com/article/10.1007/s11227-014-1188-8","Article"
"GPU-accelerated parallel algorithms for linear rankSVM","The Journal of Supercomputing","","71","11","10.1007/s11227-015-1509-6","Jing JinXianggao CaiGuoming LaiXiaola Lin","2015","http://link.springer.com/article/10.1007/s11227-015-1509-6","Article"
"Real-time 3D registration using GPU","Machine Vision and Applications","","22","5","10.1007/s00138-010-0282-z","Soon-Yong ParkSung-In ChoiJun KimJeong Sook Chae","2011","http://link.springer.com/article/10.1007/s00138-010-0282-z","Article"
"GPU fuzzy c-means algorithm implementations: performance analysis on medical image segmentation","Multimedia Tools and Applications","","77","16","10.1007/s11042-017-5589-6","Noureddine Ait AliBouchaib CherradiAhmed El AbbassiOmar BouattaneMohamed Youssfi","2018","http://link.springer.com/article/10.1007/s11042-017-5589-6","Article"
"GPU-accelerated preconditioned iterative linear solvers","The Journal of Supercomputing","","63","2","10.1007/s11227-012-0825-3","Ruipeng LiYousef Saad","2013","http://link.springer.com/article/10.1007/s11227-012-0825-3","Article"
"GPU-based collision analysis between a multi-body system and numerous particles","Journal of Mechanical Science and Technology","","27","4","10.1007/s12206-013-0226-4","Hye-Young JungChul-Woong JunJeong-Hyun Sohn","2013","http://link.springer.com/article/10.1007/s12206-013-0226-4","Article"
"GPU accelerated radio astronomy signal convolution","Experimental Astronomy","","22","1 - 2","10.1007/s10686-008-9114-9","Chris HarrisKaren HainesLister Staveley-Smith","2008","http://link.springer.com/article/10.1007/s10686-008-9114-9","Article"
"GPU accelerated waterpixel algorithm for superpixel segmentation of hyperspectral images","The Journal of Supercomputing","","77","9","10.1007/s11227-021-03666-y","Pablo Quesada-BarriusoDora Blanco HerasFrancisco Argüello","2021","http://link.springer.com/article/10.1007/s11227-021-03666-y","Article"
"GPU-accelerated iterative solutions for finite element analysis of soil–structure interaction problems","Computational Geosciences","","17","4","10.1007/s10596-013-9352-4","Xi ChenYuxin JieYuzhen Yu","2013","http://link.springer.com/article/10.1007/s10596-013-9352-4","Article"
"Hybrid multi-GPU computing: accelerated kernels for segmentation and object detection with medical image processing applications","Journal of Real-Time Image Processing","","13","1","10.1007/s11554-015-0517-3","Carlos GracaGabriel FalcaoIsabel N. FigueiredoSunil Kumar","2017","http://link.springer.com/article/10.1007/s11554-015-0517-3","Article"
"Implementation of GPU accelerated SPECT reconstruction with Monte Carlo-based scatter correction","Annals of Nuclear Medicine","","32","5","10.1007/s12149-018-1252-1","Tobias BexeliusAntti Sohlberg","2018","http://link.springer.com/article/10.1007/s12149-018-1252-1","Article"
"GPU Parallelization of HEVC In-Loop Filters","International Journal of Parallel Programming","","45","6","10.1007/s10766-017-0488-z","Biao WangDiego F. de SouzaMauricio Alvarez-MesaChi Ching ChiBen JuurlinkAleksandar IlicNuno RomaLeonel Sousa","2017","http://link.springer.com/article/10.1007/s10766-017-0488-z","Article"
"Accelerating Time and Depth Seismic Migration by CPU and GPU Cooperation","International Journal of Parallel Programming","","40","3","10.1007/s10766-011-0185-2","Jairo PanettaThiago TeixeiraPaulo R. P. de Souza FilhoCarlos A. da Cunha FilhoDavid SoteloFernando M. Roxo da MottaSilvio Sinedino PinheiroAndre L. Romanelli RosaLuiz R. MonneratLeandro T. CarneiroCarlos H. B. de Albrecht","2012","http://link.springer.com/article/10.1007/s10766-011-0185-2","Article"
"A Jacobi_PCG solver for sparse linear systems on multi-GPU cluster","The Journal of Supercomputing","","73","1","10.1007/s11227-016-1887-4","Shaozhong LinZhiqiang Xie","2017","http://link.springer.com/article/10.1007/s11227-016-1887-4","Article"
"Optimization of HEP codes on GPUs","The European Physical Journal Plus","","126","1","10.1140/epjp/i2011-11001-5","M. Al-Turany","2011","http://link.springer.com/article/10.1140/epjp/i2011-11001-5","Article"
"A parallel pattern for iterative stencil + reduce","The Journal of Supercomputing","","74","11","10.1007/s11227-016-1871-z","M. AldinucciM. DaneluttoM. DroccoP. KilpatrickC. MisaleG. Peretti PezziM. Torquati","2018","http://link.springer.com/article/10.1007/s11227-016-1871-z","Article"
"Regular Lattice and Small-World Spin Model Simulations Using CUDA and GPUs","International Journal of Parallel Programming","","39","2","10.1007/s10766-010-0143-4","K. A. HawickA. LeistD. P. Playne","2011","http://link.springer.com/article/10.1007/s10766-010-0143-4","Article"
"Portable Node-Level Parallelism for the PGAS Model","International Journal of Parallel Programming","","49","6","10.1007/s10766-021-00718-x","Pascal JungblutKarl Fürlinger","2021","http://link.springer.com/article/10.1007/s10766-021-00718-x","Article"
"A comparative study of three-dimensional discrete velocity set in LBM for turbulent flow over bluff body","Journal of the Brazilian Society of Mechanical Sciences and Engineering","","43","1","10.1007/s40430-020-02714-7","Alankar AgarwalSandeep GuptaAkshay Prakash","2021","http://link.springer.com/article/10.1007/s40430-020-02714-7","Article"
"Parallelization of Full Search Motion Estimation Algorithm for Parallel and Distributed Platforms","International Journal of Parallel Programming","","42","2","10.1007/s10766-012-0216-7","Eduarda MonteiroBruno VizzottoCláudio DinizMarilena MauleBruno ZattSergio Bampi","2014","http://link.springer.com/article/10.1007/s10766-012-0216-7","Article"
"Pragma Directed Shared Memory Centric Optimizations on GPUs","Journal of Computer Science and Technology","","31","2","10.1007/s11390-016-1624-8","Jing LiLei LiuYuan WuXiang-Hua LiuYi GaoXiao-Bing FengCheng-Yong Wu","2016","http://link.springer.com/article/10.1007/s11390-016-1624-8","Article"
"A GPU-Based Kalman Filter for Track Fitting","Computing and Software for Big Science","","5","1","10.1007/s41781-021-00065-z","Xiaocong AiGeorgiana ManiaHeather M. GrayMichael KuhnNicholas Styles","2021","http://link.springer.com/article/10.1007/s41781-021-00065-z","Article"
"Optimization of lateral interaction in accumulative computation on GPU-based platform","The Journal of Supercomputing","","75","3","10.1007/s11227-018-02736-y","Aurelio BermúdezFrancisco MonteroMaría T. LópezAntonio Fernández-CaballeroJosé L. Sánchez","2019","http://link.springer.com/article/10.1007/s11227-018-02736-y","Article"
"Real-time thinning algorithms for 2D and 3D images using GPU processors","Journal of Real-Time Image Processing","","17","5","10.1007/s11554-019-00886-7","Martin G. Wagner","2020","http://link.springer.com/article/10.1007/s11554-019-00886-7","Article"
"CudaChain: an alternative algorithm for finding 2D convex hulls on the GPU","SpringerPlus","","5","1","10.1186/s40064-016-2284-4","Gang Mei","2016","http://link.springer.com/article/10.1186/s40064-016-2284-4","Article"
"GPU Acceleration of a Configurable N-Way MIMO Detector for Wireless Systems","Journal of Signal Processing Systems","","76","2","10.1007/s11265-014-0877-0","Michael WuBei YinGuohui WangChristoph StuderJoseph R. Cavallaro","2014","http://link.springer.com/article/10.1007/s11265-014-0877-0","Article"
"Fast computation of 2D and 3D Legendre moments using multi-core CPUs and GPU parallel architectures","Journal of Real-Time Image Processing","","16","6","10.1007/s11554-017-0708-1","Khalid M. HosnyAhmad SalahHassan I. SalehMahmoud Sayed","2019","http://link.springer.com/article/10.1007/s11554-017-0708-1","Article"
"Spectral volume rendering using GPU-based raycasting","The Visual Computer","","22","8","10.1007/s00371-006-0028-0","Magnus StrengertThomas KleinRalf BotchenSimon StegmaierMin ChenThomas Ertl","2006","http://link.springer.com/article/10.1007/s00371-006-0028-0","Article"
"Triangular mesh simplification on the GPU","The Visual Computer","","31","2","10.1007/s00371-014-1039-x","Alexandros PapageorgiouNikos Platis","2015","http://link.springer.com/article/10.1007/s00371-014-1039-x","Article"
"Implementation of a parallel ADI algorithm on a finite volume GPU-based elementary porous media flow computation","Journal of the Brazilian Society of Mechanical Sciences and Engineering","","39","10","10.1007/s40430-017-0882-x","L. Henríquez-VargasE. VillaroelJ. GutierrezP. Donoso-García","2017","http://link.springer.com/article/10.1007/s40430-017-0882-x","Article"
"An efficient GPU-based fractional-step domain decomposition scheme for the reaction–diffusion equation","Computational and Applied Mathematics","","39","4","10.1007/s40314-020-01357-7","Ali FoadaddiniSeyed Alireza ZolfaghariHossein Mahmoodi DarianHamid Saadatfar","2020","http://link.springer.com/article/10.1007/s40314-020-01357-7","Article"
"Appliance of effective clustering technique for gene expression datasets using GPU","Cluster Computing","","22","5","10.1007/s10586-017-1621-x","V. SaveethaS. SophiaP. D. R. Vijayakumar","2019","http://link.springer.com/article/10.1007/s10586-017-1621-x","Article"
"The performances of iterative type-2 fuzzy C-mean on GPU for image segmentation","The Journal of Supercomputing","","","","10.1007/s11227-021-03928-9","Noureddine Ait AliAhmed El abbassiBouchaib Cherradi","2021","http://link.springer.com/article/10.1007/s11227-021-03928-9","Article"
"Collective behavior of large-scale neural networks with GPU acceleration","Cognitive Neurodynamics","","11","6","10.1007/s11571-017-9446-0","Jingyi QuRubin Wang","2017","http://link.springer.com/article/10.1007/s11571-017-9446-0","Article"
"Design Flow for GPU and Multicore Execution of Dynamic Dataflow Programs","Journal of Signal Processing Systems","","89","3","10.1007/s11265-017-1260-8","J. BoutellierT. Nyländen","2017","http://link.springer.com/article/10.1007/s11265-017-1260-8","Article"
"GPU material point method (MPM) and its application on slope stability analysis","Bulletin of Engineering Geology and the Environment","","80","7","10.1007/s10064-021-02265-8","Ze-Kang FengWen-Jie Xu","2021","http://link.springer.com/article/10.1007/s10064-021-02265-8","Article"
"GSA: a GPU-accelerated structure similarity algorithm and its application in progressive virtual screening","Molecular Diversity","","16","4","10.1007/s11030-012-9403-0","Xin YanQiong GuFeng LuJiabo LiJun Xu","2012","http://link.springer.com/article/10.1007/s11030-012-9403-0","Article"
"Efficient GPU and CPU-based LDPC decoders for long codewords","Analog Integrated Circuits and Signal Processing","","73","2","10.1007/s10470-012-9895-7","Stefan GrönroosKristian NybomJerker Björkqvist","2012","http://link.springer.com/article/10.1007/s10470-012-9895-7","Article"
"Genetic improvement of GPU software","Genetic Programming and Evolvable Machines","","18","1","10.1007/s10710-016-9273-9","William B. LangdonBrian Yee Hong LamMarc ModatJustyna PetkeMark Harman","2017","http://link.springer.com/article/10.1007/s10710-016-9273-9","Article"
"Motion vector extrapolation for parallel motion estimation on GPU","Multimedia Tools and Applications","","68","3","10.1007/s11042-012-1074-4","Yi GaoJun Zhou","2014","http://link.springer.com/article/10.1007/s11042-012-1074-4","Article"
"Optimizing Image Reconstruction in SENSE Using GPU","Applied Magnetic Resonance","","49","2","10.1007/s00723-017-0951-4","Sohaib A. QaziSaima NasirAbeera SaeedHammad Omer","2018","http://link.springer.com/article/10.1007/s00723-017-0951-4","Article"
"A GPU-based elastic shape registration approach in implicit spaces","Journal of Real-Time Image Processing","","16","6","10.1007/s11554-017-0710-7","Ahmed Hassan YousefHossam E. Abd El Munim","2019","http://link.springer.com/article/10.1007/s11554-017-0710-7","Article"
"A self-organization based optical flow estimator with GPU implementation","Machine Vision and Applications","","23","6","10.1007/s00138-011-0352-x","Manish P. ShiralkarRobert J. Schalkoff","2012","http://link.springer.com/article/10.1007/s00138-011-0352-x","Article"
"A GPU implementation of secret sharing scheme based on cellular automata","The Journal of Supercomputing","","72","4","10.1007/s11227-016-1646-6","Rogelio Adrian Hernandez-BecerrilAriana Guadalupe Bucio-RamirezMariko Nakano-MiyatakeHector Perez-MeanaMarco Pedro Ramirez-Tachiquin","2016","http://link.springer.com/article/10.1007/s11227-016-1646-6","Article"
"Cooperative CPU, GPU, and FPGA heterogeneous execution with EngineCL","The Journal of Supercomputing","","75","3","10.1007/s11227-019-02768-y","María Angélica Dávila GuzmánRaúl NozalRubén Gran TejeroMaría Villarroya-GaudóDarío Suárez GraciaJose Luis Bosque","2019","http://link.springer.com/article/10.1007/s11227-019-02768-y","Article"
"Parallel edge-based visual assessment of cluster tendency on GPU","International Journal of Data Science and Analytics","","6","4","10.1007/s41060-018-0100-7","Tao MengBo Yuan","2018","http://link.springer.com/article/10.1007/s41060-018-0100-7","Article"
"Knowledge based fuzzy c-means method for rapid brain tissues segmentation of magnetic resonance imaging scans with CUDA enabled GPU machine","Journal of Ambient Intelligence and Humanized Computing","","","","10.1007/s12652-020-02132-6","Prajoona ValsalanP. SriramakrishnanS. SridharG. Charlyn Pushpa LathaA. PriyaS. RamkumarA. Robert SinghT. Rajendran","2020","http://link.springer.com/article/10.1007/s12652-020-02132-6","Article"
"Forward and back substitution algorithms on GPU: a case study on modified incomplete Cholesky Preconditioner for three-dimensional finite difference method","The Journal of Supercomputing","","62","1","10.1007/s11227-011-0736-8","Yigitcan AksariHarun Artuner","2012","http://link.springer.com/article/10.1007/s11227-011-0736-8","Article"
"Fast differential box-counting algorithm on GPU","The Journal of Supercomputing","","76","1","10.1007/s11227-019-03030-1","Juan Ruiz de Miras","2020","http://link.springer.com/article/10.1007/s11227-019-03030-1","Article"
"Computational Approach for Securing Radiology-Diagnostic Data in Connected Health Network using High-Performance GPU-Accelerated AES","Interdisciplinary Sciences: Computational Life Sciences","","9","1","10.1007/s12539-015-0140-9","A. M. AdeshinaR. Hashim","2017","http://link.springer.com/article/10.1007/s12539-015-0140-9","Article"
"Combined kernel for fast GPU computation of Zernike moments","Journal of Real-Time Image Processing","","18","3","10.1007/s11554-020-00979-8","Zengjun ZhaoXinkai KuangYukuan ZhuYecheng LiangYubo Xuan","2021","http://link.springer.com/article/10.1007/s11554-020-00979-8","Article"
"A novel CT image segmentation algorithm using PCNN and Sobolev gradient methods in GPU frameworks","Pattern Analysis and Applications","","23","2","10.1007/s10044-019-00837-9","Biswajit BiswasSwarup Kr. GhoshAnupam Ghosh","2020","http://link.springer.com/article/10.1007/s10044-019-00837-9","Article"
"Massively parallel palmprint identification system using GPU","Cluster Computing","","22","3","10.1007/s10586-017-1121-z","Syed Ali TariqShahzaib IqbalMubeen GhafoorImtiaz A. TajNoman M. JafriSaad RazzaqTehseen Zia","2019","http://link.springer.com/article/10.1007/s10586-017-1121-z","Article"
"GPU Supported Simulation of Transition-Edge Sensor Arrays","Journal of Low Temperature Physics","","200","5 - 6","10.1007/s10909-020-02450-1","M. LorenzC. KirschP. E. Merino-AlonsoP. PeilleT. DauserE. CucchettiS. J. SmithJ. Wilms","2020","http://link.springer.com/article/10.1007/s10909-020-02450-1","Article"
"Effective naive Bayes nearest neighbor based image classification on GPU","The Journal of Supercomputing","","68","2","10.1007/s11227-013-1068-7","Lei ZhuHai JinRan ZhengXiaowen Feng","2014","http://link.springer.com/article/10.1007/s11227-013-1068-7","Article"
"GPU-Based Blind Watermarking Scheme for 3D Multiresolution Meshes Using Unlifted Butterfly Wavelet Transformation","Circuits, Systems, and Signal Processing","","39","3","10.1007/s00034-019-01220-z","Soumaya HachichaIkbel SayahiAkram ElkefiChokri Ben AmarMourad Zaied","2020","http://link.springer.com/article/10.1007/s00034-019-01220-z","Article"
"Efficient extraction of clustering-based feature signatures using GPU architectures","Multimedia Tools and Applications","","75","13","10.1007/s11042-015-2726-y","Martin KrulišJakub LokočTomáš Skopal","2016","http://link.springer.com/article/10.1007/s11042-015-2726-y","Article"
"Direct private query in location-based services with GPU run time analysis","The Journal of Supercomputing","","71","2","10.1007/s11227-014-1309-4","Charles AsanyaRatan Guha","2015","http://link.springer.com/article/10.1007/s11227-014-1309-4","Article"
"An optimized hybrid remote display protocol using GPU-assisted M-JPEG encoding and novel high-motion detection algorithm","The Journal of Supercomputing","","66","3","10.1007/s11227-013-0972-1","Biao SongWei TangTien-Dung NguyenMohammad Mehedi HassanEui Nam Huh","2013","http://link.springer.com/article/10.1007/s11227-013-0972-1","Article"
"Acceleration techniques and evaluation on multi-core CPU, GPU and FPGA for image processing and super-resolution","Journal of Real-Time Image Processing","","16","4","10.1007/s11554-016-0619-6","Georgios GeorgisGeorge LentarisDionysios Reisis","2019","http://link.springer.com/article/10.1007/s11554-016-0619-6","Article"
"Enhancing GPU parallelism in nature-inspired algorithms","The Journal of Supercomputing","","63","3","10.1007/s11227-012-0770-1","José M. CeciliaAndy NisbetMartyn AmosJosé M. GarcíaManuel Ujaldón","2013","http://link.springer.com/article/10.1007/s11227-012-0770-1","Article"
"Efficient GPU algorithms for parallel decomposition of graphs into strongly connected and maximal end components","Formal Methods in System Design","","48","3","10.1007/s10703-016-0246-7","Anton WijsJoost-Pieter KatoenDragan Bošnački","2016","http://link.springer.com/article/10.1007/s10703-016-0246-7","Article"
"Exploring the parallel capabilities of GPU: Berlekamp-Massey algorithm case study","Cluster Computing","","23","2","10.1007/s10586-019-02961-x","Hanan AliGhada M. FathyZeinab FayezWalaa Sheta","2020","http://link.springer.com/article/10.1007/s10586-019-02961-x","Article"
"Forecasting large scale conditional volatility and covariance using neural network on GPU","The Journal of Supercomputing","","63","2","10.1007/s11227-012-0827-1","Xianggao CaiGuoming LaiXiaola Lin","2013","http://link.springer.com/article/10.1007/s11227-012-0827-1","Article"
"Nearest Neighbor Searches on the GPU","International Journal of Parallel Programming","","40","3","10.1007/s10766-011-0184-3","Pedro LeiteJoão Marcelo TeixeiraThiago FariasBernardo ReisVeronica TeichriebJudith Kelner","2012","http://link.springer.com/article/10.1007/s10766-011-0184-3","Article"
"gEMpicker: a highly parallel GPU-accelerated particle picking tool for cryo-electron microscopy","BMC Structural Biology","","13","1","10.1186/1472-6807-13-25","Thai V HoangXavier CavinPatrick SchultzDavid W Ritchie","2013","http://link.springer.com/article/10.1186/1472-6807-13-25","Article"
"MSKD: multi-split KD-tree design on GPU","Multimedia Tools and Applications","","75","2","10.1007/s11042-014-2371-x","Xin YangBing YangPengjie WangDuanqing Xu","2016","http://link.springer.com/article/10.1007/s11042-014-2371-x","Article"
"A modular lattice boltzmann solver for GPU computing processors","SeMA Journal","","59","1","10.1007/BF03322610","M. AstorinoJ. Becerra SagredoA. Quarteroni","2012","http://link.springer.com/article/10.1007/BF03322610","Article"
"Efficient electro-magnetic analysis of a GPU bitsliced AES implementation","Cybersecurity","","3","1","10.1186/s42400-020-0045-8","Yiwen GaoYongbin ZhouWei Cheng","2020","http://link.springer.com/article/10.1186/s42400-020-0045-8","Article"
"A CPU-GPU-based parallel search algorithm for the best differential characteristics of block ciphers","The Journal of Supercomputing","","77","10","10.1007/s11227-021-03703-w","Pei LiShihao ZhouJiageng Chen","2021","http://link.springer.com/article/10.1007/s11227-021-03703-w","Article"
"A GPU implementation of an iterative receiver for energy saving MIMO ID-BICM systems","The Journal of Supercomputing","","70","2","10.1007/s11227-013-1081-x","Carla RamiroM. Ángeles SimarroF. J. Martínez-ZaldívarAntonio M. VidalAlberto González","2014","http://link.springer.com/article/10.1007/s11227-013-1081-x","Article"
"GPU-Based FFT Computation for Multi-Gigabit WirelessHD Baseband Processing","EURASIP Journal on Wireless Communications and Networking","","2010","1","10.1155/2010/359081","Nicholas HinittTaskin Kocak","2010","http://link.springer.com/article/10.1155/2010/359081","Article"
"Comparing GPU-based multi-volume ray casting techniques","Computer Science - Research and Development","","26","1 - 2","10.1007/s00450-010-0141-1","Nicole SchubertIngrid Scholl","2011","http://link.springer.com/article/10.1007/s00450-010-0141-1","Article"
"Accelerating number theoretic transform in GPU platform for fully homomorphic encryption","The Journal of Supercomputing","","77","2","10.1007/s11227-020-03156-7","Jia-Zheng GoeyWai-Kong LeeBok-Min GoiWun-She Yap","2021","http://link.springer.com/article/10.1007/s11227-020-03156-7","Article"
"GPU implementation of the 2D shallow water equations for the simulation of rainfall/runoff events","Environmental Earth Sciences","","74","11","10.1007/s12665-015-4215-z","Asier LacastaMario Morales-HernándezJavier MurilloPilar García-Navarro","2015","http://link.springer.com/article/10.1007/s12665-015-4215-z","Article"
"Almost optimal column-wise prefix-sum computation on the GPU","The Journal of Supercomputing","","74","4","10.1007/s11227-018-2242-8","Hiroki TokuraToru FujitaKoji NakanoYasuaki ItoJacir L. Bordim","2018","http://link.springer.com/article/10.1007/s11227-018-2242-8","Article"
"GPU-acceleration of waveform relaxation methods for large differential systems","Numerical Algorithms","","71","2","10.1007/s11075-015-9993-6","Dajana ConteRaffaele D’AmbrosioBeatrice Paternoster","2016","http://link.springer.com/article/10.1007/s11075-015-9993-6","Article"
"A non-sequential refinement approach to improve word embeddings using GPU-based string matching algorithms","Cluster Computing","","24","4","10.1007/s10586-021-03321-4","Behzad NaderalvojoudAdnan Ozsoy","2021","http://link.springer.com/article/10.1007/s10586-021-03321-4","Article"
"Caffe CNN-based classification of hyperspectral images on GPU","The Journal of Supercomputing","","75","3","10.1007/s11227-018-2300-2","Alberto S. GareaDora B. HerasFrancisco Argüello","2019","http://link.springer.com/article/10.1007/s11227-018-2300-2","Article"
"SPH-DEM coupling method based on GPU and its application to the landslide tsunami. Part I: method and validation","Acta Geotechnica","","","","10.1007/s11440-021-01388-2","Qian ZhouWen-Jie XuXue-Yang Dong","2021","http://link.springer.com/article/10.1007/s11440-021-01388-2","Article"
"Inertia based filtering of high resolution images using a GPU cluster","Computing and Visualization in Science","","14","4","10.1007/s00791-012-0171-2","Daniel JungblutGillian QueisserGabriel Wittum","2011","http://link.springer.com/article/10.1007/s00791-012-0171-2","Article"
"Rapid Automated Classification of Anesthetic Depth Levels using GPU Based Parallelization of Neural Networks","Journal of Medical Systems","","39","2","10.1007/s10916-015-0197-3","Musa PekerBaha ŞenHüseyin Gürüler","2015","http://link.springer.com/article/10.1007/s10916-015-0197-3","Article"
"GPU-parallel interpolation using the edge-direction based normal vector method for terrain triangular mesh","Journal of Real-Time Image Processing","","14","4","10.1007/s11554-016-0575-1","Jiaji WuLong DengGwanggil JeonJechang Jeong","2018","http://link.springer.com/article/10.1007/s11554-016-0575-1","Article"
"GPU-based RFA simulation for minimally invasive cancer treatment of liver tumours","International Journal of Computer Assisted Radiology and Surgery","","12","1","10.1007/s11548-016-1469-1","Panchatcharam MariappanPhil WeirRonan FlanaganPhilip VoglreiterTuomas AlhonnoroMika PollariMichael MocheHarald BusseJurgen FuttererHorst Rupert PortugallerRoberto Blanco SequeirosMarina Kolesnik","2017","http://link.springer.com/article/10.1007/s11548-016-1469-1","Article"
"Implementation and performance analysis of DVB-T2 rotated constellation demappers on a GPU","Analog Integrated Circuits and Signal Processing","","78","3","10.1007/s10470-013-0101-3","Stefan GrönroosKristian NybomJerker Björkqvist","2014","http://link.springer.com/article/10.1007/s10470-013-0101-3","Article"
"Parallel ILU preconditioners in GPU computation","Soft Computing","","22","24","10.1007/s00500-017-2764-7","Yan ChenXuhong TianHui LiuZhangxin ChenBo YangWenyuan LiaoPeng ZhangRuijian HeMin Yang","2018","http://link.springer.com/article/10.1007/s00500-017-2764-7","Article"
"Liutex-based analysis of drag force and vortex in two-phase flow past 2-D square obstacle using LBM on GPU","Journal of Hydrodynamics","","32","5","10.1007/s42241-020-0058-5","Peng-xin ChengNan GuiXing-tuan YangJi-yuan TuSheng-yao JiangHai-jun Jia","2020","http://link.springer.com/article/10.1007/s42241-020-0058-5","Article"
"Reinforcement learning-based spatial sorting based dynamic task allocation on networked multicore GPU processors","Journal of Ambient Intelligence and Humanized Computing","","12","10","10.1007/s12652-020-02716-2","K. RameshA. Thilagavathy","2021","http://link.springer.com/article/10.1007/s12652-020-02716-2","Article"
"On GPU–CUDA as preprocessing of fuzzy-rough data reduction by means of singular value decomposition","Soft Computing","","22","5","10.1007/s00500-017-2887-x","Salvatore CuomoArdelio GallettiLivia MarcellinoGuglielmo NavarraGerardo Toraldo","2018","http://link.springer.com/article/10.1007/s00500-017-2887-x","Article"
"Parallel Digital Predistortion Design on Mobile GPU and Embedded Multicore CPU for Mobile Transmitters","Journal of Signal Processing Systems","","89","3","10.1007/s11265-017-1233-y","Kaipeng LiAmanullah GhaziChance TarverJani BoutellierMahmoud AbdelazizLauri AnttilaMarkku JunttiMikko ValkamaJoseph R. Cavallaro","2017","http://link.springer.com/article/10.1007/s11265-017-1233-y","Article"
"MilkyWay-2 supercomputer: system and application","Frontiers of Computer Science","","8","3","10.1007/s11704-014-3501-3","Xiangke LiaoLiquan XiaoCanqun YangYutong Lu","2014","http://link.springer.com/article/10.1007/s11704-014-3501-3","Article"
"A vision of post-exascale programming","Frontiers of Information Technology & Electronic Engineering","","19","10","10.1631/FITEE.1800442","Ji-Dong ZhaiWen-Guang Chen","2018","http://link.springer.com/article/10.1631/FITEE.1800442","Article"
"GPU-aware resource management in heterogeneous cloud data centers","The Journal of Supercomputing","","77","11","10.1007/s11227-021-03779-4","Ashwin Kumar KulkarniB. Annappa","2021","http://link.springer.com/article/10.1007/s11227-021-03779-4","Article"
"STEEL-RT: combining single task–single executor model and expanded scheduling to ease heterogeneity exploitation","The Journal of Supercomputing","","76","6","10.1007/s11227-019-02955-x","Antón ReyFrancisco D. IgualManuel Prieto-Matías","2020","http://link.springer.com/article/10.1007/s11227-019-02955-x","Article"
"NoT: a high-level no-threading parallel programming method for heterogeneous systems","The Journal of Supercomputing","","75","7","10.1007/s11227-019-02749-1","Shusen WuXiaoshe DongXingjun ZhangZhengdong Zhu","2019","http://link.springer.com/article/10.1007/s11227-019-02749-1","Article"
"Parallel computing of 3D smoking simulation based on OpenCL heterogeneous platform","The Journal of Supercomputing","","61","1","10.1007/s11227-011-0652-y","Zhiyong YuanWeixin SiXiangyun LiaoZhaoliang DuanYihua DingJianhui Zhao","2012","http://link.springer.com/article/10.1007/s11227-011-0652-y","Article"
"A novel parallel image encryption algorithm based on hybrid chaotic maps with OpenCL implementation","Soft Computing","","24","16","10.1007/s00500-020-04683-4","Lin YouErsong YangGuangyi Wang","2020","http://link.springer.com/article/10.1007/s00500-020-04683-4","Article"
"Hybrid of genetic algorithm and local search to solve MAX-SAT problem using nVidia CUDA framework","Genetic Programming and Evolvable Machines","","10","4","10.1007/s10710-009-9091-4","Asim MunawarMohamed WahibMasaharu MunetomoKiyoshi Akama","2009","http://link.springer.com/article/10.1007/s10710-009-9091-4","Article"
"DLPlib: A Library for Deep Learning Processor","Journal of Computer Science and Technology","","32","2","10.1007/s11390-017-1722-2","Hui-Ying LanLin-Yang WuXiao ZhangJin-Hua TaoXun-Yu ChenBing-Rui WangYu-Qing WangQi GuoYun-Ji Chen","2017","http://link.springer.com/article/10.1007/s11390-017-1722-2","Article"
"Four styles of parallel and net programming","Frontiers of Computer Science in China","","3","3","10.1007/s11704-009-0028-0","Zhiwei XuYongqiang HeWei LinLi Zha","2009","http://link.springer.com/article/10.1007/s11704-009-0028-0","Article"
"Comparison of OpenCL and RenderScript for mobile devices","Multimedia Tools and Applications","","75","22","10.1007/s11042-016-3244-2","SeongKi KimSeok-Kyoo Kim","2016","http://link.springer.com/article/10.1007/s11042-016-3244-2","Article"
"Towards Parallelism Extraction for Heterogeneous Multicore Android Devices","International Journal of Parallel Programming","","45","6","10.1007/s10766-016-0479-5","Miguel Angel AguilarJuan Fernando EusseProjjol RayRainer LeupersGerd AscheidWeihua ShengPrashant Sharma","2017","http://link.springer.com/article/10.1007/s10766-016-0479-5","Article"
"THUBrachy: fast Monte Carlo dose calculation tool accelerated by heterogeneous hardware for high-dose-rate brachytherapy","Nuclear Science and Techniques","","32","3","10.1007/s41365-021-00866-2","An-Kang HuRui QiuHuan LiuZhen WuChun-Yan LiHui ZhangJun-Li LiRui-Jie Yang","2021","http://link.springer.com/article/10.1007/s41365-021-00866-2","Article"
"High-Throughput parallel blind Virtual Screening using BINDSURF","BMC Bioinformatics","","13","14","10.1186/1471-2105-13-S14-S13","Irene Sánchez-LinaresHoracio Pérez-SánchezJosé M CeciliaJosé M García","2012","http://link.springer.com/article/10.1186/1471-2105-13-S14-S13","Article"
"Multi-relaxation-time lattice Boltzmann simulations of lid driven flows using graphics processing unit","Applied Mathematics and Mechanics","","38","5","10.1007/s10483-017-2194-9","Chenggong LiJ. P. Y. Maa","2017","http://link.springer.com/article/10.1007/s10483-017-2194-9","Article"
"High performance evaluation of evolutionary-mined association rules on GPUs","The Journal of Supercomputing","","66","3","10.1007/s11227-013-0937-4","Alberto CanoJosé María LunaSebastián Ventura","2013","http://link.springer.com/article/10.1007/s11227-013-0937-4","Article"
"GPUSVM: a comprehensive CUDA based support vector machine package","Central European Journal of Computer Science","","1","4","10.2478/s13537-011-0028-7","Qi LiRaied SalmanErik TestRobert StrackVojislav Kecman","2011","http://link.springer.com/article/10.2478/s13537-011-0028-7","Article"
"An MPI+
$$X$$
X
implementation of contact global search using Kokkos","Engineering with Computers","","32","2","10.1007/s00366-015-0418-x","Glen A. HansenPatrick G. XavierSam P. MishThomas E. VothMartin W. HeinsteinMicheal W. Glass","2016","http://link.springer.com/article/10.1007/s00366-015-0418-x","Article"
"A new parallel particle filter face tracking method based on heterogeneous system","Journal of Real-Time Image Processing","","7","3","10.1007/s11554-011-0225-6","Ke-Yan LiuYun-Hua LiShanqing LiLiang TangLei Wang","2012","http://link.springer.com/article/10.1007/s11554-011-0225-6","Article"
"Programming GPGPU Graph Applications with Linear Algebra Building Blocks","International Journal of Parallel Programming","","45","3","10.1007/s10766-016-0448-z","Shuai CheBradford M. BeckmannSteven K. Reinhardt","2017","http://link.springer.com/article/10.1007/s10766-016-0448-z","Article"
"Design and evaluation of medical ultrasonic adaptive beamforming algorithm implementation on heterogeneous embedded computing platform","EURASIP Journal on Embedded Systems","","2017","1","10.1186/s13639-017-0069-7","Junying ChenJinhui ChenHuaqing Min","2017","http://link.springer.com/article/10.1186/s13639-017-0069-7","Article"
"Energy cost evaluation of parallel algorithms for multiprocessor systems","Cluster Computing","","16","1","10.1007/s10586-011-0188-1","Zhuowei WangXianbin XuNaixue XiongLaurence T. YangWuqing Zhao","2013","http://link.springer.com/article/10.1007/s10586-011-0188-1","Article"
"High-performance biocomputing for simulating the spread of contagion over large contact networks","BMC Genomics","","13","2","10.1186/1471-2164-13-S2-S3","Keith R BissetAshwin M AjiMadhav V MaratheWu-chun Feng","2012","http://link.springer.com/article/10.1186/1471-2164-13-S2-S3","Article"
"SDAM: a combined stack distance-analytical modeling approach to estimate memory performance in GPUs","The Journal of Supercomputing","","77","5","10.1007/s11227-020-03483-9","Mohsen KianiAmir Rajabzadeh","2021","http://link.springer.com/article/10.1007/s11227-020-03483-9","Article"
"An efficient parallelization technique for x264 encoder on heterogeneous platforms consisting of CPUs and GPUs","Journal of Real-Time Image Processing","","9","1","10.1007/s11554-012-0317-y","Youngsub KoYoungmin YiSoonhoi Ha","2014","http://link.springer.com/article/10.1007/s11554-012-0317-y","Article"
"Paradigmatic shifts for exascale supercomputing","The Journal of Supercomputing","","62","2","10.1007/s11227-012-0789-3","Neal E. DavisRobert W. RobeyCharles R. FerenbaughDavid NicholaeffDennis P. Trujillo","2012","http://link.springer.com/article/10.1007/s11227-012-0789-3","Article"
"GPU implementation of a road sign detector based on particle swarm optimization","Evolutionary Intelligence","","3","3 - 4","10.1007/s12065-010-0043-y","Luca MussiStefano CagnoniElena CardarelliFabio DaolioPaolo MediciPier Paolo Porta","2010","http://link.springer.com/article/10.1007/s12065-010-0043-y","Article"
"A new MapReduce associative classifier based on a new storage format for large-scale imbalanced data","Cluster Computing","","21","4","10.1007/s10586-018-2812-9","Mehrdad AlmasiMohammad Saniee Abadeh","2018","http://link.springer.com/article/10.1007/s10586-018-2812-9","Article"
"A run-time optimization approach for reducing data movements using locality-aware searching","The Journal of Supercomputing","","69","2","10.1007/s11227-014-1186-x","Liang LiEndong WangXingjun ZhangKang YanTao JuXiaoshe Dong","2014","http://link.springer.com/article/10.1007/s11227-014-1186-x","Article"
"A Resource Selection System for Cycle Stealing in GPU Grids","Journal of Grid Computing","","6","4","10.1007/s10723-008-9099-7","Y. KotaniF. InoK. Hagihara","2008","http://link.springer.com/article/10.1007/s10723-008-9099-7","Article"
"Simultaneous CPU–GPU Execution of Data Parallel Algorithmic Skeletons","International Journal of Parallel Programming","","46","1","10.1007/s10766-016-0483-9","Fabian WredeSteffen Ernsting","2018","http://link.springer.com/article/10.1007/s10766-016-0483-9","Article"
"Real-time anomaly detection in hyperspectral images using multivariate normal mixture models and GPU processing","Journal of Real-Time Image Processing","","4","3","10.1007/s11554-008-0105-x","Yuliya TarabalkaTrym Vegard HaavardsholmIngebjørg KåsenTorbjørn Skauli","2009","http://link.springer.com/article/10.1007/s11554-008-0105-x","Article"
"An Infrastructure for Tackling Input-Sensitivity of GPU Program Optimizations","International Journal of Parallel Programming","","41","6","10.1007/s10766-012-0236-3","Xipeng ShenYixun LiuEddy Z. ZhangPoornima Bhamidipati","2013","http://link.springer.com/article/10.1007/s10766-012-0236-3","Article"
"Tracing and Profiling Machine Learning Dataflow Applications on GPU","International Journal of Parallel Programming","","47","5 - 6","10.1007/s10766-019-00630-5","Pierre ZinsMichel Dagenais","2019","http://link.springer.com/article/10.1007/s10766-019-00630-5","Article"
"Integration of GPU Computing in a Software Radio Environment","Journal of Signal Processing Systems","","69","1","10.1007/s11265-011-0639-1","Pierre-Henri HorreinChristine HennebertFrédéric Pétrot","2012","http://link.springer.com/article/10.1007/s11265-011-0639-1","Article"
"Evaluations of OpenCL-written tsunami simulation on FPGA and comparison with GPU implementation","The Journal of Supercomputing","","74","6","10.1007/s11227-018-2315-8","Fumiya KonoNaohito NakasatoKensaku HayashiAlexander VazheninStanislav Sedukhin","2018","http://link.springer.com/article/10.1007/s11227-018-2315-8","Article"
"Impact of data layouts on the efficiency of GPU-accelerated IDW interpolation","SpringerPlus","","5","1","10.1186/s40064-016-1731-6","Gang MeiHong Tian","2016","http://link.springer.com/article/10.1186/s40064-016-1731-6","Article"
"Exploiting task and data parallelism for advanced video coding on hybrid CPU + GPU platforms","Journal of Real-Time Image Processing","","11","3","10.1007/s11554-013-0357-y","Svetislav MomcilovicNuno RomaLeonel Sousa","2016","http://link.springer.com/article/10.1007/s11554-013-0357-y","Article"
"An analysis of the graph processing landscape","Journal of Big Data","","8","1","10.1186/s40537-021-00443-9","Miguel E. CoimbraAlexandre P. FranciscoLuís Veiga","2021","http://link.springer.com/article/10.1186/s40537-021-00443-9","Article"
"A survey on parallel clustering algorithms for Big Data","Artificial Intelligence Review","","54","4","10.1007/s10462-020-09918-2","Zineb DafirYasmine LamariSaid Chah Slaoui","2021","http://link.springer.com/article/10.1007/s10462-020-09918-2","Article"
"Two-Dimensional Compact Third-Order Polynomial Reconstructions. Solving Nonconservative Hyperbolic Systems Using GPUs","Journal of Scientific Computing","","48","1 - 3","10.1007/s10915-011-9470-x","José M. GallardoSergio OrtegaMarc de la AsunciónJosé Miguel Mantas","2011","http://link.springer.com/article/10.1007/s10915-011-9470-x","Article"
"A middleware for efficient stream processing in CUDA","Computer Science - Research and Development","","25","1 - 2","10.1007/s00450-010-0107-3","Shinta NakagawaFumihiko InoKenichi Hagihara","2010","http://link.springer.com/article/10.1007/s00450-010-0107-3","Article"
"A BSP model graph processing system on many cores","Cluster Computing","","20","2","10.1007/s10586-017-0829-0","Siyan LaiGuangda LaiFangzhou LuGuojun ShenJing JinXiaola Lin","2017","http://link.springer.com/article/10.1007/s10586-017-0829-0","Article"
"H.264/AVC inter prediction on accelerator-based multi-core systems","Multimedia Tools and Applications","","66","3","10.1007/s11042-012-1056-6","Rafael Rodríguez-SánchezJosé Luis MartínezGerardo Fernández-EscribanoJosé Luis SánchezJosé Manuel Claver","2013","http://link.springer.com/article/10.1007/s11042-012-1056-6","Article"
"Algorithmic Skeletons and Parallel Design Patterns in Mainstream Parallel Programming","International Journal of Parallel Programming","","49","2","10.1007/s10766-020-00684-w","Marco DaneluttoGabriele MencagliMassimo TorquatiHoracio González–VélezPeter Kilpatrick","2021","http://link.springer.com/article/10.1007/s10766-020-00684-w","Article"
"CUDASW++2.0: enhanced Smith-Waterman protein database search on CUDA-enabled GPUs based on SIMT and virtualized SIMD abstractions","BMC Research Notes","","3","1","10.1186/1756-0500-3-93","Yongchao LiuBertil SchmidtDouglas L Maskell","2010","http://link.springer.com/article/10.1186/1756-0500-3-93","Article"
"Toward a BLAS library truly portable across different accelerator types","The Journal of Supercomputing","","75","11","10.1007/s11227-019-02925-3","Eduardo Rodriguez-GutiezAna Moreton-FernandezArturo Gonzalez-EscribanoDiego R. Llanos","2019","http://link.springer.com/article/10.1007/s11227-019-02925-3","Article"
"Solving finite difference linear systems on GPUs: CUDA based Parallel Explicit Preconditioned Biconjugate Conjugate Gradient type Methods","The Journal of Supercomputing","","61","3","10.1007/s11227-011-0619-z","G. A. GravvanisC. K. Filelis-PapadopoulosK. M. Giannoutakis","2012","http://link.springer.com/article/10.1007/s11227-011-0619-z","Article"
"Data Layout Transformation Exploiting Memory-Level Parallelism in Structured Grid Many-Core Applications","International Journal of Parallel Programming","","40","1","10.1007/s10766-011-0182-5","I-Jui SungNasser AnssariJohn A. StrattonWen-Mei W. Hwu","2012","http://link.springer.com/article/10.1007/s10766-011-0182-5","Article"
"Speeding up the log-polar transform with inexpensive parallel hardware: graphics units and multi-core architectures","Journal of Real-Time Image Processing","","10","3","10.1007/s11554-012-0281-6","Marco AntonelliFrancisco D. IgualFrancisco RamosV. Javier Traver","2015","http://link.springer.com/article/10.1007/s11554-012-0281-6","Article"
"Dynamic load balancing on heterogeneous clusters for parallel ant colony optimization","Cluster Computing","","19","1","10.1007/s10586-016-0534-4","Antonio LlanesJosé M. CeciliaAntonia SánchezJosé M. GarcíaMartyn AmosManuel Ujaldón","2016","http://link.springer.com/article/10.1007/s10586-016-0534-4","Article"
"A framework for accelerating local feature extraction with OpenCL on multi-core CPUs and co-processors","Journal of Real-Time Image Processing","","16","4","10.1007/s11554-016-0576-0","Konrad MorenDiana Göhringer","2019","http://link.springer.com/article/10.1007/s11554-016-0576-0","Article"
"Emerging Architectures Enable to Boost Massively Parallel Data Mining Using Adaptive Sparse Grids","International Journal of Parallel Programming","","41","3","10.1007/s10766-012-0202-0","Alexander HeineckeDirk Pflüger","2013","http://link.springer.com/article/10.1007/s10766-012-0202-0","Article"
"A dynamic acceleration method for remote sensing image processing based on CUDA","Wireless Networks","","27","6","10.1007/s11276-021-02715-x","Xianyu ZuoZhe ZhangBaojun QiaoJunfeng TianLiming ZhouYunzhou Zhang","2021","http://link.springer.com/article/10.1007/s11276-021-02715-x","Article"
"A first look at integrated GPUs for green high-performance computing","Computer Science - Research and Development","","25","3 - 4","10.1007/s00450-010-0128-y","T. R. W. ScoglandH. LinW. Feng","2010","http://link.springer.com/article/10.1007/s00450-010-0128-y","Article"
"A survey on partitioning models, solution algorithms and algorithm parallelization for hardware/software co-design","Design Automation for Embedded Systems","","23","1 - 2","10.1007/s10617-019-09220-7","Neng HouXiaohu YanFazhi He","2019","http://link.springer.com/article/10.1007/s10617-019-09220-7","Article"
"Multiscale and local search methods for real time region tracking with particle filters: local search driven by adaptive scale estimation on GPUs","Machine Vision and Applications","","21","1","10.1007/s00138-008-0140-4","Raúl CabidoAntonio S. MontemayorJuan José PantrigoBryson R. Payne","2008","http://link.springer.com/article/10.1007/s00138-008-0140-4","Article"
"Systolic genetic search, a systolic computing-based metaheuristic","Soft Computing","","19","7","10.1007/s00500-014-1363-0","Martín PedemonteFrancisco LunaEnrique Alba","2015","http://link.springer.com/article/10.1007/s00500-014-1363-0","Article"
"CRState: checkpoint/restart of OpenCL program for in-kernel applications","The Journal of Supercomputing","","77","6","10.1007/s11227-020-03460-2","Genlang ChenJiajian ZhangZufang ZhuQiangqiang JiangHai JiangChaoyi Pang","2021","http://link.springer.com/article/10.1007/s11227-020-03460-2","Article"
"Parallel probabilistic model checking on general purpose graphics processors","International Journal on Software Tools for Technology Transfer","","13","1","10.1007/s10009-010-0176-4","Dragan BošnačkiStefan EdelkampDamian SulewskiAnton Wijs","2011","http://link.springer.com/article/10.1007/s10009-010-0176-4","Article"
"Mapping of option pricing algorithms onto heterogeneous many-core architectures","The Journal of Supercomputing","","73","9","10.1007/s11227-017-1968-z","Shuai ZhangZhao WangYing PengBertil SchmidtWeiguo Liu","2017","http://link.springer.com/article/10.1007/s11227-017-1968-z","Article"
"Evaluating the SAT problem on P systems for different high-performance architectures","The Journal of Supercomputing","","69","1","10.1007/s11227-014-1150-9","José M. CeciliaJosé M. GarcíaGinés D. GuerreroManuel Ujaldón","2014","http://link.springer.com/article/10.1007/s11227-014-1150-9","Article"
"Exploiting OpenMP and OpenACC to accelerate a geometric approach to molecular docking in heterogeneous HPC nodes","The Journal of Supercomputing","","75","7","10.1007/s11227-019-02875-w","Emanuele VitaliDavide GadioliGianluca PalermoAndrea BeccariCarlo CavazzoniCristina Silvano","2019","http://link.springer.com/article/10.1007/s11227-019-02875-w","Article"
"A quantitative evaluation of unified memory in GPUs","The Journal of Supercomputing","","76","4","10.1007/s11227-019-03079-y","Qi YuBruce ChildersLibo HuangCheng QianZhiying Wang","2020","http://link.springer.com/article/10.1007/s11227-019-03079-y","Article"
"Accelerated bulk memory operations on heterogeneous multi-core systems","The Journal of Supercomputing","","74","12","10.1007/s11227-018-2589-x","JongHyuk LeeWeidong ShiJoonMin Gil","2018","http://link.springer.com/article/10.1007/s11227-018-2589-x","Article"
"A study of graphics hardware accelerated particle swarm optimization with digital pheromones","Structural and Multidisciplinary Optimization","","51","6","10.1007/s00158-014-1215-7","Vijay KalivarapuEliot Winer","2015","http://link.springer.com/article/10.1007/s00158-014-1215-7","Article"
"A Fuzzy Neural Network Based Dynamic Data Allocation Model on Heterogeneous Multi-GPUs for Large-scale Computations","International Journal of Automation and Computing","","15","2","10.1007/s11633-018-1120-4","Chao-Long ZhangYuan-Ping XuZhi-Jie XuJia HeJing WangJian-Hua Adu","2018","http://link.springer.com/article/10.1007/s11633-018-1120-4","Article"
"On the effect of using rCUDA to provide CUDA acceleration to Xen virtual machines","Cluster Computing","","22","1","10.1007/s10586-018-2845-0","Javier PradesCarlos ReañoFederico Silla","2019","http://link.springer.com/article/10.1007/s10586-018-2845-0","Article"
"DecGPU: distributed error correction on massively parallel graphics processing units using CUDA and MPI","BMC Bioinformatics","","12","1","10.1186/1471-2105-12-85","Yongchao LiuBertil SchmidtDouglas L Maskell","2011","http://link.springer.com/article/10.1186/1471-2105-12-85","Article"
"GPU-based normalized cuts for road extraction using satellite imagery","Journal of Earth System Science","","123","8","10.1007/s12040-014-0513-1","J SENTHILNATHS SINDHUS N OMKAR","2014","http://link.springer.com/article/10.1007/s12040-014-0513-1","Article"
"Object oriented framework for real-time image processing on GPU","Multimedia Tools and Applications","","70","3","10.1007/s11042-013-1440-x","Nicolas SeillerWilliemNitin SinghalIn Kyu Park","2014","http://link.springer.com/article/10.1007/s11042-013-1440-x","Article"
"Vectorized algorithm for multidimensional Monte Carlo integration on modern GPU, CPU and MIC architectures","The Journal of Supercomputing","","74","2","10.1007/s11227-017-2172-x","Przemysław Stpiczyński","2018","http://link.springer.com/article/10.1007/s11227-017-2172-x","Article"
"Software for numerical simulation of convection in spherical shells for hybrid CPU/GPU computing systems","Mathematical Models and Computer Simulations","","7","3","10.1134/S2070048215030047","I. V. BychinV. A. GalkinT. V. GavrilenkoA. V. GorelikovA. V. Ryakhovsky","2015","http://link.springer.com/article/10.1134/S2070048215030047","Article"
"GPU-accelerated denoising of 3D magnetic resonance images","Journal of Real-Time Image Processing","","13","4","10.1007/s11554-014-0436-8","Mark HowisonE. Wes Bethel","2017","http://link.springer.com/article/10.1007/s11554-014-0436-8","Article"
"Parallel regressions for variable selection using GPU","Computing","","99","3","10.1007/s00607-016-0487-8","Lauro Cássio Martins de PaulaAnderson S. SoaresTelma W. L. SoaresArlindo R. G. FilhoClarimar J. CoelhoAlexandre C. B. DelbemWellington S. Martins","2017","http://link.springer.com/article/10.1007/s00607-016-0487-8","Article"
"CPU/GPU computing for a multi-block structured grid based high-order flow solver on a large heterogeneous system","Cluster Computing","","17","2","10.1007/s10586-013-0332-1","Wei CaoChuan-fu XuZheng-hua WangLu YaoHua-yong Liu","2014","http://link.springer.com/article/10.1007/s10586-013-0332-1","Article"
"A performance- and energy-oriented extended tuning process for time-step-based scientific applications","The Journal of Supercomputing","","77","4","10.1007/s11227-020-03402-y","Natalia KalinnikRobert KieselThomas RauberMarcel RichterGudula Rünger","2021","http://link.springer.com/article/10.1007/s11227-020-03402-y","Article"
"A fast single-image super-resolution method implemented with CUDA","Journal of Real-Time Image Processing","","16","1","10.1007/s11554-018-0774-z","Yuan YuanXiaomin YangWei WuHu LiYiguang LiuKai Liu","2019","http://link.springer.com/article/10.1007/s11554-018-0774-z","Article"
"Parallel Implementations of the Cooperative Particle Swarm Optimization on Many-core and Multi-core Architectures","International Journal of Parallel Programming","","44","6","10.1007/s10766-015-0368-3","Nadia NedjahRogério de M. CalazanLuiza de Macedo MourelleChao Wang","2016","http://link.springer.com/article/10.1007/s10766-015-0368-3","Article"
"CUDA-NP: Realizing Nested Thread-Level Parallelism in GPGPU Applications","Journal of Computer Science and Technology","","30","1","10.1007/s11390-015-1500-y","Yi YangChao LiHuiyang Zhou","2015","http://link.springer.com/article/10.1007/s11390-015-1500-y","Article"
"An experimental evaluation of extreme learning machines on several hardware devices","Neural Computing and Applications","","32","18","10.1007/s00521-019-04481-6","Liang LiGuoren WangGang WuQi Zhang","2020","http://link.springer.com/article/10.1007/s00521-019-04481-6","Article"
"Android
$$^\mathrm{TM}$$
TM
development and performance analysis","The Journal of Supercomputing","","70","2","10.1007/s11227-014-1119-8","Alejandro AcostaFrancisco Almeida","2014","http://link.springer.com/article/10.1007/s11227-014-1119-8","Article"
"Effect of baffles on the flow hydrodynamics of dual-Rushton turbine stirred tank bioreactor—a CFD study","Brazilian Journal of Chemical Engineering","","38","4","10.1007/s43153-021-00176-5","Alankar AgarwalGurveer SinghAkshay Prakash","2021","http://link.springer.com/article/10.1007/s43153-021-00176-5","Article"
"Finding the Next Computational Model: Experience with the UCSC Kestrel","Journal of Signal Processing Systems","","53","1 - 2","10.1007/s11265-007-0130-1","Richard HugheyAndrea Di Blas","2008","http://link.springer.com/article/10.1007/s11265-007-0130-1","Article"
"PPModel: a modeling tool for source code maintenance and optimization of parallel programs","The Journal of Supercomputing","","62","3","10.1007/s11227-012-0821-7","Ferosh JacobJeff GrayJeffrey C. CarverMarjan MernikPurushotham Bangalore","2012","http://link.springer.com/article/10.1007/s11227-012-0821-7","Article"
"Parallel programming for multimedia applications","Multimedia Tools and Applications","","51","2","10.1007/s11042-010-0656-2","Hari KalvaAleksandar ColicAdriana GarciaBorko Furht","2011","http://link.springer.com/article/10.1007/s11042-010-0656-2","Article"
"The experience of using DVM and SAPFOR systems in semi automatic parallelization of an application for 3D modeling in geophysics","The Journal of Supercomputing","","75","12","10.1007/s11227-018-2551-y","Nikita KataevAlexander Kolganov","2019","http://link.springer.com/article/10.1007/s11227-018-2551-y","Article"
"Status and future perspectives for lattice gauge theory calculations to the exascale and beyond","The European Physical Journal A","","55","11","10.1140/epja/i2019-12919-7","Bálint JoóChulwoo JungNorman H. ChristWilliam DetmoldRobert G. EdwardsMartin SavagePhiala Shanahan","2019","http://link.springer.com/article/10.1140/epja/i2019-12919-7","Article"
"Iris recognition in unconstrained environment on graphic processing units with CUDA","Artificial Intelligence Review","","53","5","10.1007/s10462-019-09776-7","Ali NoruziMahmoud MahloujiAli Shahidinejad","2020","http://link.springer.com/article/10.1007/s10462-019-09776-7","Article"
"A Fast MHD Code for Gravitationally Stratified Media using Graphical Processing Units: SMAUG","Journal of Astrophysics and Astronomy","","36","1","10.1007/s12036-015-9328-y","M. K. GriffithsV. FedunR. Erdélyi","2015","http://link.springer.com/article/10.1007/s12036-015-9328-y","Article"
"A generic optimization method of multivariate systems on graphic processing units","Soft Computing","","22","23","10.1007/s00500-018-3507-0","Guohong LiaoZheng GongZheng HuangWeidong Qiu","2018","http://link.springer.com/article/10.1007/s00500-018-3507-0","Article"
"Improving an autotuning engine for 3D Fast Wavelet Transform on manycore systems","The Journal of Supercomputing","","70","2","10.1007/s11227-014-1302-y","Gregorio BernabéJavier CuencaLuis Pedro GarcíaDomingo Giménez","2014","http://link.springer.com/article/10.1007/s11227-014-1302-y","Article"
"Relational Learning with GPUs: Accelerating Rule Coverage","International Journal of Parallel Programming","","44","3","10.1007/s10766-015-0364-7","Carlos Alberto Martínez-AngelesHaicheng WuInês DutraVítor Santos CostaJorge Buenabad-Chávez","2016","http://link.springer.com/article/10.1007/s10766-015-0364-7","Article"
"Graphics processing unit-accelerated joint-bitplane belief propagation algorithm in DSC","The Journal of Supercomputing","","72","6","10.1007/s11227-016-1736-5","Yuan DaiYong FangLong YangGwanggil Jeon","2016","http://link.springer.com/article/10.1007/s11227-016-1736-5","Article"
"The index array approach and the dual tiled similarity algorithm for UAS hyper-spatial image processing","GeoInformatica","","20","4","10.1007/s10707-016-0253-2","Lihong SuYuxia HuangJames GibeautLongzhuang Li","2016","http://link.springer.com/article/10.1007/s10707-016-0253-2","Article"
"Scaling database performance on GPUs","Information Systems Frontiers","","14","4","10.1007/s10796-011-9322-0","Yue-Shan ChangRuey-Kai SheuShyan-Ming YuanJyn-Jie Hsu","2012","http://link.springer.com/article/10.1007/s10796-011-9322-0","Article"
"The spectral cell method for wave propagation in heterogeneous materials simulated on multiple GPUs and CPUs","Computational Mechanics","","63","5","10.1007/s00466-018-1623-4","Farshid MossaibyMeysam JoulaianAlexander Düster","2019","http://link.springer.com/article/10.1007/s00466-018-1623-4","Article"
"Real-time virtual environment signal extraction and denoising using programmable graphics hardware","International Journal of Automation and Computing","","6","4","10.1007/s11633-009-0326-x","Yang SuZhi-Jie XuXiang-Qian Jiang","2009","http://link.springer.com/article/10.1007/s11633-009-0326-x","Article"
"A Survey on Parallel Particle Swarm Optimization Algorithms","Arabian Journal for Science and Engineering","","44","4","10.1007/s13369-018-03713-6","Soniya LalwaniHarish SharmaSuresh Chandra SatapathyKusum DeepJagdish Chand Bansal","2019","http://link.springer.com/article/10.1007/s13369-018-03713-6","Article"
"SearchaStore: fast and secure searchable cloud services","Cluster Computing","","21","2","10.1007/s10586-017-0941-1","Wai-Kong LeeRaphael C.-W. PhanGeong-Sen PohBok-Min Goi","2018","http://link.springer.com/article/10.1007/s10586-017-0941-1","Article"
"E-OSched: a load balancing scheduler for heterogeneous multicores","The Journal of Supercomputing","","74","10","10.1007/s11227-018-2435-1","Yasir Noman KhalidMuhammad AleemRadu ProdanMuhammad Azhar IqbalMuhammad Arshad Islam","2018","http://link.springer.com/article/10.1007/s11227-018-2435-1","Article"
"Parallel Mining of Neuronal Spike Streams on Graphics Processing Units","International Journal of Parallel Programming","","40","6","10.1007/s10766-011-0181-6","Yong CaoDebprakash PatnaikSean PonceJeremy ArchuletaPatrick ButlerWu-chun FengNaren Ramakrishnan","2012","http://link.springer.com/article/10.1007/s10766-011-0181-6","Article"
"ScrimpCo: scalable matrix profile on commodity heterogeneous processors","The Journal of Supercomputing","","76","11","10.1007/s11227-020-03199-w","Jose C. RomeroAntonio VilchesAndrés RodríguezAngeles NavarroRafael Asenjo","2020","http://link.springer.com/article/10.1007/s11227-020-03199-w","Article"
"Methodology and optimization for implementing cluster-based parallel geospatial algorithms with a case study","Cluster Computing","","23","2","10.1007/s10586-019-02944-y","Fang HuangBo TieJian TaoXicheng TanYan Ma","2020","http://link.springer.com/article/10.1007/s10586-019-02944-y","Article"
"Accelerating low-fidelity aerodynamic codes on multi- and many-core architectures","The Journal of Supercomputing","","71","9","10.1007/s11227-015-1444-6","Marcin ChrustEric LaurendeauLuc Ostiguy","2015","http://link.springer.com/article/10.1007/s11227-015-1444-6","Article"
"Normalized particle swarm optimization for complex chooser option pricing on graphics processing unit","The Journal of Supercomputing","","66","1","10.1007/s11227-013-0893-z","Bhanu SharmaRuppa K. ThulasiramParimala Thulasiraman","2013","http://link.springer.com/article/10.1007/s11227-013-0893-z","Article"
"Machine Learning and Deep Learning frameworks and libraries for large-scale data mining: a survey","Artificial Intelligence Review","","52","1","10.1007/s10462-018-09679-z","Giang NguyenStefan DlugolinskyMartin BobákViet TranÁlvaro López GarcíaIgnacio HerediaPeter MalíkLadislav Hluchý","2019","http://link.springer.com/article/10.1007/s10462-018-09679-z","Article"
"Fast Automatic Segmentation of White Matter Streamlines Based on a Multi-Subject Bundle Atlas","Neuroinformatics","","15","1","10.1007/s12021-016-9316-7","Nicole LabraPamela GuevaraDelphine DuclapJosselin HouenouCyril PouponJean-François ManginMiguel Figueroa","2017","http://link.springer.com/article/10.1007/s12021-016-9316-7","Article"
"OpenDwarfs: Characterization of Dwarf-Based Benchmarks on Fixed and Reconfigurable Architectures","Journal of Signal Processing Systems","","85","3","10.1007/s11265-015-1051-z","Konstantinos KrommydasWu-chun FengChristos D. AntonopoulosNikolaos Bellas","2016","http://link.springer.com/article/10.1007/s11265-015-1051-z","Article"
"Programming big data analysis: principles and solutions","Journal of Big Data","","9","1","10.1186/s40537-021-00555-2","Loris BelcastroRiccardo CantiniFabrizio MarozzoAlessio OrsinoDomenico TaliaPaolo Trunfio","2022","http://link.springer.com/article/10.1186/s40537-021-00555-2","Article"
"MapReduce: Review and open challenges","Scientometrics","","109","1","10.1007/s11192-016-1945-y","Ibrahim Abaker Targio HashemNor Badrul AnuarAbdullah GaniIbrar YaqoobFeng XiaSamee Ullah Khan","2016","http://link.springer.com/article/10.1007/s11192-016-1945-y","Article"
"A view of programming scalable data analysis: from clouds to exascale","Journal of Cloud Computing","","8","1","10.1186/s13677-019-0127-x","Domenico Talia","2019","http://link.springer.com/article/10.1186/s13677-019-0127-x","Article"
"VGL: a high-performance graph processing framework for the NEC SX-Aurora TSUBASA vector architecture","The Journal of Supercomputing","","77","8","10.1007/s11227-020-03564-9","Ilya V. AfanasyevVladimir V. VoevodinKazuhiko KomatsuHiroaki Kobayashi","2021","http://link.springer.com/article/10.1007/s11227-020-03564-9","Article"
"SkePU 2: Flexible and Type-Safe Skeleton Programming for Heterogeneous Parallel Systems","International Journal of Parallel Programming","","46","1","10.1007/s10766-017-0490-5","August ErnstssonLu LiChristoph Kessler","2018","http://link.springer.com/article/10.1007/s10766-017-0490-5","Article"
"Real-time capable solution for optimal control problems: a heterogeneous hardware approach","Automotive and Engine Technology","","3","3 - 4","10.1007/s41104-018-0032-1","Janek HudecekLutz Eckstein","2018","http://link.springer.com/article/10.1007/s41104-018-0032-1","Article"
"Generating custom code for efficient query execution on heterogeneous processors","The VLDB Journal","","27","6","10.1007/s00778-018-0512-y","Sebastian BreßBastian KöcherHenning FunkeSteffen ZeuchTilmann RablVolker Markl","2018","http://link.springer.com/article/10.1007/s00778-018-0512-y","Article"
"Parallel co-location mining with MapReduce and NoSQL systems","Knowledge and Information Systems","","62","4","10.1007/s10115-019-01381-y","Jin Soung YooDouglas BoulwareDavid Kimmey","2020","http://link.springer.com/article/10.1007/s10115-019-01381-y","Article"
"SWIFOLD: Smith-Waterman implementation on FPGA with OpenCL for long DNA sequences","BMC Systems Biology","","12","5","10.1186/s12918-018-0614-6","Enzo RucciCarlos GarciaGuillermo BotellaArmando De GiustiMarcelo NaioufManuel Prieto-Matias","2018","http://link.springer.com/article/10.1186/s12918-018-0614-6","Article"
"Parallel probability density approximation","Behavior Research Methods","","51","6","10.3758/s13428-018-1153-1","Yi-Shin LinAndrew HeathcoteWilliam R. Holmes","2019","http://link.springer.com/article/10.3758/s13428-018-1153-1","Article"
"Parallelization Strategies for Computational Fluid Dynamics Software: State of the Art Review","Archives of Computational Methods in Engineering","","24","2","10.1007/s11831-016-9165-4","Asif AfzalZahid AnsariAhmed Rimaz FaizabadiM. K. Ramis","2017","http://link.springer.com/article/10.1007/s11831-016-9165-4","Article"
"Parallel algorithm for fringe pattern demodulation","Journal of Real-Time Image Processing","","18","6","10.1007/s11554-021-01129-4","Francisco J. Hernandez-LopezRicardo Legarda-SáenzCarlos Brito-Loeza","2021","http://link.springer.com/article/10.1007/s11554-021-01129-4","Article"
"BenchIP: Benchmarking Intelligence Processors","Journal of Computer Science and Technology","","33","1","10.1007/s11390-018-1805-8","Jin-Hua TaoZi-Dong DuQi GuoHui-Ying LanLei ZhangSheng-Yuan ZhouLing-Jie XuCong LiuHai-Feng LiuShan TangAllen RushWillian ChenShao-Li LiuYun-Ji ChenTian-Shi Chen","2018","http://link.springer.com/article/10.1007/s11390-018-1805-8","Article"
"Dawning Nebulae: A PetaFLOPS Supercomputer with a Heterogeneous Structure","Journal of Computer Science and Technology","","26","3","10.1007/s11390-011-1138-3","Ning-Hui SunJing XingZhi-Gang HuoGuang-Ming TanJin XiongBo LiCan Ma","2011","http://link.springer.com/article/10.1007/s11390-011-1138-3","Article"
"High-performance blob-based iterative three-dimensional reconstruction in electron tomography using multi-GPUs","BMC Bioinformatics","","13","10","10.1186/1471-2105-13-S10-S4","Xiaohua WanFa ZhangQi ChuZhiyong Liu","2012","http://link.springer.com/article/10.1186/1471-2105-13-S10-S4","Article"
"Accelerated multiscale space–time finite element simulation and application to high cycle fatigue life prediction","Computational Mechanics","","58","2","10.1007/s00466-016-1296-9","Rui ZhangLihua WenSam NaboulsiThomas EasonVijay K. VasudevanDong Qian","2016","http://link.springer.com/article/10.1007/s00466-016-1296-9","Article"
"High-Performance Computation of Bézier Surfaces on Parallel and Heterogeneous Platforms","International Journal of Parallel Programming","","46","6","10.1007/s10766-017-0506-1","Rafael PalomarJuan Gómez-LunaFaouzi A. CheikhJoaquín Olivares-BuenoOle J. Elle","2018","http://link.springer.com/article/10.1007/s10766-017-0506-1","Article"
"A scalable spatial skyline evaluation system utilizing parallel independent region groups","The VLDB Journal","","28","1","10.1007/s00778-018-0519-4","Wenlu WangJi ZhangMin-Te SunWei-Shinn Ku","2019","http://link.springer.com/article/10.1007/s00778-018-0519-4","Article"
"Performance characterization of data-intensive kernels on AMD Fusion architectures","Computer Science - Research and Development","","28","2 - 3","10.1007/s00450-012-0209-1","Kenneth LeeHeshan LinWu-chun Feng","2013","http://link.springer.com/article/10.1007/s00450-012-0209-1","Article"
"An fast simulation tool for fluid animation in VR application based on GPUs","Multimedia Tools and Applications","","79","23 - 24","10.1007/s11042-019-08002-4","Fengquan ZhangQiuming WeiLiuqing Xu","2020","http://link.springer.com/article/10.1007/s11042-019-08002-4","Article"
"CU++: an object oriented framework for computational fluid dynamics applications using graphics processing units","The Journal of Supercomputing","","67","1","10.1007/s11227-013-0985-9","Dominic D. J. ChandarJayanarayanan SitaramanDimitri Mavriplis","2014","http://link.springer.com/article/10.1007/s11227-013-0985-9","Article"
"Accelerating frequent itemset mining on graphics processing units","The Journal of Supercomputing","","66","1","10.1007/s11227-013-0887-x","Fan ZhangYan ZhangJason D. Bakos","2013","http://link.springer.com/article/10.1007/s11227-013-0887-x","Article"
"Accelerating thread-intensive and explicit memory management programs with dynamic partial reconfiguration","The Journal of Supercomputing","","63","2","10.1007/s11227-012-0828-0","Qianming YangMei WenNan WuChunyuan Zhang","2013","http://link.springer.com/article/10.1007/s11227-012-0828-0","Article"
"Magas: matrix-based asynchronous graph analytics on shared memory systems","The Journal of Supercomputing","","","","10.1007/s11227-021-04091-x","Le LuoYi LiuHailong YangDepei Qian","2021","http://link.springer.com/article/10.1007/s11227-021-04091-x","Article"
"Efficient parallelization of multilevel fast multipole algorithm for electromagnetic simulation on many-core SW26010 processor","The Journal of Supercomputing","","77","2","10.1007/s11227-020-03308-9","Wei-Jia HeMing-Lin YangWu WangXin-Qing Sheng","2021","http://link.springer.com/article/10.1007/s11227-020-03308-9","Article"
"Optimized OpenCL™ kernels for frequency domain image high-boost filters using image vectorization technique","SN Applied Sciences","","1","11","10.1007/s42452-019-1445-9","Ashutosh SatapathyL. M. Jenila Livingston","2019","http://link.springer.com/article/10.1007/s42452-019-1445-9","Article"
"Fast and accurate protein substructure searching with simulated annealing and GPUs","BMC Bioinformatics","","11","1","10.1186/1471-2105-11-446","Alex D StivalaPeter J StuckeyAnthony I Wirth","2010","http://link.springer.com/article/10.1186/1471-2105-11-446","Article"
"Implementation of Digital Watermarking Algorithms in Parallel Hardware Accelerators","International Journal of Parallel Programming","","45","5","10.1007/s10766-016-0459-9","Andrzej GłowaczMarcin Pietroń","2017","http://link.springer.com/article/10.1007/s10766-016-0459-9","Article"
"Programming high-performance parallel computations: formal models and graphics processing units","Cybernetics and Systems Analysis","","47","4","10.1007/s10559-011-9346-y","P. I. AndonA. Yu. DoroshenkoK. A. Zhereb","2011","http://link.springer.com/article/10.1007/s10559-011-9346-y","Article"
"Parallel mutual information estimation for inferring gene regulatory networks on GPUs","BMC Research Notes","","4","1","10.1186/1756-0500-4-189","Haixiang ShiBertil SchmidtWeiguo LiuWolfgang Müller-Wittig","2011","http://link.springer.com/article/10.1186/1756-0500-4-189","Article"
"A Credit-Based Load-Balance-Aware CTA Scheduling Optimization Scheme in GPGPU","International Journal of Parallel Programming","","44","1","10.1007/s10766-014-0318-5","Yulong YuXubin HeHe GuoYuxin WangXin Chen","2016","http://link.springer.com/article/10.1007/s10766-014-0318-5","Article"
"SkePU 3: Portable High-Level Programming of Heterogeneous Systems and HPC Clusters","International Journal of Parallel Programming","","49","6","10.1007/s10766-021-00704-3","August ErnstssonJohan AhlqvistStavroula ZouzoulaChristoph Kessler","2021","http://link.springer.com/article/10.1007/s10766-021-00704-3","Article"
"MeshCleaner: A Generic and Straightforward Algorithm for Cleaning Finite Element Meshes","International Journal of Parallel Programming","","46","3","10.1007/s10766-017-0507-0","Gang MeiSalvatore CuomoHong TianNengxiong XuLinjun Peng","2018","http://link.springer.com/article/10.1007/s10766-017-0507-0","Article"
"General-purpose coordinator–master–worker model for efficient large-scale simulation over heterogeneous infrastructure","Journal of Simulation","","11","3","10.1057/s41273-016-0044-7","Bilel Ben RomdhanneNavid Nikaein","2017","http://link.springer.com/article/10.1057/s41273-016-0044-7","Article"
"Performance evaluation of Unified Memory with prefetching and oversubscription for selected parallel CUDA applications on NVIDIA Pascal and Volta GPUs","The Journal of Supercomputing","","75","11","10.1007/s11227-019-02966-8","Marcin KnapPaweł Czarnul","2019","http://link.springer.com/article/10.1007/s11227-019-02966-8","Article"
"A survey of cloud resource management for complex engineering applications","Frontiers of Computer Science","","10","3","10.1007/s11704-015-4207-x","Haibao ChenSong WuHai JinWenguang ChenJidong ZhaiYingwei LuoXiaolin Wang","2016","http://link.springer.com/article/10.1007/s11704-015-4207-x","Article"
"Parallel fractal image compression using quadtree partition with task and dynamic parallelism","Journal of Real-Time Image Processing","","","","10.1007/s11554-021-01193-w","Francisco J. Hernandez-LopezOmar Muñiz-Pérez","2022","http://link.springer.com/article/10.1007/s11554-021-01193-w","Article"
"On parallel local search for permutations","Journal of the Operational Research Society","","66","5","10.1057/jors.2014.29","Atle RiiseEdmund K Burke","2015","http://link.springer.com/article/10.1057/jors.2014.29","Article"
"Association Rules Mining","SN Computer Science","","2","6","10.1007/s42979-021-00819-x","Leila HAMDADKarima BENATCHBA","2021","http://link.springer.com/article/10.1007/s42979-021-00819-x","Article"
"Implementation of a high-throughput low-latency polyphase channelizer on GPUs","EURASIP Journal on Advances in Signal Processing","","2014","1","10.1186/1687-6180-2014-141","Scott C KimShuvra S Bhattacharyya","2014","http://link.springer.com/article/10.1186/1687-6180-2014-141","Article"
"PRODA: improving parallel programs on GPUs through dependency analysis","Cluster Computing","","22","1","10.1007/s10586-017-1295-4","Xiong WeiMing HuTao PengMinghua JiangZhiying WangXiao Qin","2019","http://link.springer.com/article/10.1007/s10586-017-1295-4","Article"
"Protecting lightweight block cipher implementation in mobile big data computing","Peer-to-Peer Networking and Applications","","11","2","10.1007/s12083-016-0481-0","Weidong QiuBozhong LiuCan GeLingzhi XuXiaoming TangGuozhen Liu","2018","http://link.springer.com/article/10.1007/s12083-016-0481-0","Article"
"Coupling SIMD and SIMT architectures to boost performance of a phylogeny-aware alignment kernel","BMC Bioinformatics","","13","1","10.1186/1471-2105-13-196","Nikolaos AlachiotisSimon A BergerAlexandros Stamatakis","2012","http://link.springer.com/article/10.1186/1471-2105-13-196","Article"
"Algorithms and framework for computing 2-body statistics on GPUs","Distributed and Parallel Databases","","37","4","10.1007/s10619-018-7238-0","Napath PitaksiriananZhila Nouri LewisYi-Cheng Tu","2019","http://link.springer.com/article/10.1007/s10619-018-7238-0","Article"
"Fast T-overlap query algorithms using graphics processor units and its applications in web data query","World Wide Web","","18","2","10.1007/s11280-013-0232-6","Mengjuan LiLianyin JiaJinguo YouJianqing XiHaiFei QinRui Zeng","2015","http://link.springer.com/article/10.1007/s11280-013-0232-6","Article"
"Gravitational wave astrophysics, data analysis and multimessenger astronomy","Science China Physics, Mechanics & Astronomy","","58","12","10.1007/s11433-015-5740-1","Hyung Mok LeeEric-Olivier Le BigotZhiHui DuZhangXi LinXiangYu GuoLinQing WenKhun Sang PhukonVihan PandeySukanta BoseXi-Long FanMartin Hendry","2015","http://link.springer.com/article/10.1007/s11433-015-5740-1","Article"
"Revised simplex algorithm for linear programming on GPUs with CUDA","Multimedia Tools and Applications","","77","22","10.1007/s11042-018-5947-z","Lili HeHongtao BaiYu JiangDantong OuyangShanshan Jiang","2018","http://link.springer.com/article/10.1007/s11042-018-5947-z","Article"
"Accelerating large-scale protein structure alignments with graphics processing units","BMC Research Notes","","5","1","10.1186/1756-0500-5-116","Bin PangNan ZhaoMichela BecchiDmitry KorkinChi-Ren Shyu","2012","http://link.springer.com/article/10.1186/1756-0500-5-116","Article"
"High resolution topology optimization using graphics processing units (GPUs)","Structural and Multidisciplinary Optimization","","49","2","10.1007/s00158-013-0980-z","Vivien J. ChallisAnthony P. RobertsJoseph F. Grotowski","2014","http://link.springer.com/article/10.1007/s00158-013-0980-z","Article"
"Integration of Dataflow-Based Heterogeneous Multiprocessor Scheduling Techniques in GNU Radio","Journal of Signal Processing Systems","","70","2","10.1007/s11265-012-0696-0","George F. ZakiWilliam PlishkerShuvra S. BhattacharyyaCharles ClancyJohn Kuykendall","2013","http://link.springer.com/article/10.1007/s11265-012-0696-0","Article"
"A robust optimization model for agile and build-to-order supply chain planning under uncertainties","Annals of Operations Research","","240","2","10.1007/s10479-013-1421-5","Morteza LalmazloumianKuan Yew WongKannan GovindanDevika Kannan","2016","http://link.springer.com/article/10.1007/s10479-013-1421-5","Article"
"Real-Time Big Data Stream Processing Using GPU with Spark Over Hadoop Ecosystem","International Journal of Parallel Programming","","46","3","10.1007/s10766-017-0513-2","M. Mazhar RathoreHojae SonAwais AhmadAnand PaulGwanggil Jeon","2018","http://link.springer.com/article/10.1007/s10766-017-0513-2","Article"
"SIMD Monte-Carlo Numerical Simulations Accelerated on GPU and Xeon Phi","International Journal of Parallel Programming","","46","3","10.1007/s10766-017-0509-y","Bastien PlazollesDidier El BazMartin SpelVincent RivolaPascal Gegout","2018","http://link.springer.com/article/10.1007/s10766-017-0509-y","Article"
"Paradigm Shift in Big Data SuperComputing: DataFlow vs. ControlFlow","Journal of Big Data","","2","1","10.1186/s40537-014-0010-z","Nemanja TrifunovicVeljko MilutinovicJakob SalomAnton Kos","2015","http://link.springer.com/article/10.1186/s40537-014-0010-z","Article"
"Scheduling Parallel Computations by Work Stealing: A Survey","International Journal of Parallel Programming","","46","2","10.1007/s10766-016-0484-8","Jixiang YangQingbi He","2018","http://link.springer.com/article/10.1007/s10766-016-0484-8","Article"
"GHOST: Building Blocks for High Performance Sparse Linear Algebra on Heterogeneous Systems","International Journal of Parallel Programming","","45","5","10.1007/s10766-016-0464-z","Moritz KreutzerJonas ThiesMelven Röhrig-ZöllnerAndreas PieperFaisal ShahzadMartin GalgonAchim BasermannHolger FehskeGeorg HagerGerhard Wellein","2017","http://link.springer.com/article/10.1007/s10766-016-0464-z","Article"
"Parallel performance analysis of coupled heat and fluid flow in parallel plate channel using CUDA","Computational and Applied Mathematics","","39","3","10.1007/s40314-020-01244-1","Asif AfzalZahid AnsariM. K. Ramis","2020","http://link.springer.com/article/10.1007/s40314-020-01244-1","Article"
"Elastodynamic full waveform inversion on GPUs with time-space tiling and wavefield reconstruction","The Journal of Supercomputing","","77","3","10.1007/s11227-020-03352-5","Ole Edvard AakerEspen Birger RaknesBørge Arntsen","2021","http://link.springer.com/article/10.1007/s11227-020-03352-5","Article"
"COMPSs-Mobile: Parallel Programming for Mobile Cloud Computing","Journal of Grid Computing","","15","3","10.1007/s10723-017-9409-z","F. LordanRosa M. Badia","2017","http://link.springer.com/article/10.1007/s10723-017-9409-z","Article"
"Implementation and evaluation of parallel FFT on Engineering and Scientific Computation Accelerator (ESCA) architecture","Journal of Zhejiang University SCIENCE C","","12","12","10.1631/jzus.C1100027","Dan WuXue-cheng ZouKui DaiJin-li RaoPan ChenZhao-xia Zheng","2011","http://link.springer.com/article/10.1631/jzus.C1100027","Article"
"Pattern matching of signature-based IDS using Myers algorithm under MapReduce framework","EURASIP Journal on Information Security","","2017","1","10.1186/s13635-017-0062-7","Monther AldwairiAnsam M. Abu-DaloMoath Jarrah","2017","http://link.springer.com/article/10.1186/s13635-017-0062-7","Article"
"Personalizable edge services for Web accessibility","Universal Access in the Information Society","","6","3","10.1007/s10209-007-0091-y","Ugo ErraGennaro IaccarinoDelfina MalandrinoVittorio Scarano","2007","http://link.springer.com/article/10.1007/s10209-007-0091-y","Article"
"3D Tomography Back-Projection Parallelization on Intel FPGAs Using OpenCL","Journal of Signal Processing Systems","","91","7","10.1007/s11265-018-1403-6","Maxime MartelliNicolas GacAlain MérigotCyrille Enderli","2019","http://link.springer.com/article/10.1007/s11265-018-1403-6","Article"
"Interval-based performance modeling for the all-pairs-shortest-path problem on GPUs","The Journal of Supercomputing","","71","11","10.1007/s11227-015-1514-9","Jörg DümmlerSebastian Egerland","2015","http://link.springer.com/article/10.1007/s11227-015-1514-9","Article"
"Highly interactive computational steering for coupled 3D flow problems utilizing multiple GPUs","Computing and Visualization in Science","","13","7","10.1007/s00791-010-0151-3","Jan LinxweilerManfred KrafczykJonas Tölke","2010","http://link.springer.com/article/10.1007/s00791-010-0151-3","Article"
"Performance evaluation of unified memory and dynamic parallelism for selected parallel CUDA applications","The Journal of Supercomputing","","73","12","10.1007/s11227-017-2091-x","Łukasz JarząbekPaweł Czarnul","2017","http://link.springer.com/article/10.1007/s11227-017-2091-x","Article"
"Gravitational search algorithm using CUDA: a case study in high-performance metaheuristics","The Journal of Supercomputing","","71","4","10.1007/s11227-014-1360-1","Amirreza ZarrabiKhairulmizam SamsudinEttikan K. Karuppiah","2015","http://link.springer.com/article/10.1007/s11227-014-1360-1","Article"
"Environment for integration of distributed heterogeneous computing systems","Journal of Internet Services and Applications","","9","1","10.1186/s13174-017-0072-1","Thiago W. B. SilvaDaniel C. MoraisHalamo G. R. AndradeAntonio M. N. LimaElmar U. K. MelcherAlisson V. Brito","2018","http://link.springer.com/article/10.1186/s13174-017-0072-1","Article"
"Implementation of algorithms with a fine-grained parallelism on GPUs","Numerical Analysis and Applications","","4","1","10.1134/S1995423911010058","K. V. Kalgin","2011","http://link.springer.com/article/10.1134/S1995423911010058","Article"
"Scalable SIMD-parallel memory allocation for many-core machines","The Journal of Supercomputing","","64","3","10.1007/s11227-011-0680-7","Xiaohuang HuangChristopher I. RodriguesStephen JonesIan BuckWen-mei Hwu","2013","http://link.springer.com/article/10.1007/s11227-011-0680-7","Article"
"Fast block QR update in digital signal processing","The Journal of Supercomputing","","75","3","10.1007/s11227-018-2298-5","Fran J. AlventosaPedro AlonsoAntonio M. VidalGema PiñeroEnrique S. Quintana-Ortí","2019","http://link.springer.com/article/10.1007/s11227-018-2298-5","Article"
"Accelerated image factorization based on improved NMF algorithm","Journal of Real-Time Image Processing","","15","1","10.1007/s11554-018-0785-9","Minghui SongYuanxi PengTian JiangJun LiSongsong Zhang","2018","http://link.springer.com/article/10.1007/s11554-018-0785-9","Article"
"A preliminary evaluation of OpenACC implementations","The Journal of Supercomputing","","65","3","10.1007/s11227-012-0853-z","Ruymán ReyesIván LópezJuan J. FumeroFrancisco de Sande","2013","http://link.springer.com/article/10.1007/s11227-012-0853-z","Article"
"High-performance pseudo-anonymization of virtual power plant data on a CPU cluster","Cluster Computing","","","","10.1007/s10586-021-03526-7","Mahdi AbbasiAzam Fazel NajafabadiSeifeddine Ben ElghaliMohamed ZerrouguiMohammad R. KhosraviHabib Nasser","2022","http://link.springer.com/article/10.1007/s10586-021-03526-7","Article"
"Optimizing the Matrix Multiplication Using Strassen and Winograd Algorithms with Limited Recursions on Many-Core","International Journal of Parallel Programming","","44","4","10.1007/s10766-015-0378-1","Ayaz ul Hassan KhanMayez Al-MouhamedAllam FatayerNazeeruddin Mohammad","2016","http://link.springer.com/article/10.1007/s10766-015-0378-1","Article"
"Biased solution of integral illumination equation via irradiance caching and path tracing on GPUs","Programming and Computer Software","","37","5","10.1134/S0361768811050021","V. A. FrolovA. A. KharlamovA. V. Ignatenko","2011","http://link.springer.com/article/10.1134/S0361768811050021","Article"
"QoS4IVSaaS: a QoS management framework for intelligent video surveillance as a service","Personal and Ubiquitous Computing","","20","5","10.1007/s00779-016-0945-5","Weishan ZhangPengcheng DuanXiaodan XieFeng XiaQinghua LuXin LiuJiehan Zhou","2016","http://link.springer.com/article/10.1007/s00779-016-0945-5","Article"
"Parallel implementations of frame rate up-conversion algorithm using OpenCL on heterogeneous computing devices","Multimedia Tools and Applications","","78","7","10.1007/s11042-018-6532-1","Huming ZhuDuo WangPeng ZhangZheng LuoLicheng JiaoHong Han","2019","http://link.springer.com/article/10.1007/s11042-018-6532-1","Article"
"Thread-scalable evaluation of multi-jet observables","The European Physical Journal C","","71","7","10.1140/epjc/s10052-011-1703-5","Walter T. GieleGerben C. StavengaJan Winter","2011","http://link.springer.com/article/10.1140/epjc/s10052-011-1703-5","Article"
"Protein alignment algorithms with an efficient backtracking routine on multiple GPUs","BMC Bioinformatics","","12","1","10.1186/1471-2105-12-181","Jacek BlazewiczWojciech FrohmbergMichal KierzynkaErwin PeschPawel Wojciechowski","2011","http://link.springer.com/article/10.1186/1471-2105-12-181","Article"
"Accelerating the scoring module of mass spectrometry-based peptide identification using GPUs","BMC Bioinformatics","","15","1","10.1186/1471-2105-15-121","You LiHao ChiLeihao XiaXiaowen Chu","2014","http://link.springer.com/article/10.1186/1471-2105-15-121","Article"
"A 2589 line topology optimization code written for the graphics card","Computing and Visualization in Science","","14","6","10.1007/s00791-012-0180-1","Stephan SchmidtVolker Schulz","2011","http://link.springer.com/article/10.1007/s00791-012-0180-1","Article"
"Real-time implementation of remotely sensed hyperspectral image unmixing on GPUs","Journal of Real-Time Image Processing","","10","3","10.1007/s11554-012-0269-2","Sergio SánchezRui RamalhoLeonel SousaAntonio Plaza","2015","http://link.springer.com/article/10.1007/s11554-012-0269-2","Article"
"H.264/AVC inter prediction for heterogeneous computing systems","The Journal of Supercomputing","","64","1","10.1007/s11227-012-0782-x","Rafael Rodríguez-SánchezJosé Luis MartínezGerardo Fernández-EscribanoJosé Manuel ClaverJosé L. Sánchez","2013","http://link.springer.com/article/10.1007/s11227-012-0782-x","Article"
"Memory bandwidth optimization of SpMV on GPGPUs","Frontiers of Computer Science","","9","3","10.1007/s11704-014-4127-1","Chenggang Clarence YanHui YuWeizhi XuYingping ZhangBochuan ChenZhu TianYuxuan WangJian Yin","2015","http://link.springer.com/article/10.1007/s11704-014-4127-1","Article"
"Practical Implementation of Prestack Kirchhoff Time Migration on a General Purpose Graphics Processing Unit","Acta Geophysica","","64","4","10.1515/acgeo-2016-0033","Guofeng LiuChun Li","2016","http://link.springer.com/article/10.1515/acgeo-2016-0033","Article"
"Serverless streaming for emerging media: towards 5G network-driven cost optimization","Multimedia Tools and Applications","","","","10.1007/s11042-020-10219-7","Konstantinos KonstantoudakisDavid BreitgandAlexandros DoumanoglouNikolaos ZioulisAvi WeitKyriaki ChristakiPetros DrakoulisEmmanouil ChristakisDimitrios ZarpalasPetros Daras","2021","http://link.springer.com/article/10.1007/s11042-020-10219-7","Article"
"Systolic neighborhood search on graphics processing units","Soft Computing","","18","1","10.1007/s00500-013-1041-7","Pablo VidalFrancisco LunaEnrique Alba","2014","http://link.springer.com/article/10.1007/s00500-013-1041-7","Article"
"A scalable and fast OPTICS for clustering trajectory big data","Cluster Computing","","18","2","10.1007/s10586-014-0413-9","Ze DengYangyang HuMao ZhuXiaohui HuangBo Du","2015","http://link.springer.com/article/10.1007/s10586-014-0413-9","Article"
"Implementation of a Multirate Resampler for Multi-carrier Systems on GPUs","Journal of Signal Processing Systems","","89","3","10.1007/s11265-017-1239-5","Scott C. KimShuvra S. Bhattacharyya","2017","http://link.springer.com/article/10.1007/s11265-017-1239-5","Article"
"GPGPU Based Parallel Implementation of Spectral Correlation Density Function","Journal of Signal Processing Systems","","92","1","10.1007/s11265-019-01448-7","Scott MarshallGarrett VanhoyAli AkogluTamal BoseBo Ryu","2020","http://link.springer.com/article/10.1007/s11265-019-01448-7","Article"
"On parallel software engineering education using python","Education and Information Technologies","","23","1","10.1007/s10639-017-9607-0","Ami Marowka","2018","http://link.springer.com/article/10.1007/s10639-017-9607-0","Article"
"Virtualizing high-end GPGPUs on ARM clusters for the next generation of high performance cloud computing","Cluster Computing","","17","1","10.1007/s10586-013-0341-0","Raffaele MontellaGiulio GiuntaGiuliano Laccetti","2014","http://link.springer.com/article/10.1007/s10586-013-0341-0","Article"
"Enhancing the performance of decision tree-based packet classification algorithms using CPU cluster","Cluster Computing","","23","4","10.1007/s10586-020-03081-7","Mahdi AbbasiAazad Shokrollahi","2020","http://link.springer.com/article/10.1007/s10586-020-03081-7","Article"
"An Adaptive Heterogeneous Runtime Framework for Irregular Applications","Journal of Signal Processing Systems","","80","3","10.1007/s11265-014-0916-x","Chih-Chen KaoWei-Chung Hsu","2015","http://link.springer.com/article/10.1007/s11265-014-0916-x","Article"
"Combining Data and Computation Distribution Directives for Hybrid Parallel Programming : A Transformation System","International Journal of Parallel Programming","","44","6","10.1007/s10766-016-0428-3","Rachid HabelFrédérique Silber-ChaussumierFrançois IrigoinElisabeth BrunetFrançois Trahay","2016","http://link.springer.com/article/10.1007/s10766-016-0428-3","Article"
"Exploiting GPUs with the Super Instruction Architecture","International Journal of Parallel Programming","","44","2","10.1007/s10766-014-0319-4","Nakul JindalVictor LotrichErik DeumensBeverly A. Sanders","2016","http://link.springer.com/article/10.1007/s10766-014-0319-4","Article"
"Accelerating exact and approximate inference for (distributed) discrete optimization with GPUs","Constraints","","23","1","10.1007/s10601-017-9274-1","Ferdinando FiorettoEnrico PontelliWilliam YeohRina Dechter","2018","http://link.springer.com/article/10.1007/s10601-017-9274-1","Article"
"A heterogeneous parallel Red–Black SOR technique and the numerical study on SIMPLE","The Journal of Supercomputing","","76","12","10.1007/s11227-020-03221-1","Ruitian LiLiang GongMinghai Xu","2020","http://link.springer.com/article/10.1007/s11227-020-03221-1","Article"
"A parallel algorithm for the Riesz fractional reaction-diffusion equation with explicit finite difference method","Fractional Calculus and Applied Analysis","","16","3","10.2478/s13540-013-0041-8","Chunye GongWeimin BaoGuojian Tang","2013","http://link.springer.com/article/10.2478/s13540-013-0041-8","Article"
"Specification and Implementation of the Universal Time Coordinated Synchronization Unit (UTCSU)","Real-Time Systems","","12","3","10.1023/A:1007953214631","Klaus SchossmaierUlrich SchmidMartin HorauerDietmar Loy","1997","http://link.springer.com/article/10.1023/A%3A1007953214631","Article"
"Formalised Composition and Interaction for Heterogeneous Structured Parallelism","International Journal of Parallel Programming","","46","1","10.1007/s10766-017-0511-4","Mehdi GoliHoracio González-Vélez","2018","http://link.springer.com/article/10.1007/s10766-017-0511-4","Article"
"MapReduce and Its Applications, Challenges, and Architecture: a Comprehensive Review and Directions for Future Research","Journal of Grid Computing","","15","3","10.1007/s10723-017-9408-0","Seyed Nima KhezrNima Jafari Navimipour","2017","http://link.springer.com/article/10.1007/s10723-017-9408-0","Article"
"Parallel bitsliced AES through PHAST: a single-source high-performance library for multi-cores and GPUs","Journal of Cryptographic Engineering","","9","2","10.1007/s13389-017-0175-4","Biagio PeccerilloSandro BartoliniÇetin Kaya Koç","2019","http://link.springer.com/article/10.1007/s13389-017-0175-4","Article"
"A modified ZS thinning algorithm by a hybrid approach","The Visual Computer","","34","5","10.1007/s00371-017-1407-4","Lynda Ben BoudaoudBasel SolaimanAbdelkamel Tari","2018","http://link.springer.com/article/10.1007/s00371-017-1407-4","Article"
"Toward fault-tolerant hybrid programming over large-scale heterogeneous clusters via checkpointing/restart optimization","The Journal of Supercomputing","","75","8","10.1007/s11227-017-2116-5","Cheng ChenYunfei DuKe ZuoJianbin FangCanqun Yang","2019","http://link.springer.com/article/10.1007/s11227-017-2116-5","Article"
"O2WebCL: an automatic OpenCL-to-WebCL translator for high performance web computing","The Journal of Supercomputing","","71","6","10.1007/s11227-014-1260-4","Myeongjin ChoYoungsun HanMinseong KimSeon Wook Kim","2015","http://link.springer.com/article/10.1007/s11227-014-1260-4","Article"
"Multicore and Manycore Implementations of ADMM-based Decoders for LDPC Decoding","Journal of Signal Processing Systems","","90","11","10.1007/s11265-017-1284-0","Imen DebbabiBertrand Le GalNadia KhoujaFethi TliliChristophe Jégo","2018","http://link.springer.com/article/10.1007/s11265-017-1284-0","Article"
"Understanding the Efficiency of kD-tree Ray-Traversal Techniques over a GPGPU Architecture","International Journal of Parallel Programming","","40","3","10.1007/s10766-011-0186-1","Artur SantosJoão Marcelo TeixeiraThiago FariasVeronica TeichriebJudith Kelner","2012","http://link.springer.com/article/10.1007/s10766-011-0186-1","Article"
"An FPGA accelerator for PatchMatch multi-view stereo using OpenCL","Journal of Real-Time Image Processing","","17","2","10.1007/s11554-017-0745-9","Shunsuke TatsumiMasanori HariyamaKoichi ItoTakafumi Aoki","2020","http://link.springer.com/article/10.1007/s11554-017-0745-9","Article"
"Marching cubes technique for volumetric visualization accelerated with graphics processing units","Journal of the Brazilian Computer Society","","19","3","10.1007/s13173-012-0097-z","Marcos Vinicius Mussel CirneHélio Pedrini","2013","http://link.springer.com/article/10.1007/s13173-012-0097-z","Article"
"Efficient scheduling of streams on GPGPUs","The Journal of Supercomputing","","76","11","10.1007/s11227-020-03209-x","Mohamad Beheshti RouiS. Kazem ShekoftehHamid NooriAhad Harati","2020","http://link.springer.com/article/10.1007/s11227-020-03209-x","Article"
"A Survey of parallel intrusion detection on graphical processors","Central European Journal of Computer Science","","4","4","10.2478/s13537-014-0213-6","Liberios VokorokosMichal EnnertMarek >ČajkovskýJán Radušovský","2014","http://link.springer.com/article/10.2478/s13537-014-0213-6","Article"
"A graphics processing unit-based robust numerical model for solute transport driven by torrential flow condition","Journal of Zhejiang University-SCIENCE A","","22","10","10.1631/jzus.A2000585","Jing-ming HouBao-shan ShiQiu-hua LiangYu TongYong-de KangZhao-an ZhangGang-gang BaiXu-jun GaoXiao Yang","2021","http://link.springer.com/article/10.1631/jzus.A2000585","Article"
"Evaluation of real-time LBP computing in multiple architectures","Journal of Real-Time Image Processing","","13","2","10.1007/s11554-014-0410-5","Miguel Bordallo LópezAlejandro NietoJani BoutellierJari HannukselaOlli Silvén","2017","http://link.springer.com/article/10.1007/s11554-014-0410-5","Article"
"A high-performance batched matrix multiplication framework for GPUs under unbalanced input distribution","The Journal of Supercomputing","","","","10.1007/s11227-021-03936-9","Ruimin WangZhiwei YangHao XuLu Lu","2021","http://link.springer.com/article/10.1007/s11227-021-03936-9","Article"
"CUDAQuat: new parallel framework for fast computation of quaternion moments for color images applications","Cluster Computing","","24","3","10.1007/s10586-021-03271-x","Khalid M. HosnyMohamed M. DarwishAhmad SalahKenli LiAmr M. Abdelatif","2021","http://link.springer.com/article/10.1007/s10586-021-03271-x","Article"
"Efficient discovery of longest-lasting correlation in sequence databases","The VLDB Journal","","25","6","10.1007/s00778-016-0432-7","Yuhong LiLeong Hou UMan Lung YiuZhiguo Gong","2016","http://link.springer.com/article/10.1007/s00778-016-0432-7","Article"
"Accelerating MRI reconstruction via three-dimensional dual-dictionary learning using CUDA","The Journal of Supercomputing","","71","7","10.1007/s11227-015-1386-z","Jiansen LiJianqi SunYing SongJun Zhao","2015","http://link.springer.com/article/10.1007/s11227-015-1386-z","Article"
"Simulating Flows of Viscous Incompressible Fluid on Graphics Processors Using the Splitting Scheme and Multigrid Method","Computational Mathematics and Mathematical Physics","","59","1","10.1134/S0965542519010160","K. N. VolkovV. N. Emel’yanovA. G. KarpenkoI. V. Teterina","2019","http://link.springer.com/article/10.1134/S0965542519010160","Article"
"SPRING: a novel parallel chaos-based image encryption scheme","Nonlinear Dynamics","","92","2","10.1007/s11071-018-4076-6","Wai-Kong LeeRaphael C.-W. PhanWun-She YapBok-Min Goi","2018","http://link.springer.com/article/10.1007/s11071-018-4076-6","Article"
"CUDASW++: optimizing Smith-Waterman sequence database searches for CUDA-enabled graphics processing units","BMC Research Notes","","2","1","10.1186/1756-0500-2-73","Yongchao LiuDouglas L MaskellBertil Schmidt","2009","http://link.springer.com/article/10.1186/1756-0500-2-73","Article"
"Designing a benchmark for the performance evaluation of agent-based simulation applications on HPC","The Journal of Supercomputing","","75","3","10.1007/s11227-018-2688-8","Andreu MorenoJuan J. RodríguezDaniel BeltránAnna SikoraJosep JorbaEduardo César","2019","http://link.springer.com/article/10.1007/s11227-018-2688-8","Article"
"High performance memetic algorithm particle filter for multiple object tracking on modern GPUs","Soft Computing","","16","2","10.1007/s00500-011-0715-2","Raúl CabidoAntonio S. MontemayorJuan J. Pantrigo","2012","http://link.springer.com/article/10.1007/s00500-011-0715-2","Article"
"HGP4CNN: an efficient parallelization framework for training convolutional neural networks on modern GPUs","The Journal of Supercomputing","","77","11","10.1007/s11227-021-03746-z","Hao FuShanjiang TangBingsheng HeCe YuJizhou Sun","2021","http://link.springer.com/article/10.1007/s11227-021-03746-z","Article"
"Volume Visualization: A Technical Overview with a Focus on Medical Applications","Journal of Digital Imaging","","24","4","10.1007/s10278-010-9321-6","Qi ZhangRoy EaglesonTerry M. Peters","2011","http://link.springer.com/article/10.1007/s10278-010-9321-6","Article"
"Parallel LDPC Decoding on GPUs Using a Stream-Based Computing Approach","Journal of Computer Science and Technology","","24","5","10.1007/s11390-009-9266-8","Gabriel FalcãoShinichi YamagiwaVitor SilvaLeonel Sousa","2009","http://link.springer.com/article/10.1007/s11390-009-9266-8","Article"
"A Hybrid Task Graph Scheduler for High Performance Image Processing Workflows","Journal of Signal Processing Systems","","89","3","10.1007/s11265-017-1262-6","Timothy BlattnerWalid KeyrouzShuvra S. BhattacharyyaMilton HalemMary Brady","2017","http://link.springer.com/article/10.1007/s11265-017-1262-6","Article"
"Using low-power platforms for Evolutionary Multi-Objective Optimization algorithms","The Journal of Supercomputing","","73","1","10.1007/s11227-016-1862-0","J. J. MorenoG. OrtegaE. FilatovasJ. A. MartínezEster M. Garzón","2017","http://link.springer.com/article/10.1007/s11227-016-1862-0","Article"
"Improving the performance of the needleman-wunsch algorithm using parallelization and vectorization techniques","Multimedia Tools and Applications","","78","4","10.1007/s11042-017-5092-0","Yaser JararwehMahmoud Al-AyyoubMaged FakirahLuay AlawnehBrij B. Gupta","2019","http://link.springer.com/article/10.1007/s11042-017-5092-0","Article"
"Large-scale graph processing systems: a survey","Frontiers of Information Technology & Electronic Engineering","","21","3","10.1631/FITEE.1900127","Ning LiuDong-sheng LiYi-ming ZhangXiong-lve Li","2020","http://link.springer.com/article/10.1631/FITEE.1900127","Article"
"Enabling collaborative MapReduce on the Cloud with a single-sign-on mechanism","Computing","","98","1 - 2","10.1007/s00607-014-0390-0","Jiaqi ZhaoJie TaoAchim Streit","2016","http://link.springer.com/article/10.1007/s00607-014-0390-0","Article"
"Exploiting Task Parallelism with OpenCL: A Case Study","Journal of Signal Processing Systems","","91","1","10.1007/s11265-018-1416-1","Pekka JääskeläinenVille KorhonenMatias KoskelaJarmo TakalaKaren EgiazarianAram DanielyanCristóvão CruzJames PriceSimon McIntosh-Smith","2019","http://link.springer.com/article/10.1007/s11265-018-1416-1","Article"
"Physical, numerical, and computational challenges of modeling neutrino transport in core-collapse supernovae","Living Reviews in Computational Astrophysics","","6","1","10.1007/s41115-020-00010-8","Anthony MezzacappaEirik EndeveO. E. Bronson MesserStephen W. Bruenn","2020","http://link.springer.com/article/10.1007/s41115-020-00010-8","Article"
"Rolex: resilience-oriented language extensions for extreme-scale systems","The Journal of Supercomputing","","72","12","10.1007/s11227-016-1752-5","Saurabh HukerikarRobert F. Lucas","2016","http://link.springer.com/article/10.1007/s11227-016-1752-5","Article"
"The Design and Implementation of TIDeFlow: A Dataflow-Inspired Execution Model for Parallel Loops and Task Pipelining","International Journal of Parallel Programming","","44","2","10.1007/s10766-015-0373-6","Daniel OrozcoElkin GarciaRobert PavelJaime ArteagaGuang Gao","2016","http://link.springer.com/article/10.1007/s10766-015-0373-6","Article"
"Development of a hybrid parallel MCV-based high-order global shallow-water model","The Journal of Supercomputing","","73","6","10.1007/s11227-017-1958-1","Peng ZhangChao YangChungang ChenXingliang LiXueshun ShenFeng Xiao","2017","http://link.springer.com/article/10.1007/s11227-017-1958-1","Article"
"Poster Session: Computer Assisted Radiology - 22nd International Congress and Exhibition","International Journal of Computer Assisted Radiology and Surgery","","3","1","10.1007/s11548-008-0206-9","","2008","http://link.springer.com/article/10.1007/s11548-008-0206-9","Article"
"Embedded Real-Time H264/AVC High Definition Video Encoder on TI’s KeyStone Multicore DSP","Journal of Signal Processing Systems","","86","1","10.1007/s11265-015-1098-x","Nejmeddine BahriThierry GrandpierreMed Ali Ben AyedNouri MasmoudiMohamed Akil","2017","http://link.springer.com/article/10.1007/s11265-015-1098-x","Article"
"DVM-Approach to the Automation of the Development of Parallel Programs for Clusters","Programming and Computer Software","","45","3","10.1134/S0361768819030034","V. A. BakhtinV. A. Krukov","2019","http://link.springer.com/article/10.1134/S0361768819030034","Article"
"Accelerating bioinspired lateral interaction in accumulative computation for real-time moving object detection with graphics processing units","Natural Computing","","18","2","10.1007/s11047-018-9690-1","José L. SánchezMaría T. LópezJosé Manuel PastorAna E. DelgadoAntonio Fernández-Caballero","2019","http://link.springer.com/article/10.1007/s11047-018-9690-1","Article"
"Simulation of an inelastic dispersive phenomenon: stimulated Brillouin scattering in a single-mode fiber segment through parallelism","The Journal of Supercomputing","","74","7","10.1007/s11227-018-2379-5","R. Sanchez-LaraJ. A. Trejo-SanchezJ. L. Lopez-MartinezJ. A. Alvarez-Chavez","2018","http://link.springer.com/article/10.1007/s11227-018-2379-5","Article"
"Smoothness-Increasing Accuracy-Conserving (SIAC) Filtering for Discontinuous Galerkin Solutions: Improved Errors Versus Higher-Order Accuracy","Journal of Scientific Computing","","53","1","10.1007/s10915-012-9593-8","James KingHanieh MirzaeeJennifer K. RyanRobert M. Kirby","2012","http://link.springer.com/article/10.1007/s10915-012-9593-8","Article"
"HipaccVX: wedding of OpenVX and DSL-based code generation","Journal of Real-Time Image Processing","","18","3","10.1007/s11554-020-01015-5","M. Akif ÖzkanBurak OkBo QiaoJürgen TeichFrank Hannig","2021","http://link.springer.com/article/10.1007/s11554-020-01015-5","Article"
"Efficient application of GPGPU for lava flow hazard mapping","The Journal of Supercomputing","","65","2","10.1007/s11227-013-0949-0","Donato D’AmbrosioGiuseppe FilipponeDavide MaroccoRocco RongoWilliam Spataro","2013","http://link.springer.com/article/10.1007/s11227-013-0949-0","Article"
"Fast extraction of neuron morphologies from large-scale SBFSEM image stacks","Journal of Computational Neuroscience","","31","3","10.1007/s10827-011-0316-1","Stefan LangPanos DrouvelisEnkelejda TafajPeter BastianBert Sakmann","2011","http://link.springer.com/article/10.1007/s10827-011-0316-1","Article"
"Application-aware NoC management in GPUs multitasking","The Journal of Supercomputing","","75","8","10.1007/s11227-018-2694-x","Zhen XuXia ZhaoZhiying WangCanqun Yang","2019","http://link.springer.com/article/10.1007/s11227-018-2694-x","Article"
"Optimizing Monte Carlo radiosity on graphics hardware","The Journal of Supercomputing","","58","2","10.1007/s11227-009-0353-y","J. R. SanjurjoM. AmorM. BóoR. DoalloJ. Casares","2011","http://link.springer.com/article/10.1007/s11227-009-0353-y","Article"
"Parallel refinement of slanted 3D reconstruction using dense stereo induced from symmetry","Journal of Real-Time Image Processing","","16","4","10.1007/s11554-016-0592-0","Ricardo RalhaGabriel FalcaoJoao AmaroVasco MotaMichel AntunesJoao BarretoUrbano Nunes","2019","http://link.springer.com/article/10.1007/s11554-016-0592-0","Article"
"Fast network centrality analysis using GPUs","BMC Bioinformatics","","12","1","10.1186/1471-2105-12-149","Zhiao ShiBing Zhang","2011","http://link.springer.com/article/10.1186/1471-2105-12-149","Article"
"Parallel strategies for 2D Discrete Wavelet Transform in shared memory systems and GPUs","The Journal of Supercomputing","","64","1","10.1007/s11227-012-0750-5","V. GalianoO. LópezM. P. MalumbresH. Migallón","2013","http://link.springer.com/article/10.1007/s11227-012-0750-5","Article"
"How separable median filters can get better results than full 2D versions","The Journal of Supercomputing","","","","10.1007/s11227-021-04233-1","Gilles PerrotStéphane DomasRaphaël Couturier","2022","http://link.springer.com/article/10.1007/s11227-021-04233-1","Article"
"A CUDA-powered method for the feature extraction and unsupervised analysis of medical images","The Journal of Supercomputing","","77","8","10.1007/s11227-020-03565-8","Leonardo RundoAndrea TangherloniPaolo CazzanigaMatteo MistriSimone GalimbertiRamona WoitekEvis SalaGiancarlo MauriMarco S. Nobile","2021","http://link.springer.com/article/10.1007/s11227-020-03565-8","Article"
"DQN-based OpenCL workload partition for performance optimization","The Journal of Supercomputing","","75","8","10.1007/s11227-019-02766-0","Sanghyun ParkTaeweon Suh","2019","http://link.springer.com/article/10.1007/s11227-019-02766-0","Article"
"Tuning framework for stencil computation in heterogeneous parallel platforms","The Journal of Supercomputing","","72","2","10.1007/s11227-015-1575-9","Taieb Lamine Ben CheikhAlexandra AguiarSofiene TaharGabriela Nicolescu","2016","http://link.springer.com/article/10.1007/s11227-015-1575-9","Article"
"Three-dimensional multi-phase-field simulation of eutectoid alloy based on OpenCL parallel","China Foundry","","18","3","10.1007/s41230-021-0123-x","Chang-sheng ZhuYu-jie LiFang-lan MaLi FengPeng Lei","2021","http://link.springer.com/article/10.1007/s41230-021-0123-x","Article"
"A survey on platforms for big data analytics","Journal of Big Data","","2","1","10.1186/s40537-014-0008-6","Dilpreet SinghChandan K Reddy","2014","http://link.springer.com/article/10.1186/s40537-014-0008-6","Article"
"Prediction of drug solubility on parallel computing architecture by support vector machines","Network Modeling Analysis in Health Informatics and Bioinformatics","","7","1","10.1007/s13721-018-0174-0","P. RajendraA. SubbaraoG. RamuV. Brahmajirao","2018","http://link.springer.com/article/10.1007/s13721-018-0174-0","Article"
"Hybrid Parallel Bundle Adjustment for 3D Scene Reconstruction with Massive Points","Journal of Computer Science and Technology","","27","6","10.1007/s11390-012-1303-3","Xin LiuWei GaoZhan-Yi Hu","2012","http://link.springer.com/article/10.1007/s11390-012-1303-3","Article"
"A new approach to fluid–structure interaction within graphics hardware accelerated smooth particle hydrodynamics considering heterogeneous particle size distribution","Computational Particle Mechanics","","5","3","10.1007/s40571-017-0176-1","Adnan EghtesadMarko Knezevic","2018","http://link.springer.com/article/10.1007/s40571-017-0176-1","Article"
"Computing and visualizing popular places","Knowledge and Information Systems","","40","2","10.1007/s10115-013-0639-5","Marta FortJ. Antoni SellarèsNacho Valladares","2014","http://link.springer.com/article/10.1007/s10115-013-0639-5","Article"
"SS-ITS: secure scalable intelligent transportation systems","The Journal of Supercomputing","","77","7","10.1007/s11227-020-03582-7","Asma BelhadiYoucef DjenouriGautam SrivastavaJerry Chun-Wei Lin","2021","http://link.springer.com/article/10.1007/s11227-020-03582-7","Article"
"Accelerating metagenomic read classification on CUDA-enabled GPUs","BMC Bioinformatics","","18","1","10.1186/s12859-016-1434-6","Robin KobusChristian HundtAndré MüllerBertil Schmidt","2017","http://link.springer.com/article/10.1186/s12859-016-1434-6","Article"
"Towards energy-efficient parallel analysis of neural signals","Cluster Computing","","16","1","10.1007/s10586-011-0175-6","Dan ChenDongcuan LuMingwei TianShan HeShuaiting WangJian TianChang CaiXiaoli Li","2013","http://link.springer.com/article/10.1007/s10586-011-0175-6","Article"
"Parallel implementation and optimization of high definition video real-time dehazing","Multimedia Tools and Applications","","76","22","10.1007/s11042-016-4036-4","Huailiang TanXiaofei HeZijian WangGaoming Liu","2017","http://link.springer.com/article/10.1007/s11042-016-4036-4","Article"
"Low-Latency Elliptic Curve Scalar Multiplication","International Journal of Parallel Programming","","40","5","10.1007/s10766-012-0198-5","Joppe W. Bos","2012","http://link.springer.com/article/10.1007/s10766-012-0198-5","Article"
"Effective NC machining simulation with OptiX ray tracing engine","The Visual Computer","","35","2","10.1007/s00371-018-1497-7","Marc JachymSylvain LavernheCharly EuzenatChristophe Tournier","2019","http://link.springer.com/article/10.1007/s00371-018-1497-7","Article"
"Similarity (range and kNN) queries processing on an Intel Xeon Phi coprocessor","Cluster Computing","","19","1","10.1007/s10586-015-0515-z","Carlos M. ToledoRicardo J. BarrientosAndrés I. Ávila","2016","http://link.springer.com/article/10.1007/s10586-015-0515-z","Article"
"Towards Accelerated Genome Informatics on Parallel HPC Platforms: The ReneGENE-GI Perspective","Journal of Signal Processing Systems","","92","10","10.1007/s11265-019-01452-x","Santhi NatarajanKrishna Kumar N.Debnath PalS. K. Nandy","2020","http://link.springer.com/article/10.1007/s11265-019-01452-x","Article"
"A statistical performance analyzer framework for OpenCL kernels on Nvidia GPUs","The Journal of Supercomputing","","71","8","10.1007/s11227-014-1338-z","Ali KaramiFarshad KhunjushSeyyed Ali Mirsoleimani","2015","http://link.springer.com/article/10.1007/s11227-014-1338-z","Article"
"Using heterogeneous computing for scattering prediction in scenarios with several source configurations","The Journal of Supercomputing","","73","1","10.1007/s11227-015-1618-2","M. López-PortuguésJ. A. López-FernándezJosé RanillaR. G. AyestaránF. Las-Heras","2017","http://link.springer.com/article/10.1007/s11227-015-1618-2","Article"
"Demand look-ahead memory access scheduling for 3D graphics processing units","Multimedia Tools and Applications","","73","3","10.1007/s11042-013-1639-x","Chih-Chieh HsiaoMin-Jen LoSlo-Li Chu","2014","http://link.springer.com/article/10.1007/s11042-013-1639-x","Article"
"Networking and communication challenges for post-exascale systems","Frontiers of Information Technology & Electronic Engineering","","19","10","10.1631/FITEE.1800631","Dhabaleswar PandaXiao-Yi LuHari Subramoni","2018","http://link.springer.com/article/10.1631/FITEE.1800631","Article"
"Optimization Strategies Oriented to Loop Characteristics in Software Thread Level Speculation Systems","Journal of Computer Science and Technology","","31","1","10.1007/s11390-016-1612-z","Li ShenFan XuZhi-Ying Wang","2016","http://link.springer.com/article/10.1007/s11390-016-1612-z","Article"
"Heterogeneous Computing Utilizing FPGAs","Journal of Signal Processing Systems","","91","7","10.1007/s11265-018-1382-7","Marc ReichenbachPhilipp HolzingerKonrad HäubleinTobias LieskePaul BlinzerDietmar Fey","2019","http://link.springer.com/article/10.1007/s11265-018-1382-7","Article"
"Survey and design of paleozoic: a high-performance compiler tool chain for deep learning inference accelerator","CCF Transactions on High Performance Computing","","2","4","10.1007/s42514-020-00044-7","Zihan LiuJingwen LengGuandong LuChenhui WangQuan ChenMinyi Guo","2020","http://link.springer.com/article/10.1007/s42514-020-00044-7","Article"
"Simulation of one-layer shallow water systems on multicore and CUDA architectures","The Journal of Supercomputing","","58","2","10.1007/s11227-010-0406-2","Marc de la AsunciónJosé M. MantasManuel J. Castro","2011","http://link.springer.com/article/10.1007/s11227-010-0406-2","Article"
"Real-time H264/AVC encoder based on enhanced frame level parallelism for smart multicore DSP camera","Journal of Real-Time Image Processing","","12","4","10.1007/s11554-014-0470-6","Nejmeddine BahriNidhameddine BelhadjThierry GrandpierreMohamed Ali Ben AyedNouri MasmoudiMohamed Akil","2016","http://link.springer.com/article/10.1007/s11554-014-0470-6","Article"
"Parallel Smith-Waterman Comparison on Multicore and Manycore Computing Platforms with BSP++","International Journal of Parallel Programming","","41","1","10.1007/s10766-012-0209-6","Khaled HamidoucheFernando Machado MendoncaJoel FalcouAlba Cristina Magalhaes Alves de MeloDaniel Etiemble","2013","http://link.springer.com/article/10.1007/s10766-012-0209-6","Article"
"PrefixFPM: a parallel framework for general-purpose mining of frequent and closed patterns","The VLDB Journal","","","","10.1007/s00778-021-00687-0","Da YanWenwen QuGuimu GuoXiaoling WangYang Zhou","2021","http://link.springer.com/article/10.1007/s00778-021-00687-0","Article"
"Bio-inspired computation for big data fusion, storage, processing, learning and visualization: state of the art and future directions","Neural Computing and Applications","","","","10.1007/s00521-021-06332-9","Ana I. Torre-BastidaJosu Díaz-de-ArcayaEneko OsabaKhan MuhammadDavid CamachoJavier Del Ser","2021","http://link.springer.com/article/10.1007/s00521-021-06332-9","Article"
"Real-time Visual Tracker by Stream Processing","Journal of Signal Processing Systems","","57","2","10.1007/s11265-008-0250-2","Oscar Mateo LozanoKazuhiro Otsuka","2009","http://link.springer.com/article/10.1007/s11265-008-0250-2","Article"
"clusterCL: comprehensive support for multi-kernel data-parallel applications in heterogeneous asymmetric clusters","The Journal of Supercomputing","","76","12","10.1007/s11227-020-03234-w","Valon RacaEduard Mehofer","2020","http://link.springer.com/article/10.1007/s11227-020-03234-w","Article"
"Automatic translation of data parallel programs for heterogeneous parallelism through OpenMP offloading","The Journal of Supercomputing","","77","5","10.1007/s11227-020-03452-2","Farui WangWeizhe ZhangHaonan GuoMeng HaoGangzhao LuZheng Wang","2021","http://link.springer.com/article/10.1007/s11227-020-03452-2","Article"
"Research on financial management of Guangdong-Hong Kong-macao greater Bay Area based on LS-SVM algorithm and multi-model fusion","Annals of Operations Research","","","","10.1007/s10479-021-04398-1","Liu YixinZhang Miao","2021","http://link.springer.com/article/10.1007/s10479-021-04398-1","Article"
"Jittor: a novel deep learning framework with meta-operators and unified graph execution","Science China Information Sciences","","63","12","10.1007/s11432-020-3097-4","Shi-Min HuDun LiangGuo-Ye YangGuo-Wei YangWen-Yang Zhou","2020","http://link.springer.com/article/10.1007/s11432-020-3097-4","Article"
"On-line range images registration with GPGPU","Opto-Electronics Review","","21","1","10.2478/s11772-013-0074-x","J. BędkowskiJ. Naruniec","2013","http://link.springer.com/article/10.2478/s11772-013-0074-x","Article"
"Adaptation and optimization of basic operations for an unstructured mesh CFD algorithm for computation on massively parallel accelerators","Computational Mathematics and Mathematical Physics","","53","8","10.1134/S0965542513080046","P. B. BogdanovA. V. GorobetsS. A. Sukov","2013","http://link.springer.com/article/10.1134/S0965542513080046","Article"
"Parallel Rendering and Animation of Subdivision Surfaces on the Cell BE Processor","International Journal of Parallel Programming","","39","4","10.1007/s10766-010-0153-2","L. BeniniR. GrottesiS. MorigiM. Ruggiero","2011","http://link.springer.com/article/10.1007/s10766-010-0153-2","Article"
"The TianHe-1A Supercomputer: Its Hardware and Software","Journal of Computer Science and Technology","","26","3","10.1007/s02011-011-1137-8","Xue-Jun YangXiang-Ke LiaoKai LuQing-Feng HuJun-Qiang SongJin-Shu Su","2011","http://link.springer.com/article/10.1007/s02011-011-1137-8","Article"
"Software Tools for Automation of Parallel Programming on the Basis of Algebra of Algorithms","Cybernetics and Systems Analysis","","51","1","10.1007/s10559-015-9706-0","F. I. AndonA. E. DoroshenkoA. G. BeketovV. A. IovchevE. A. Yatsenko","2015","http://link.springer.com/article/10.1007/s10559-015-9706-0","Article"
"ginSODA: massive parallel integration of stiff ODE systems on GPUs","The Journal of Supercomputing","","75","12","10.1007/s11227-018-2549-5","Marco S. NobilePaolo CazzanigaDaniela BesozziGiancarlo Mauri","2019","http://link.springer.com/article/10.1007/s11227-018-2549-5","Article"
"Large-scale paralleled sparse principal component analysis","Multimedia Tools and Applications","","75","3","10.1007/s11042-014-2004-4","W. LiuH. ZhangD. TaoY. WangK. Lu","2016","http://link.springer.com/article/10.1007/s11042-014-2004-4","Article"
"Vehicle-mounted surround vision algorithm based on heterogeneous architecture","Multimedia Tools and Applications","","79","33 - 34","10.1007/s11042-020-09209-6","Tong LiuJindong ZhangKunpeng ZhangJiabin XuDonghui WangXue Wang","2020","http://link.springer.com/article/10.1007/s11042-020-09209-6","Article"
"HCudaBLAST: an implementation of BLAST on Hadoop and Cuda","Journal of Big Data","","4","1","10.1186/s40537-017-0102-7","Nilay KhareAlind KhareFarhan Khan","2017","http://link.springer.com/article/10.1186/s40537-017-0102-7","Article"
"A suite of parallel algorithms for efficient band selection from hyperspectral images","Journal of Real-Time Image Processing","","15","3","10.1007/s11554-018-0765-0","Alessandro FontanellaElisa MarenziEmanuele TortiGiovanni DaneseAntonio PlazaFrancesco Leporati","2018","http://link.springer.com/article/10.1007/s11554-018-0765-0","Article"
"High-Level Parallel Ant Colony Optimization with Algorithmic Skeletons","International Journal of Parallel Programming","","49","6","10.1007/s10766-021-00714-1","Breno A. de Melo MenezesNina HerrmannHerbert KuchenFernando Buarque de Lima Neto","2021","http://link.springer.com/article/10.1007/s10766-021-00714-1","Article"
"Real-time stereo to multi-view conversion system based on adaptive meshing","Journal of Real-Time Image Processing","","14","2","10.1007/s11554-015-0490-x","Shao-Jun YaoLiang-Hao WangCheng-Liang LinMing Zhang","2018","http://link.springer.com/article/10.1007/s11554-015-0490-x","Article"
"Review of deep learning: concepts, CNN architectures, challenges, applications, future directions","Journal of Big Data","","8","1","10.1186/s40537-021-00444-8","Laith AlzubaidiJinglan ZhangAmjad J. HumaidiAyad Al-DujailiYe DuanOmran Al-ShammaJ. SantamaríaMohammed A. FadhelMuthana Al-AmidieLaith Farhan","2021","http://link.springer.com/article/10.1186/s40537-021-00444-8","Article"
"Complexity analysis of software defined DVB-T2 physical layer","Analog Integrated Circuits and Signal Processing","","69","2 - 3","10.1007/s10470-011-9724-4","Stefan GrönroosKristian NybomJerker Björkqvist","2011","http://link.springer.com/article/10.1007/s10470-011-9724-4","Article"
"A fast framework construction and visualization method for particle-based fluid","EURASIP Journal on Image and Video Processing","","2017","1","10.1186/s13640-017-0227-9","Fengquan ZhangZhaowei WangJian ChangJianjun ZhangFeng Tian","2017","http://link.springer.com/article/10.1186/s13640-017-0227-9","Article"
"Energy efficiency of load balancing for data-parallel applications in heterogeneous systems","The Journal of Supercomputing","","73","1","10.1007/s11227-016-1864-y","Borja PérezEsteban StaffordJosé Luis BosqueRamón Beivide","2017","http://link.springer.com/article/10.1007/s11227-016-1864-y","Article"
"A fast template matching-based algorithm for railway bolts detection","International Journal of Machine Learning and Cybernetics","","5","6","10.1007/s13042-013-0223-z","Yunguang DouYaping HuangQingyong LiSiwei Luo","2014","http://link.springer.com/article/10.1007/s13042-013-0223-z","Article"
"Comparative evaluation of platforms for parallel Ant Colony Optimization","The Journal of Supercomputing","","69","1","10.1007/s11227-014-1154-5","Ginés D. GuerreroJosé M. CeciliaAntonio LlanesJosé M. GarcíaMartyn AmosManuel Ujaldón","2014","http://link.springer.com/article/10.1007/s11227-014-1154-5","Article"
"Low-Latency Software Polar Decoders","Journal of Signal Processing Systems","","90","5","10.1007/s11265-016-1157-y","Pascal GiardGabi SarkisCamille LerouxClaude ThibeaultWarren J. Gross","2018","http://link.springer.com/article/10.1007/s11265-016-1157-y","Article"
"A two-level real-time vision machine combining coarse- and fine-grained parallelism","Journal of Real-Time Image Processing","","5","4","10.1007/s11554-010-0159-4","Lars Baunegaard With JensenAnders Kjær-NielsenKarl PauwelsJeppe Barsøe JessenMarc Van HulleNorbert Krüger","2010","http://link.springer.com/article/10.1007/s11554-010-0159-4","Article"
"GPUs and chaos: a new true random number generator","Nonlinear Dynamics","","82","4","10.1007/s11071-015-2287-7","Je Sen TehAzman SamsudinMishal Al-MazrooieAmir Akhavan","2015","http://link.springer.com/article/10.1007/s11071-015-2287-7","Article"
"Embedded real-time infrared and visible image fusion for UAV surveillance","Journal of Real-Time Image Processing","","18","6","10.1007/s11554-021-01111-0","Jun LiYuanxi PengTian Jiang","2021","http://link.springer.com/article/10.1007/s11554-021-01111-0","Article"
"Speeding Up Cycle Based Logic Simulation Using Graphics Processing Units","International Journal of Parallel Programming","","39","5","10.1007/s10766-011-0164-7","Alper SenBaris AksanliMurat Bozkurt","2011","http://link.springer.com/article/10.1007/s10766-011-0164-7","Article"
"Parallel simulation of Population Dynamics P systems: updates and roadmap","Natural Computing","","15","4","10.1007/s11047-016-9566-1","Miguel A. Martínez-del-AmorLuis F. Macías-RamosLuis Valencia-CabreraMario J. Pérez-Jiménez","2016","http://link.springer.com/article/10.1007/s11047-016-9566-1","Article"
"DRMaestro: orchestrating disaggregated resources on virtualized data-centers","Journal of Cloud Computing","","10","1","10.1186/s13677-021-00238-6","Marcelo AmaralJordà PoloDavid CarreraNelson GonzalezChih-Chieh YangAlessandro MorariBruce D’AmoraAlaa YoussefMalgorzata Steinder","2021","http://link.springer.com/article/10.1186/s13677-021-00238-6","Article"
"Monte Carlo Simulation of the Solar Radiation Transfer in a Cloudy Atmosphere with the Use of Graphic Processor and NVIDIA CUDA Technology","Atmospheric and Oceanic Optics","","31","2","10.1134/S1024856018020100","T. V. Russkova","2018","http://link.springer.com/article/10.1134/S1024856018020100","Article"
"Optimizing memory bandwidth exploitation for OpenVX applications on embedded many-core accelerators","Journal of Real-Time Image Processing","","15","1","10.1007/s11554-015-0544-0","Giuseppe TagliaviniGermain HaugouAndrea MarongiuLuca Benini","2018","http://link.springer.com/article/10.1007/s11554-015-0544-0","Article"
"Improvement of workload balancing using parallel loop self-scheduling on Intel Xeon Phi","The Journal of Supercomputing","","73","11","10.1007/s11227-017-2068-9","Chao-Tung YangChao-Wei HuangShuo-Tsung Chen","2017","http://link.springer.com/article/10.1007/s11227-017-2068-9","Article"
"Survey of external memory large-scale graph processing on a multi-core system","The Journal of Supercomputing","","76","1","10.1007/s11227-019-03023-0","Jianqiang HuangWei QinXiaoying WangWenguang Chen","2020","http://link.springer.com/article/10.1007/s11227-019-03023-0","Article"
"Towards efficient tile low-rank GEMM computation on sunway many-core processors","The Journal of Supercomputing","","77","5","10.1007/s11227-020-03444-2","Qingchang HanHailong YangMing DunZhongzhi LuanLin GanGuangwen YangDepei Qian","2021","http://link.springer.com/article/10.1007/s11227-020-03444-2","Article"
"Special issue on evolutionary computation on general purpose graphics processing units","Soft Computing","","16","2","10.1007/s00500-011-0719-y","José L. Risco-MartínJuan LancharesCarlos A. Coello-Coello","2012","http://link.springer.com/article/10.1007/s00500-011-0719-y","Article"
"Performance and energy effects on task-based parallelized applications","The Journal of Supercomputing","","74","6","10.1007/s11227-018-2294-9","Helena CaminalDiego CaballeroJuan M. CebriánRoger FerrerMarc CasasMiquel MoretóXavier MartorellMateo Valero","2018","http://link.springer.com/article/10.1007/s11227-018-2294-9","Article"
"Region-based parallelization of irregular reductions on explicitly managed memory hierarchies","The Journal of Supercomputing","","56","1","10.1007/s11227-009-0340-3","Seonggun KimHwansoo HanKwang-Moo Choe","2011","http://link.springer.com/article/10.1007/s11227-009-0340-3","Article"
"Performance evaluation of enhancement of the layered self-scheduling approach for heterogeneous multicore cluster systems","The Journal of Supercomputing","","62","1","10.1007/s11227-011-0726-x","Chao-Chin WuLien-Fu LaiLiang-Tsung HuangMingLung Chen","2012","http://link.springer.com/article/10.1007/s11227-011-0726-x","Article"
"Big Data Management: What to Keep from the Past to Face Future Challenges?","Data Science and Engineering","","2","4","10.1007/s41019-017-0043-3","G. Vargas-SolarJ. L. Zechinelli-MartiniJ. A. Espinosa-Oviedo","2017","http://link.springer.com/article/10.1007/s41019-017-0043-3","Article"
"KPN-based parallelization of Wu–Manber algorithm on multi-core machines","Cluster Computing","","23","2","10.1007/s10586-019-02955-9","Monther AldwairiAbdulmughni Y. HamzahMoath Jarrah","2020","http://link.springer.com/article/10.1007/s10586-019-02955-9","Article"
"IMB-ASYNC: a revised method and benchmark to estimate MPI-3 asynchronous progress efficiency","Cluster Computing","","","","10.1007/s10586-021-03452-8","Alexey V. Medvedev","2022","http://link.springer.com/article/10.1007/s10586-021-03452-8","Article"
"Characterizing the efficiency of multicore and manycore processors for the solution of sparse linear systems","Computer Science - Research and Development","","31","4","10.1007/s00450-015-0299-7","José I. AliagaMaría BarredaErnesto DufrechouPablo EzzattiEnrique S. Quintana-Ortí","2016","http://link.springer.com/article/10.1007/s00450-015-0299-7","Article"
"Loop Parallelization Techniques for FPGA Accelerator Synthesis","Journal of Signal Processing Systems","","90","1","10.1007/s11265-017-1229-7","Oliver ReicheM. Akif ÖzkanFrank HannigJürgen TeichMoritz Schmid","2018","http://link.springer.com/article/10.1007/s11265-017-1229-7","Article"
"A Fast Parallel Implementation of a PTAS for Fractional Packing and Covering Linear Programs","International Journal of Parallel Programming","","43","5","10.1007/s10766-015-0352-y","Slobodan JelićSören LaueDomagoj MatijevićPatrick Wijerama","2015","http://link.springer.com/article/10.1007/s10766-015-0352-y","Article"
"Parallel algorithms for large-scale biological sequence alignment on Xeon-Phi based clusters","BMC Bioinformatics","","17","9","10.1186/s12859-016-1128-0","Haidong LanYuandong ChanKai XuBertil SchmidtShaoliang PengWeiguo Liu","2016","http://link.springer.com/article/10.1186/s12859-016-1128-0","Article"
"Explicit Fourth-Order Runge–Kutta Method on Intel Xeon Phi Coprocessor","International Journal of Parallel Programming","","45","5","10.1007/s10766-016-0458-x","Beata BylinaJoanna Potiopa","2017","http://link.springer.com/article/10.1007/s10766-016-0458-x","Article"
"Energy aware scheduling model and online heuristics for stencil codes on heterogeneous computing architectures","Cluster Computing","","20","3","10.1007/s10586-016-0686-2","Milosz CiznickiKrzysztof KurowskiJan Weglarz","2017","http://link.springer.com/article/10.1007/s10586-016-0686-2","Article"
"Adaptive sparse matrix representation for efficient matrix–vector multiplication","The Journal of Supercomputing","","72","9","10.1007/s11227-015-1571-0","Pantea ZardoshtiFarshad KhunjushHamid Sarbazi-Azad","2016","http://link.springer.com/article/10.1007/s11227-015-1571-0","Article"
"Multi-level complexity reduction for HEVC multiview coding","Journal of Real-Time Image Processing","","17","2","10.1007/s11554-018-0757-0","Caoyang JiangSaeid Nooshabadi","2020","http://link.springer.com/article/10.1007/s11554-018-0757-0","Article"
"A CUDA approach to compute perishable inventory control policies using value iteration","The Journal of Supercomputing","","75","3","10.1007/s11227-018-2692-z","G. OrtegaE. M. T. HendrixI. García","2019","http://link.springer.com/article/10.1007/s11227-018-2692-z","Article"
"A Review of High-Performance Computational Strategies for Modeling and Imaging of Electromagnetic Induction Data","Surveys in Geophysics","","35","1","10.1007/s10712-013-9260-0","Gregory A. Newman","2014","http://link.springer.com/article/10.1007/s10712-013-9260-0","Article"
"Visual analysis and simulation of dam-break flood spatiotemporal process in a network environment","Environmental Earth Sciences","","74","10","10.1007/s12665-015-4418-3","Lingzhi YinJun ZhuXiang ZhangYi LiJinhong WangHeng ZhangXiaofeng Yang","2015","http://link.springer.com/article/10.1007/s12665-015-4418-3","Article"
"A comparison study of wavelet transforms for the visualization of differentially methylated regions in DNA samples","The Journal of Supercomputing","","77","3","10.1007/s11227-020-03269-z","Lisardo FernándezMariano PérezJuan M. Orduña","2021","http://link.springer.com/article/10.1007/s11227-020-03269-z","Article"
"Comparison and Computational Performance of Tsunami-HySEA and MOST Models for LANTEX 2013 Scenario: Impact Assessment on Puerto Rico Coasts","Pure and Applied Geophysics","","173","12","10.1007/s00024-016-1387-8","Jorge MacíasAurelio MercadoJosé Manuel González-VidaSergio OrtegaManuel Jesús Castro","2016","http://link.springer.com/article/10.1007/s00024-016-1387-8","Article"
"GLSC: LSC superpixels at over 130 FPS","Journal of Real-Time Image Processing","","14","3","10.1007/s11554-016-0652-5","Zhihua BanJianguo LiuJeremy Fouriaux","2018","http://link.springer.com/article/10.1007/s11554-016-0652-5","Article"
"Accelerating Scalar-Product Based Sequence Alignment using Graphics Processor Units","Journal of Signal Processing Systems","","61","2","10.1007/s11265-009-0409-5","Cem Savas BassoySvetlana TorgasinMei YangKarl-Heinz Zimmermann","2010","http://link.springer.com/article/10.1007/s11265-009-0409-5","Article"
"Poster Session CAR","International Journal of Computer Assisted Radiology and Surgery","","2","1","10.1007/s11548-007-0113-5","","2007","http://link.springer.com/article/10.1007/s11548-007-0113-5","Article"
"Faster modular arithmetic for isogeny-based crypto on embedded devices","Journal of Cryptographic Engineering","","10","2","10.1007/s13389-019-00214-6","Joppe W. BosSimon J. Friedberger","2020","http://link.springer.com/article/10.1007/s13389-019-00214-6","Article"
"Refactoring software to heterogeneous parallel platforms","The Journal of Supercomputing","","75","8","10.1007/s11227-019-02942-2","J. Daniel Garcia","2019","http://link.springer.com/article/10.1007/s11227-019-02942-2","Article"
"A dynamic CTA scheduling scheme for massive parallel computing","Cluster Computing","","20","1","10.1007/s10586-017-0768-9","Dong Oh SonCong Thuan DoHong Jun ChoiJiseung NamCheol Hong Kim","2017","http://link.springer.com/article/10.1007/s10586-017-0768-9","Article"
"A Hybrid Circular Queue Method for Iterative Stencil Computations on GPUs","Journal of Computer Science and Technology","","27","1","10.1007/s11390-012-1206-3","Yang YangHui-Min CuiXiao-Bing FengJing-Ling Xue","2012","http://link.springer.com/article/10.1007/s11390-012-1206-3","Article"
"MeterPU: a generic measurement abstraction API","The Journal of Supercomputing","","74","11","10.1007/s11227-016-1792-x","Lu LiChristoph Kessler","2018","http://link.springer.com/article/10.1007/s11227-016-1792-x","Article"
"Multilevel parallelism optimization of stencil computations on SIMDlized NUMA architectures","The Journal of Supercomputing","","77","11","10.1007/s11227-021-03823-3","Kaifang ZhangHuayou SuYong Dou","2021","http://link.springer.com/article/10.1007/s11227-021-03823-3","Article"
"The state of the art and taxonomy of big data analytics: view from new big data framework","Artificial Intelligence Review","","53","2","10.1007/s10462-019-09685-9","Azlinah MohamedMaryam Khanian NajafabadiYap Bee WahEzzatul Akmal Kamaru ZamanRuhaila Maskat","2020","http://link.springer.com/article/10.1007/s10462-019-09685-9","Article"
"Probability/Possibility Systems for Modeling of Random/Fuzzy Information with Parallelization Consideration","International Journal of Fuzzy Systems","","21","6","10.1007/s40815-019-00627-9","Wei Mei","2019","http://link.springer.com/article/10.1007/s40815-019-00627-9","Article"
"Guest Editorial: High-Level Parallel Programming and the Road to High Performance","International Journal of Parallel Programming","","47","2","10.1007/s10766-018-0606-6","J. Daniel GarcíaArturo Gonzalez-Escribano","2019","http://link.springer.com/article/10.1007/s10766-018-0606-6","Article"
"Composition of weighted finite transducers in MapReduce","Journal of Big Data","","8","1","10.1186/s40537-020-00397-4","Bilal ElghadyryFaissal OuardiSébastien Verel","2021","http://link.springer.com/article/10.1186/s40537-020-00397-4","Article"
"Automatic tuning of sparse matrix-vector multiplication on multicore clusters","Science China Information Sciences","","58","9","10.1007/s11432-014-5254-x","ShiGang LiChangJun HuJunChao ZhangYunQuan Zhang","2015","http://link.springer.com/article/10.1007/s11432-014-5254-x","Article"
"Hybrid static–dynamic selection of implementation alternatives in heterogeneous environments","The Journal of Supercomputing","","75","8","10.1007/s11227-017-2147-y","D. del Rio AstorgaManuel F. DolzJavier FernandezJavier Garcia Blas","2019","http://link.springer.com/article/10.1007/s11227-017-2147-y","Article"
"Future Simulations of Tidal Disruption Events","Space Science Reviews","","216","5","10.1007/s11214-020-00680-z","Julian H. KrolikPhilip J. ArmitageYanfei JiangGiuseppe Lodato","2020","http://link.springer.com/article/10.1007/s11214-020-00680-z","Article"
"Data-Intensive Cloud Computing: Requirements, Expectations, Challenges, and Solutions","Journal of Grid Computing","","11","2","10.1007/s10723-013-9255-6","Jawwad ShamsiMuhammad Ali KhojayeMohammad Ali Qasmi","2013","http://link.springer.com/article/10.1007/s10723-013-9255-6","Article"
"Model-Based Design of Flexible and Efficient LDPC Decoders on FPGA Devices","Journal of Signal Processing Systems","","92","7","10.1007/s11265-020-01519-0","Yann DelomierBertrand Le GalJérémie CrenneChristophe Jego","2020","http://link.springer.com/article/10.1007/s11265-020-01519-0","Article"
"J2M: a Java to MapReduce translator for cloud computing","The Journal of Supercomputing","","72","5","10.1007/s11227-016-1695-x","Bing LiJunbo ZhangNing YuYi Pan","2016","http://link.springer.com/article/10.1007/s11227-016-1695-x","Article"
"The Fraunhofer virtual machine: a communication library and runtime system based on the RDMA model","Computer Science - Research and Development","","23","3 - 4","10.1007/s00450-009-0088-2","Rui MachadoCarsten Lojewski","2009","http://link.springer.com/article/10.1007/s00450-009-0088-2","Article"
"Memory Efficient Two-Pass 3D FFT Algorithm for Intel® Xeon PhiTM Coprocessor","Journal of Computer Science and Technology","","29","6","10.1007/s11390-014-1484-z","Yi-Qun LiuYan LiYun-Quan ZhangXian-Yi Zhang","2014","http://link.springer.com/article/10.1007/s11390-014-1484-z","Article"
"Parallel Bayesian ARTMAP and Its OpenCL Implementation","Neural Processing Letters","","47","2","10.1007/s11063-017-9663-x","István LőrentzRăzvan AndonieLucian M. Sasu","2018","http://link.springer.com/article/10.1007/s11063-017-9663-x","Article"
"A massively parallel algorithm for Bordered Almost Block Diagonal Systems on GPUs","Numerical Algorithms","","86","3","10.1007/s11075-020-00931-8","M. DessoleF. Marcuzzi","2021","http://link.springer.com/article/10.1007/s11075-020-00931-8","Article"
"Multi-relaxation time lattice Boltzmann simulations of oscillatory instability in lid-driven flows of 2D semi-elliptical cavity","Journal of Visualization","","22","6","10.1007/s12650-019-00590-5","Zhe FengHeeChang Lim","2019","http://link.springer.com/article/10.1007/s12650-019-00590-5","Article"
"Real-time Autonomous UAV Formation Flight with Collision and Obstacle Avoidance in Unknown Environment","Journal of Intelligent & Robotic Systems","","84","1 - 4","10.1007/s10846-015-0318-8","Omer CetinGuray Yilmaz","2016","http://link.springer.com/article/10.1007/s10846-015-0318-8","Article"
"Accelerating calculations of RNA secondary structure partition functions using GPUs","Algorithms for Molecular Biology","","8","1","10.1186/1748-7188-8-29","Harry A SternDavid H Mathews","2013","http://link.springer.com/article/10.1186/1748-7188-8-29","Article"
"Parallel multiprocessing and scheduling on the heterogeneous Xeon+FPGA platform","The Journal of Supercomputing","","76","6","10.1007/s11227-019-02935-1","Andrés RodríguezAngeles NavarroRafael AsenjoFrancisco CorberaRubén GranDarío SuárezJose Nunez-Yanez","2020","http://link.springer.com/article/10.1007/s11227-019-02935-1","Article"
"Low-latency and high-throughput software turbo decoders on multi-core architectures","Annals of Telecommunications","","75","1 - 2","10.1007/s12243-019-00727-5","Bertrand Le GalChristophe Jego","2020","http://link.springer.com/article/10.1007/s12243-019-00727-5","Article"
"Kernel density estimation in accelerators","The Journal of Supercomputing","","72","2","10.1007/s11227-015-1577-7","Unai Lopez-NovoaAlexander MendiburuJose Miguel-Alonso","2016","http://link.springer.com/article/10.1007/s11227-015-1577-7","Article"
"Accelerating iterative CT reconstruction algorithms using Tensor Cores","Journal of Real-Time Image Processing","","18","6","10.1007/s11554-020-01069-5","Mohsen NourazarBart Goossens","2021","http://link.springer.com/article/10.1007/s11554-020-01069-5","Article"
"Speed and accuracy improvement of higher-order epistasis detection on CUDA-enabled GPUs","Cluster Computing","","20","3","10.1007/s10586-017-0938-9","Daniel JüngerChristian HundtJorge González DomínguezBertil Schmidt","2017","http://link.springer.com/article/10.1007/s10586-017-0938-9","Article"
"Parallel design of intelligent optimization algorithm based on FPGA","The International Journal of Advanced Manufacturing Technology","","94","9 - 12","10.1007/s00170-017-1447-y","Xiaofu ZouLina WangYue TangYilong LiuShicheng ZhanFei Tao","2018","http://link.springer.com/article/10.1007/s00170-017-1447-y","Article"
"CUDA implementation of fractal image compression","Journal of Real-Time Image Processing","","17","5","10.1007/s11554-019-00894-7","Abir Al SideiriNasser AlzeidiMayyada Al HammoshiMunesh Singh ChauhanGhaliya AlFarsi","2020","http://link.springer.com/article/10.1007/s11554-019-00894-7","Article"
"The Case for Polymorphic Registers in Dataflow Computing","International Journal of Parallel Programming","","46","6","10.1007/s10766-017-0494-1","Cătălin Bogdan CiobanuGeorgi GaydadjievChristian PilatoDonatella Sciuto","2018","http://link.springer.com/article/10.1007/s10766-017-0494-1","Article"
"A lightweight BLASTP and its implementation on CUDA GPUs","The Journal of Supercomputing","","77","1","10.1007/s11227-020-03267-1","Liang-Tsung HuangKai-Cheng WeiChao-Chin WuChao-Yu ChenJian-An Wang","2021","http://link.springer.com/article/10.1007/s11227-020-03267-1","Article"
"CUDA-based solver for large-scale groundwater flow simulation","Engineering with Computers","","28","1","10.1007/s00366-011-0213-2","Xiaohui JiTangpei ChengQun Wang","2012","http://link.springer.com/article/10.1007/s00366-011-0213-2","Article"
"What do Programmers Discuss about Deep Learning Frameworks","Empirical Software Engineering","","25","4","10.1007/s10664-020-09819-6","Junxiao HanEmad ShihabZhiyuan WanShuiguang DengXin Xia","2020","http://link.springer.com/article/10.1007/s10664-020-09819-6","Article"
"Numerical analysis of parallel implementation of the reorthogonalized ABS methods","Central European Journal of Operations Research","","27","2","10.1007/s10100-018-0557-4","Szabina FodorZoltán Németh","2019","http://link.springer.com/article/10.1007/s10100-018-0557-4","Article"
"Compressed dynamic mode decomposition for background modeling","Journal of Real-Time Image Processing","","16","5","10.1007/s11554-016-0655-2","N. Benjamin ErichsonSteven L. BruntonJ. Nathan Kutz","2019","http://link.springer.com/article/10.1007/s11554-016-0655-2","Article"
"Evaluation of the ITER Real-Time Framework for Data Acquisition and Processing from Pulsed Gigasample Digitizers","Journal of Fusion Energy","","39","5","10.1007/s10894-020-00264-3","M. KadzielaB. JablonskiP. PerekD. Makowski","2020","http://link.springer.com/article/10.1007/s10894-020-00264-3","Article"
"The international race towards Exascale in Europe","CCF Transactions on High Performance Computing","","1","1","10.1007/s42514-019-00002-y","Fabrizio GagliardiMiquel MoretoMauro OlivieriMateo Valero","2019","http://link.springer.com/article/10.1007/s42514-019-00002-y","Article"
"Optimizing an APSP implementation for NVIDIA GPUs using kernel characterization criteria","The Journal of Supercomputing","","70","2","10.1007/s11227-014-1212-z","Hector Ortega-ArranzYuri TorresArturo Gonzalez-EscribanoDiego R. Llanos","2014","http://link.springer.com/article/10.1007/s11227-014-1212-z","Article"
"Deep Learning Inference with Dynamic Graphs on Heterogeneous Platforms","International Journal of Parallel Programming","","49","2","10.1007/s10766-020-00654-2","V. PothosE. VassalosI. TheodorakopoulosN. Fragoulis","2021","http://link.springer.com/article/10.1007/s10766-020-00654-2","Article"
"Optimizing CUDA code by kernel fusion: application on BLAS","The Journal of Supercomputing","","71","10","10.1007/s11227-015-1483-z","Jiří FilipovičMatúš MadzinJan FousekLuděk Matyska","2015","http://link.springer.com/article/10.1007/s11227-015-1483-z","Article"
"A fast ray tracing algorithm based on a hybrid structure","Multimedia Tools and Applications","","75","4","10.1007/s11042-014-2378-3","Yuanlong WangPing GuoFuqing Duan","2016","http://link.springer.com/article/10.1007/s11042-014-2378-3","Article"
"Real-time video denoising on multicores and GPUs with Kalman-based and Bilateral filters fusion","Journal of Real-Time Image Processing","","16","5","10.1007/s11554-016-0659-y","Sergio G. PflegerPatricia D. M. PlentzRodrigo C. O. RochaAlyson D. PereiraMárcio Castro","2019","http://link.springer.com/article/10.1007/s11554-016-0659-y","Article"
"Graphic processing unit based phase retrieval and CT reconstruction for differential X-ray phase contrast imaging","Journal of Shanghai Jiaotong University (Science)","","19","5","10.1007/s12204-014-1539-x","Xiao-qing Chen 陈晓庆Yu-jie Wang 王宇杰Jian-qi Sun 孙建奇","2014","http://link.springer.com/article/10.1007/s12204-014-1539-x","Article"
"Performance and energy consumption of the SIMD Gram–Schmidt process for vector orthogonalization","The Journal of Supercomputing","","76","3","10.1007/s11227-019-02839-0","Thomas JakobsBilly NaumannGudula Rünger","2020","http://link.springer.com/article/10.1007/s11227-019-02839-0","Article"
"Performance and power consumption analysis of Arm Scalable Vector Extension","The Journal of Supercomputing","","77","6","10.1007/s11227-020-03495-5","Tetsuya OdajimaYuetsu KodamaMitsuhisa Sato","2021","http://link.springer.com/article/10.1007/s11227-020-03495-5","Article"
"Application based brokering algorithm for optimal resource provisioning in multiple heterogeneous clouds","Vietnam Journal of Computer Science","","3","1","10.1007/s40595-015-0055-8","Thiruselvan SubramanianNickolas Savarimuthu","2016","http://link.springer.com/article/10.1007/s40595-015-0055-8","Article"
"MPI + MPI: a new hybrid approach to parallel programming with MPI plus shared memory","Computing","","95","12","10.1007/s00607-013-0324-2","Torsten HoeflerJames DinanDarius BuntinasPavan BalajiBrian BarrettRon BrightwellWilliam GroppVivek KaleRajeev Thakur","2013","http://link.springer.com/article/10.1007/s00607-013-0324-2","Article"
"Computational and mathematical models meet heterogeneous computing","The Journal of Supercomputing","","75","3","10.1007/s11227-018-2713-y","Diego R. LlanosJesús Vigo-Aguiar","2019","http://link.springer.com/article/10.1007/s11227-018-2713-y","Article"
"Parallel Algorithms for Successive Convolution","Journal of Scientific Computing","","86","1","10.1007/s10915-020-01359-x","Andrew J. ChristliebPierson T. GuthreyWilliam A. SandsMathialakan Thavappiragasm","2020","http://link.springer.com/article/10.1007/s10915-020-01359-x","Article"
"AutoWM: a novel domain-specific tool for universal multi-/many-core accelerations of the WRF cloud microphysics","Cluster Computing","","24","2","10.1007/s10586-020-03170-7","Peng ZhangChao YangYulong Ao","2021","http://link.springer.com/article/10.1007/s10586-020-03170-7","Article"
"Real-time tsunami inundation forecast system for tsunami disaster prevention and mitigation","The Journal of Supercomputing","","74","7","10.1007/s11227-018-2363-0","Akihiro MusaOsamu WatanabeHiroshi MatsuokaHiroaki HokariTakuya InoueYoichi MurashimaYusaku OhtaRyota HinoShunichi KoshimuraHiroaki Kobayashi","2018","http://link.springer.com/article/10.1007/s11227-018-2363-0","Article"
"Using Machine Learning Techniques to Detect Parallel Patterns of Multi-threaded Applications","International Journal of Parallel Programming","","44","4","10.1007/s10766-015-0396-z","Etem DenizAlper Sen","2016","http://link.springer.com/article/10.1007/s10766-015-0396-z","Article"
"Cooperative Computing Techniques for a Deeply Fused and Heterogeneous Many-Core Processor Architecture","Journal of Computer Science and Technology","","30","1","10.1007/s11390-015-1510-9","Fang ZhengHong-Liang LiHui LvFeng GuoXiao-Hong XuXiang-Hui Xie","2015","http://link.springer.com/article/10.1007/s11390-015-1510-9","Article"
"Computing infrastructure for big data processing","Frontiers of Computer Science","","7","2","10.1007/s11704-013-3900-x","Ling Liu","2013","http://link.springer.com/article/10.1007/s11704-013-3900-x","Article"
"In-memory database acceleration on FPGAs: a survey","The VLDB Journal","","29","1","10.1007/s00778-019-00581-w","Jian FangYvo T. B. MulderJan HiddersJinho LeeH. Peter Hofstee","2020","http://link.springer.com/article/10.1007/s00778-019-00581-w","Article"
"The survey on ARM processors for HPC","The Journal of Supercomputing","","75","10","10.1007/s11227-019-02911-9","Daniel YokoyamaBruno SchulzeFábio BorgesGiacomo Mc Evoy","2019","http://link.springer.com/article/10.1007/s11227-019-02911-9","Article"
"Practical scalable image analysis and indexing using Hadoop","Multimedia Tools and Applications","","71","3","10.1007/s11042-012-1256-0","Jonathon S. HareSina SamangooeiPaul H. Lewis","2014","http://link.springer.com/article/10.1007/s11042-012-1256-0","Article"
"Quantitative genetic analysis station for the genetic analysis of complex traits","Chinese Science Bulletin","","57","21","10.1007/s11434-012-5108-0","GuoBo ChenZhiXiang ZhuFuTao ZhangJun Zhu","2012","http://link.springer.com/article/10.1007/s11434-012-5108-0","Article"
"Aircraft noise scattering prediction using different accelerator architectures","The Journal of Supercomputing","","70","2","10.1007/s11227-014-1107-z","M. López-PortuguésJ. A. López-FernándezN. Díaz-GraciaR. G. AyestaránJosé Ranilla","2014","http://link.springer.com/article/10.1007/s11227-014-1107-z","Article"
"A highly parallelized framework for computationally intensive MR data analysis","Magnetic Resonance Materials in Physics, Biology and Medicine","","25","4","10.1007/s10334-011-0290-7","Roland N. BoubelaWolfgang HufKlaudius KalcherRonald SladkyPeter FilzmoserLukas PezawasSiegfried KasperChristian WindischbergerEwald Moser","2012","http://link.springer.com/article/10.1007/s10334-011-0290-7","Article"
"Coherent multiresolution isosurface ray tracing","The Visual Computer","","25","3","10.1007/s00371-008-0215-2","Aaron M. KnollIngo WaldCharles D. Hansen","2009","http://link.springer.com/article/10.1007/s00371-008-0215-2","Article"
"Accelerating Single Iteration Performance of CUDA-Based 3D Reaction–Diffusion Simulations","International Journal of Parallel Programming","","42","2","10.1007/s10766-013-0251-z","John K. HolmenDavid L. Foster","2014","http://link.springer.com/article/10.1007/s10766-013-0251-z","Article"
"A new memory mapping mechanism for GPGPUs’ stencil computation","Computing","","97","8","10.1007/s00607-014-0434-5","Tieqiang MoRenfa Li","2015","http://link.springer.com/article/10.1007/s00607-014-0434-5","Article"
"Practical Collision Attacks against Round-Reduced SHA-3","Journal of Cryptology","","33","1","10.1007/s00145-019-09313-3","Jian GuoGuohong LiaoGuozhen LiuMeicheng LiuKexin QiaoLing Song","2020","http://link.springer.com/article/10.1007/s00145-019-09313-3","Article"
"High Order Anchoring and Reinitialization of Level Set Function for Simulating Interface Motion","Journal of Scientific Computing","","81","3","10.1007/s10915-019-01076-0","Vimal RamanujRamanan Sankaran","2019","http://link.springer.com/article/10.1007/s10915-019-01076-0","Article"
"Using meta-heuristics and machine learning for software optimization of parallel computing systems: a systematic literature review","Computing","","101","8","10.1007/s00607-018-0614-9","Suejb MemetiSabri PllanaAlécio BinottoJoanna KołodziejIvona Brandic","2019","http://link.springer.com/article/10.1007/s00607-018-0614-9","Article"
"Embedded multi-core computing and applications","The Journal of Supercomputing","","73","8","10.1007/s11227-017-2107-6","Che-Lun HungFrédéric MagoulèsMeikang QiuRobert C. HsuChun-Yuan Lin","2017","http://link.springer.com/article/10.1007/s11227-017-2107-6","Article"
"Whole procedure heterogeneous multiprocessors low-power optimization at algorithm-level","Cluster Computing","","22","1","10.1007/s10586-018-1920-x","Zhuowei WangNaixue XiongHao WangLianglun ChengWuqing Zhao","2019","http://link.springer.com/article/10.1007/s10586-018-1920-x","Article"
"FPGA implementation of HOOFR bucketing extractor-based real-time embedded SLAM applications","Journal of Real-Time Image Processing","","18","3","10.1007/s11554-020-00986-9","Dai Duong NguyenAbdelhafid El OuardiSergio RodriguezSamir Bouaziz","2021","http://link.springer.com/article/10.1007/s11554-020-00986-9","Article"
"Computing element evolution towards Exascale and its impact on legacy simulation codes","The European Physical Journal A","","51","12","10.1140/epja/i2015-15163-3","Guillaume J.L. Colin de Verdière","2015","http://link.springer.com/article/10.1140/epja/i2015-15163-3","Article"
"High Level Data Structures for GPGPU Programming in a Statically Typed Language","International Journal of Parallel Programming","","45","2","10.1007/s10766-016-0424-7","Mathias BourgoinEmmanuel ChaillouxJean-Luc Lamotte","2017","http://link.springer.com/article/10.1007/s10766-016-0424-7","Article"
"Real-time line-structured light measurement system based on Scheimpflug principle","Optical Review","","28","4","10.1007/s10043-021-00681-5","Yong ZhangYucheng QianShanlin LiuYunfei Wang","2021","http://link.springer.com/article/10.1007/s10043-021-00681-5","Article"
"Prediction models for performance, power, and energy efficiency of software executed on heterogeneous hardware","The Journal of Supercomputing","","75","8","10.1007/s11227-018-2252-6","Dénes BánRudolf FerencIstván SiketÁkos KissTibor Gyimóthy","2019","http://link.springer.com/article/10.1007/s11227-018-2252-6","Article"
"The 2D wavelet transform on emerging architectures: GPUs and multicores","Journal of Real-Time Image Processing","","7","3","10.1007/s11554-011-0224-7","Joaquín FrancoGregorio BernabéJuan FernándezManuel Ujaldón","2012","http://link.springer.com/article/10.1007/s11554-011-0224-7","Article"
"Parallel multiple instance learning for extremely large histopathology image analysis","BMC Bioinformatics","","18","1","10.1186/s12859-017-1768-8","Yan XuYeshu LiZhengyang ShenZiwei WuTeng GaoYubo FanMaode LaiEric I-Chao Chang","2017","http://link.springer.com/article/10.1186/s12859-017-1768-8","Article"
"High-performance optimizations on tiled many-core embedded systems: a matrix multiplication case study","The Journal of Supercomputing","","66","1","10.1007/s11227-013-0916-9","Arslan MunirFarinaz KoushanfarAnn Gordon-RossSanjay Ranka","2013","http://link.springer.com/article/10.1007/s11227-013-0916-9","Article"
"Impact assessment of meteorological drought on rainfed agriculture using drought index and NDVI modeling: a case study of Tikamgarh district, M. P., India","Applied Geomatics","","11","1","10.1007/s12518-018-0230-6","Pushpendra Singh RajpootAjay Kumar","2019","http://link.springer.com/article/10.1007/s12518-018-0230-6","Article"
"Guest Editors’ introduction","The Journal of Supercomputing","","63","2","10.1007/s11227-012-0743-4","Abhinav VishnuPavan BalajiYong Chen","2013","http://link.springer.com/article/10.1007/s11227-012-0743-4","Article"
"Graph processing and machine learning architectures with emerging memory technologies: a survey","Science China Information Sciences","","64","6","10.1007/s11432-020-3219-6","Xuehai Qian","2021","http://link.springer.com/article/10.1007/s11432-020-3219-6","Article"
"Editorial: enabling technologies for programming extreme scale systems","The Journal of Supercomputing","","61","1","10.1007/s11227-012-0745-2","Ching-Hsien Hsu","2012","http://link.springer.com/article/10.1007/s11227-012-0745-2","Article"
"Ad Hoc File Systems for High-Performance Computing","Journal of Computer Science and Technology","","35","1","10.1007/s11390-020-9801-1","André BrinkmannKathryn MohrorWeikuan YuPhilip CarnsToni CortesScott A. KlaskyAlberto MirandaFranz-Josef PfreundtRobert B. RossMarc-André Vef","2020","http://link.springer.com/article/10.1007/s11390-020-9801-1","Article"
"Guest Editorial Special Issue: High-Level Programming for Heterogeneous Parallel Systems","International Journal of Parallel Programming","","47","1","10.1007/s10766-018-0576-8","Christopher Brown","2019","http://link.springer.com/article/10.1007/s10766-018-0576-8","Article"
"Handling big data: research challenges and future directions","The Journal of Supercomputing","","72","4","10.1007/s11227-016-1677-z","I. AnagnostopoulosS. ZeadallyE. Exposito","2016","http://link.springer.com/article/10.1007/s11227-016-1677-z","Article"
"Development of a 3D Hybrid Finite-Discrete Element Simulator Based on GPGPU-Parallelized Computation for Modelling Rock Fracturing Under Quasi-Static and Dynamic Loading Conditions","Rock Mechanics and Rock Engineering","","53","3","10.1007/s00603-019-01960-z","Daisuke FukudaMojtaba MohammadnejadHongyuan LiuQianbing ZhangJian ZhaoSevda DehkhodaAndrew ChanJun-ichi KodamaYoshiaki Fujii","2020","http://link.springer.com/article/10.1007/s00603-019-01960-z","Article"
"Interpretable Machine Learning for Texture-Dependent Constitutive Models with Automatic Code Generation for Topological Optimization","Integrating Materials and Manufacturing Innovation","","10","3","10.1007/s40192-021-00231-6","Karl GarbrechtMiguel AguiloAllen SandersonAnthony RollettRobert M. KirbyJacob Hochhalter","2021","http://link.springer.com/article/10.1007/s40192-021-00231-6","Article"
"Applications of the MapReduce programming framework to clinical big data analysis: current landscape and future trends","BioData Mining","","7","1","10.1186/1756-0381-7-22","Emad A MohammedBehrouz H FarChristopher Naugler","2014","http://link.springer.com/article/10.1186/1756-0381-7-22","Article"
"Parallel BRDF-based infrared radiation simulation of aerial targets implemented on Intel Xeon processor and Xeon Phi coprocessor","Journal of Real-Time Image Processing","","16","1","10.1007/s11554-017-0739-7","Xing GuoZhensen WuJiaji WuYunhua Cao","2019","http://link.springer.com/article/10.1007/s11554-017-0739-7","Article"
"Fast sorting for exact OIT of complex scenes","The Visual Computer","","30","6 - 8","10.1007/s00371-014-0956-z","Pyarelal KnowlesGeoff LeachFabio Zambetta","2014","http://link.springer.com/article/10.1007/s00371-014-0956-z","Article"
"Fast 3D wavelet transform on multicore and many-core computing platforms","The Journal of Supercomputing","","65","2","10.1007/s11227-013-0868-0","V. GalianoO. López-GranadoM. P. MalumbresH. Migallón","2013","http://link.springer.com/article/10.1007/s11227-013-0868-0","Article"
"A distributed approach for accelerating sparse matrix arithmetic operations for high-dimensional feature selection","Knowledge and Information Systems","","51","2","10.1007/s10115-016-0981-5","Antonela TommaselDaniela GodoyAlejandro ZuninoCristian Mateos","2017","http://link.springer.com/article/10.1007/s10115-016-0981-5","Article"
"Heuristic Search Space Generation for Maximum Clique Problem Inspired in Biomolecular Filtering","Journal of Signal Processing Systems","","83","3","10.1007/s11265-015-1027-z","Nelson E. Ordóñez-GuillénIsrael M. Martínez-Pérez","2016","http://link.springer.com/article/10.1007/s11265-015-1027-z","Article"
"GPUBlocks: GUI Programming Tool for CUDA and OpenCL","Journal of Signal Processing Systems","","91","3 - 4","10.1007/s11265-018-1395-2","Yuan-Shin HwangHsih-Hsin LinShen-Hung PaiChia-Heng Tu","2019","http://link.springer.com/article/10.1007/s11265-018-1395-2","Article"
"Towards an efficient parallel raycasting of unstructured volumetric data on distributed environments","Cluster Computing","","17","2","10.1007/s10586-013-0244-0","Cristiana BentesBernardo B. LabroniciLúcia M. A. DrummondRicardo Farias","2014","http://link.springer.com/article/10.1007/s10586-013-0244-0","Article"
"Real-time brain extraction method from cerebral MRI volume based on graphic processing units","Neural Computing and Applications","","25","5","10.1007/s00521-014-1588-y","Shaofeng JiangYu WangZhen ChenKaiqiong Sun","2014","http://link.springer.com/article/10.1007/s00521-014-1588-y","Article"
"MetaBinG2: a fast and accurate metagenomic sequence classification system for samples with many unknown organisms","Biology Direct","","13","1","10.1186/s13062-018-0220-y","Yuyang QiaoBen JiaZhiqiang HuChen SunYijin XiangChaochun Wei","2018","http://link.springer.com/article/10.1186/s13062-018-0220-y","Article"
"Parallel Simulation of Two-Dimensional Ising Models Using Probabilistic Cellular Automata","Journal of Statistical Physics","","184","1","10.1007/s10955-021-02792-4","Roberto D’AutiliaLouis Nantenaina AndrianaivoAlessio Troiani","2021","http://link.springer.com/article/10.1007/s10955-021-02792-4","Article"
"An accelerated nonlocal means algorithm for synthetic aperture radar ocean image despeckling","Acta Oceanologica Sinica","","38","11","10.1007/s13131-019-1504-5","Guozhen ZhaDewei XuYanming YangXin’gai SongFuhuang Zhong","2019","http://link.springer.com/article/10.1007/s13131-019-1504-5","Article"
"Automatic code generation for GPUs in llc","The Journal of Supercomputing","","58","3","10.1007/s11227-011-0591-7","Ruyman ReyesFrancisco de Sande","2011","http://link.springer.com/article/10.1007/s11227-011-0591-7","Article"
"Compilers for Low Power with Design Patterns on Embedded Multicore Systems","Journal of Signal Processing Systems","","80","3","10.1007/s11265-014-0917-9","Cheng-Yen LinChi-Bang KuanWen-Li ShihJenq Kuen Lee","2015","http://link.springer.com/article/10.1007/s11265-014-0917-9","Article"
"Geometric Algebra Computing for Heterogeneous Systems","Advances in Applied Clifford Algebras","","27","1","10.1007/s00006-016-0694-6","D. HildenbrandJ. AlbertP. CharrierChr. Steinmetz","2017","http://link.springer.com/article/10.1007/s00006-016-0694-6","Article"
"Comparison of different parallel implementations of the 2+1-dimensional KPZ model and the 3-dimensional KMC model","The European Physical Journal Special Topics","","210","1","10.1140/epjst/e2012-01645-8","J. KellingG. ÓdorM. F. NagyH. SchulzK. -H. Heinig","2012","http://link.springer.com/article/10.1140/epjst/e2012-01645-8","Article"
"A high performance parallel DCT with OpenCL on heterogeneous computing environment","Multimedia Tools and Applications","","64","2","10.1007/s11042-012-1028-x","Cheong Ghil KimYong Soo Choi","2013","http://link.springer.com/article/10.1007/s11042-012-1028-x","Article"
"Systems Simulation Analysis and Optimization of Insurance Business","Cybernetics and Systems Analysis","","50","2","10.1007/s10559-014-9613-9","B. V. Norkin","2014","http://link.springer.com/article/10.1007/s10559-014-9613-9","Article"
"A taxonomy of peer-to-peer desktop grid paradigms","Cluster Computing","","14","2","10.1007/s10586-010-0138-3","Han ZhaoXinxin LiuXiaolin Li","2011","http://link.springer.com/article/10.1007/s10586-010-0138-3","Article"
"Improving performance of background subtraction on mobile devices: a parallel approach","Journal of Real-Time Image Processing","","","","10.1007/s11554-021-01184-x","Marko MišićPetar KovačevMilo Tomašević","2021","http://link.springer.com/article/10.1007/s11554-021-01184-x","Article"
"Application of Graphics Processing Units for Self-Consistent Modelling of Shallow Water Dynamics and Sediment Transport","Lobachevskii Journal of Mathematics","","41","8","10.1134/S1995080220080089","S. S. KhrapovA. V. Khoperskov","2020","http://link.springer.com/article/10.1134/S1995080220080089","Article"
"Cooperative particle swarm optimization using MapReduce","Soft Computing","","21","22","10.1007/s00500-016-2390-9","Yang WangYangyang LiZhenghan ChenYu Xue","2017","http://link.springer.com/article/10.1007/s00500-016-2390-9","Article"
"Analytical Estimation of the Scalability of Iterative Numerical Algorithms on Distributed Memory Multiprocessors","Lobachevskii Journal of Mathematics","","39","4","10.1134/S1995080218040121","L. B. Sokolinsky","2018","http://link.springer.com/article/10.1134/S1995080218040121","Article"
"Big data analytics on Apache Spark","International Journal of Data Science and Analytics","","1","3 - 4","10.1007/s41060-016-0027-9","Salman SalloumRuslan DautovXiaojun ChenPatrick Xiaogang PengJoshua Zhexue Huang","2016","http://link.springer.com/article/10.1007/s41060-016-0027-9","Article"
"EVE: A Flexible SIMD Coprocessor for Embedded Vision Applications","Journal of Signal Processing Systems","","75","2","10.1007/s11265-013-0770-2","Jagadeesh SankaranChing-Yu HungBranislav Kisačanin","2014","http://link.springer.com/article/10.1007/s11265-013-0770-2","Article"
"Research and implementation of scalable parallel computing based on Map-Reduce","Journal of Shanghai University (English Edition)","","15","5","10.1007/s11741-011-0763-3","Thanh-cuong Nguyen 阮青强Wen-feng Shen 沈文枫Ya-hui Chai 柴亚辉Wei-min Xu 徐炜民","2011","http://link.springer.com/article/10.1007/s11741-011-0763-3","Article"
"PLAST: parallel local alignment search tool for database comparison","BMC Bioinformatics","","10","1","10.1186/1471-2105-10-329","Hoa Van NguyenDominique Lavenier","2009","http://link.springer.com/article/10.1186/1471-2105-10-329","Article"
"A novel data-driven neuro arch (DDNA) model for option pricing on cloud","Journal of Banking and Financial Technology","","5","2","10.1007/s42786-021-00032-7","Manmohit SinghRuppa K. ThulasiramA. Thavaneswaran","2021","http://link.springer.com/article/10.1007/s42786-021-00032-7","Article"
"MapReduce Data Skewness Handling: A Systematic Literature Review","International Journal of Parallel Programming","","47","5 - 6","10.1007/s10766-019-00627-0","Mohammad Amin IrandoostAmir Masoud RahmaniSaeed Setayeshi","2019","http://link.springer.com/article/10.1007/s10766-019-00627-0","Article"
"Implementation of a high-accuracy phase unwrapping algorithm using parallel-hybrid programming approach for displacement sensing using self-mixing interferometry","The Journal of Supercomputing","","77","9","10.1007/s11227-021-03634-6","Tassadaq HussainSaqib AminUsman ZabitEduard Ayguadé","2021","http://link.springer.com/article/10.1007/s11227-021-03634-6","Article"
"Message-Passing Programming for Embedded Multicore Signal-Processing Platforms","Journal of Signal Processing Systems","","75","2","10.1007/s11265-013-0732-8","Shih-Hao HungPo-Hsun ChiuChia-Heng TuWei-Ting ChouWen-Long Yang","2014","http://link.springer.com/article/10.1007/s11265-013-0732-8","Article"
"Software system research in post-Moore’s Law era: a historical perspective for the future","Science China Information Sciences","","62","9","10.1007/s11432-019-9860-1","Xiaodong Zhang","2019","http://link.springer.com/article/10.1007/s11432-019-9860-1","Article"
"SCnC: Efficient Unification of Streaming with Dynamic Task Parallelism","International Journal of Parallel Programming","","44","2","10.1007/s10766-015-0353-x","Dragoş SbîrleaJun ShirakoRyan NewtonVivek Sarkar","2016","http://link.springer.com/article/10.1007/s10766-015-0353-x","Article"
"Multicore implementation and performance analysis of a chaos based LSB steganography technique","Microsystem Technologies","","27","11","10.1007/s00542-020-04762-4","Gaurav GambhirJyotsna Kumar Mandal","2021","http://link.springer.com/article/10.1007/s00542-020-04762-4","Article"
"CellJoin: a parallel stream join operator for the cell processor","The VLDB Journal","","18","2","10.1007/s00778-008-0116-z","Buğra GedikRajesh R. BordawekarPhilip S. Yu","2009","http://link.springer.com/article/10.1007/s00778-008-0116-z","Article"
"Real-Time Digital Image Correlation for Dynamic Strain Measurement","Experimental Mechanics","","56","5","10.1007/s11340-016-0133-6","R. WuC. KongK. LiD. Zhang","2016","http://link.springer.com/article/10.1007/s11340-016-0133-6","Article"
"Matrix-based streamization approach for improving locality and parallelism on FT64 stream processor","The Journal of Supercomputing","","47","2","10.1007/s11227-008-0186-0","Xuejun YangJing DuXiaobo YanYu Deng","2009","http://link.springer.com/article/10.1007/s11227-008-0186-0","Article"
"HAlign-II: efficient ultra-large multiple sequence alignment and phylogenetic tree reconstruction with distributed and parallel computing","Algorithms for Molecular Biology","","12","1","10.1186/s13015-017-0116-x","Shixiang WanQuan Zou","2017","http://link.springer.com/article/10.1186/s13015-017-0116-x","Article"
"Special issue on unconventional cluster architectures and applications","Cluster Computing","","17","2","10.1007/s10586-013-0291-6","Federico SillaHolger Fröning","2014","http://link.springer.com/article/10.1007/s10586-013-0291-6","Article"
"Legacy code and parallel computing: updating and parallelizing a numerical model","The Journal of Supercomputing","","76","7","10.1007/s11227-020-03172-7","Fernando G. TinettiMaximiliano J. PerezAriel FraidenraichAdolfo E. Altenberg","2020","http://link.springer.com/article/10.1007/s11227-020-03172-7","Article"
"Developing adaptive multi-device applications with the Heterogeneous Programming Library","The Journal of Supercomputing","","71","6","10.1007/s11227-014-1352-1","Moisés ViñasZeki BozkusBasilio B. FraguelaDiego AndradeRamón Doallo","2015","http://link.springer.com/article/10.1007/s11227-014-1352-1","Article"
"Task scheduling algorithms for energy optimization in cloud environment: a comprehensive review","Cluster Computing","","","","10.1007/s10586-021-03512-z","R. GhafariF. Hassani KabutarkhaniN. Mansouri","2022","http://link.springer.com/article/10.1007/s10586-021-03512-z","Article"
"Predicting the Soft Error Vulnerability of Parallel Applications Using Machine Learning","International Journal of Parallel Programming","","49","3","10.1007/s10766-021-00707-0","Işıl ÖzSanem Arslan","2021","http://link.springer.com/article/10.1007/s10766-021-00707-0","Article"
"Performance and programmability comparison of the thick control flow architecture and current multicore processors","The Journal of Supercomputing","","","","10.1007/s11227-021-03985-0","Martti ForsellSara NikulaJussi RoivainenVille LeppänenJesper Larsson Träff","2021","http://link.springer.com/article/10.1007/s11227-021-03985-0","Article"
"Parallelization Strategies for Spatial Agent-Based Models","International Journal of Parallel Programming","","45","3","10.1007/s10766-015-0399-9","Nuno FachadaVitor V. LopesRui C. MartinsAgostinho C. Rosa","2017","http://link.springer.com/article/10.1007/s10766-015-0399-9","Article"
"Python accelerators for high-performance computing","The Journal of Supercomputing","","74","4","10.1007/s11227-017-2213-5","Ami Marowka","2018","http://link.springer.com/article/10.1007/s11227-017-2213-5","Article"
"Scheduling parity checks for increased throughput in early-termination, layered decoding of QC-LDPC codes on a stream processor","EURASIP Journal on Wireless Communications and Networking","","2012","1","10.1186/1687-1499-2012-141","JaWone A KennedyDaniel L Noneaker","2012","http://link.springer.com/article/10.1186/1687-1499-2012-141","Article"
"Computational monitoring in real time: review of methods and applications","Geomechanics and Geophysics for Geo-Energy and Geo-Resources","","4","3","10.1007/s40948-018-0086-6","Arcady V. DyskinHakan BasarirJames DohertyMohamed ElchalakaniGrand R. JoldesAli KarrechBarry LehaneKarol MillerElena PasternakIgor ShufrinAdam Wittek","2018","http://link.springer.com/article/10.1007/s40948-018-0086-6","Article"
"Automatic code generation and tuning for stencil kernels on modern shared memory architectures","Computer Science - Research and Development","","26","3 - 4","10.1007/s00450-011-0160-6","Matthias ChristenOlaf SchenkHelmar Burkhart","2011","http://link.springer.com/article/10.1007/s00450-011-0160-6","Article"
"MegaMol – a comprehensive prototyping framework for visualizations","The European Physical Journal Special Topics","","227","14","10.1140/epjst/e2019-800167-5","Patrick GralkaMichael BecherMatthias BraunFlorian FrießChristoph MüllerTobias RauKarsten SchatzChristoph SchulzMichael KroneGuido ReinaThomas Ertl","2019","http://link.springer.com/article/10.1140/epjst/e2019-800167-5","Article"
"New algorithms for fixed-length approximate string matching and approximate circular string matching under the Hamming distance","The Journal of Supercomputing","","74","5","10.1007/s11227-017-2192-6","ThienLuan HoSeung-Rohk OhHyunJin Kim","2018","http://link.springer.com/article/10.1007/s11227-017-2192-6","Article"
"Assessing and discovering parallelism in C
$$++$$
+
+
code for heterogeneous platforms","The Journal of Supercomputing","","74","11","10.1007/s11227-016-1794-8","David del Rio AstorgaRafael SotomayorLuis Miguel SanchezJavier Garcia BlasAlejandro CalderonJavier Fernandez","2018","http://link.springer.com/article/10.1007/s11227-016-1794-8","Article"
"CUDA-accelerated fast Sauvola’s method on Kepler architecture","Multimedia Tools and Applications","","74","24","10.1007/s11042-014-2269-7","Xin ChenYuefang GaoZhonghong Huang","2015","http://link.springer.com/article/10.1007/s11042-014-2269-7","Article"
"Applying FDTD to the Coverage Prediction of WiMAX Femtocells","EURASIP Journal on Wireless Communications and Networking","","2009","1","10.1155/2009/308606","Alvaro ValcarceGuillaume De La RocheÁlpar JüttnerDavid López-PérezJie Zhang","2009","http://link.springer.com/article/10.1155/2009/308606","Article"
"Structure-preserving image completion with multi-level dynamic patches","The Visual Computer","","35","1","10.1007/s00371-017-1454-x","Bowen LiuPing LiBin ShengYongwei NieEnhua Wu","2019","http://link.springer.com/article/10.1007/s00371-017-1454-x","Article"
"Uncertainty quantification in tsunami modeling using multi-level Monte Carlo finite volume method","Journal of Mathematics in Industry","","6","1","10.1186/s13362-016-0022-8","Carlos Sánchez-LinaresMarc de la AsunciónManuel J CastroJosé M González-VidaJorge MacíasSiddhartha Mishra","2016","http://link.springer.com/article/10.1186/s13362-016-0022-8","Article"
"High-performance and deep pedestrian detection based on estimation of different parts","The Journal of Supercomputing","","77","2","10.1007/s11227-020-03345-4","Mahmoud SaeidiAli Ahmadi","2021","http://link.springer.com/article/10.1007/s11227-020-03345-4","Article"
"CAR Posters","International Journal of Computer Assisted Radiology and Surgery","","1","1","10.1007/s11548-006-0031-y","","2006","http://link.springer.com/article/10.1007/s11548-006-0031-y","Article"
"Introduction to sustainable ultrascale computing systems and applications","The Journal of Supercomputing","","72","11","10.1007/s11227-016-1822-8","Jesus CarreteroJavier Garcia-BlasRaimondas Ciegis","2016","http://link.springer.com/article/10.1007/s11227-016-1822-8","Article"
"Fish School Search with Algorithmic Skeletons","International Journal of Parallel Programming","","47","2","10.1007/s10766-018-0564-z","Fabian WredeBreno MenezesHerbert Kuchen","2019","http://link.springer.com/article/10.1007/s10766-018-0564-z","Article"
"Micro-sized parallel system design proposal for the solution of robotics based engineering problem","Microsystem Technologies","","27","12","10.1007/s00542-020-05209-6","Serkan Dereli","2021","http://link.springer.com/article/10.1007/s00542-020-05209-6","Article"
"Simultaneous multiprocessing in a software-defined heterogeneous FPGA","The Journal of Supercomputing","","75","8","10.1007/s11227-018-2367-9","Jose Nunez-YanezSam AmiriMohammad HosseinabadyAndrés RodríguezRafael AsenjoAngeles NavarroDario SuarezRuben Gran","2019","http://link.springer.com/article/10.1007/s11227-018-2367-9","Article"
"The basic matrix library (BML) for quantum chemistry","The Journal of Supercomputing","","74","11","10.1007/s11227-018-2533-0","Nicolas BockChristian F. A. NegreSusan M. MniszewskiJamaludin Mohd-YusofBálint AradiJean-Luc FattebertDaniel Osei-KuffuorTimothy C. GermannAnders M. N. Niklasson","2018","http://link.springer.com/article/10.1007/s11227-018-2533-0","Article"
"Optimization of cosmological N-body simulation with FMM-PM on SIMT accelerators","The Journal of Supercomputing","","","","10.1007/s11227-021-04153-0","Wen-Long ZhaoWu WangQiao Wang","2021","http://link.springer.com/article/10.1007/s11227-021-04153-0","Article"
"Automatic Parallelization: Executing Sequential Programs on a Task-Based Parallel Runtime","International Journal of Parallel Programming","","44","6","10.1007/s10766-016-0426-5","Alcides FonsecaBruno CabralJoão RafaelIvo Correia","2016","http://link.springer.com/article/10.1007/s10766-016-0426-5","Article"
"FuPerMod: a software tool for the optimization of data-parallel applications on heterogeneous platforms","The Journal of Supercomputing","","69","1","10.1007/s11227-014-1207-9","David ClarkeZiming ZhongVladimir RychkovAlexey Lastovetsky","2014","http://link.springer.com/article/10.1007/s11227-014-1207-9","Article"
"$$FC^{2}$$
F
C
2
: cloud-based cluster provisioning for distributed machine learning","Cluster Computing","","22","4","10.1007/s10586-019-02912-6","Nguyen Binh Duong Ta","2019","http://link.springer.com/article/10.1007/s10586-019-02912-6","Article"
"Computational storage: an efficient and scalable platform for big data and HPC applications","Journal of Big Data","","6","1","10.1186/s40537-019-0265-5","Mahdi TorabzadehkashiSiavash RezaeiAli HeydariGorjiHosein BobarshadVladimir AlvesNader Bagherzadeh","2019","http://link.springer.com/article/10.1186/s40537-019-0265-5","Article"
"Engineering Energy Efficient Visual Sensor Network Applications Using Skeletons","International Journal of Parallel Programming","","42","4","10.1007/s10766-013-0260-y","Stefano ChessaSusanna PelagattiNicoletta Triolo","2014","http://link.springer.com/article/10.1007/s10766-013-0260-y","Article"
"Special Issue: Bio-Inspired Optimization Techniques for High Performance Computing","New Generation Computing","","29","2","10.1007/s00354-011-0101-8","Gianluigi FolinoCarlo Mastroianni","2011","http://link.springer.com/article/10.1007/s00354-011-0101-8","Article"
"Preface","Journal of Computer Science and Technology","","36","1","10.1007/s11390-021-0001-4","Xian-He SunDong LiWen-Guang ChenTao LiJi-Wu ShuBo WuJin XiongJinging XueFeng ZhangJi-Dong ZhaiZhiia Zhao","2021","http://link.springer.com/article/10.1007/s11390-021-0001-4","Article"
"Data stream processing via code annotations","The Journal of Supercomputing","","74","11","10.1007/s11227-016-1793-9","Marco DaneluttoTiziano De MatteisGabriele MencagliMassimo Torquati","2018","http://link.springer.com/article/10.1007/s11227-016-1793-9","Article"
"Reliable MapReduce computing on opportunistic resources","Cluster Computing","","15","2","10.1007/s10586-011-0158-7","Heshan LinXiaosong MaWu-chun Feng","2012","http://link.springer.com/article/10.1007/s10586-011-0158-7","Article"
"Reconstructing evolutionary trees in parallel for massive sequences","BMC Systems Biology","","11","6","10.1186/s12918-017-0476-3","Quan ZouShixiang WanXiangxiang ZengZhanshan Sam Ma","2017","http://link.springer.com/article/10.1186/s12918-017-0476-3","Article"
"Application of cloud-based visual communication design in Internet of Things image","Soft Computing","","24","11","10.1007/s00500-019-04111-2","Xixia Liu","2020","http://link.springer.com/article/10.1007/s00500-019-04111-2","Article"
"MAHASIM: Machine-Learning Hardware Acceleration Using a Software-Defined Intelligent Memory System","Journal of Signal Processing Systems","","93","6","10.1007/s11265-019-01505-1","Bahar AsgariSaibal MukhopadhyaySudhakar Yalamanchili","2021","http://link.springer.com/article/10.1007/s11265-019-01505-1","Article"
"An Analysis of Public Clouds Elasticity in the Execution of Scientific Applications: a Survey","Journal of Grid Computing","","14","2","10.1007/s10723-016-9361-3","Guilherme GalanteLuis Carlos Erpen De BonaAntonio Roberto MuryBruno SchulzeRodrigo da Rosa Righi","2016","http://link.springer.com/article/10.1007/s10723-016-9361-3","Article"
"Resource-Aware Compiler Prefetching for Fine-Grained Many-Cores","International Journal of Parallel Programming","","39","5","10.1007/s10766-011-0163-8","George C. CarageaAlexandros TzannesFuat KeceliRajeev BaruaUzi Vishkin","2011","http://link.springer.com/article/10.1007/s10766-011-0163-8","Article"
"Mesoscopic Simulation Study of Wall Roughness Effects in Micro-channel Flows of Dense Emulsions","Journal of Statistical Physics","","161","6","10.1007/s10955-015-1374-y","Andrea ScagliariniMauro SbragagliaMassimo Bernaschi","2015","http://link.springer.com/article/10.1007/s10955-015-1374-y","Article"
"Sparse evolutionary deep learning with over one million artificial neurons on commodity hardware","Neural Computing and Applications","","33","7","10.1007/s00521-020-05136-7","Shiwei LiuDecebal Constantin MocanuAmarsagar Reddy Ramapuram MatavalamYulong PeiMykola Pechenizkiy","2021","http://link.springer.com/article/10.1007/s00521-020-05136-7","Article"
"A 3D graphics rendering pipeline implementation based on the openCL massively parallel processing","The Journal of Supercomputing","","77","7","10.1007/s11227-020-03581-8","Mingyu KimNakhoon Baek","2021","http://link.springer.com/article/10.1007/s11227-020-03581-8","Article"
"Super-EGO: fast multi-dimensional similarity join","The VLDB Journal","","22","4","10.1007/s00778-012-0305-7","Dmitri V. Kalashnikov","2013","http://link.springer.com/article/10.1007/s00778-012-0305-7","Article"
"A cloud-terminal-based cyber-physical system architecture for energy efficient machining process optimization","Journal of Ambient Intelligence and Humanized Computing","","10","3","10.1007/s12652-018-0832-1","X. X. LiF. Z. HeW. D. Li","2019","http://link.springer.com/article/10.1007/s12652-018-0832-1","Article"
"Unscented Particle Filters with Refinement Steps for UAV Pose Tracking","Journal of Intelligent & Robotic Systems","","102","2","10.1007/s10846-021-01409-y","Nuno Pessanha SantosVictor LoboAlexandre Bernardino","2021","http://link.springer.com/article/10.1007/s10846-021-01409-y","Article"
"Astronomical big data processing using machine learning: A comprehensive review","Experimental Astronomy","","","","10.1007/s10686-021-09827-4","Snigdha SenSonali AgarwalPavan ChakrabortyKrishna Pratap Singh","2022","http://link.springer.com/article/10.1007/s10686-021-09827-4","Article"
"Cloud resource management using 3Vs of Internet of Big data streams","Computing","","102","6","10.1007/s00607-019-00732-5","Navroop KaurSandeep K. SoodPrabal Verma","2020","http://link.springer.com/article/10.1007/s00607-019-00732-5","Article"
"GeantV","Computing and Software for Big Science","","5","1","10.1007/s41781-020-00048-6","G. AmadioA. AnanyaJ. ApostolakisM. BandieramonteS. BanerjeeA. BhattacharyyaC. BianchiniG. BitzesP. CanalF. CarminatiO. Chaparro-AmaroG. CosmoJ. C. De Fine LichtV. DroganL. DuhemD. Elvira","2021","http://link.springer.com/article/10.1007/s41781-020-00048-6","Article"
"MCtandem: an efficient tool for large-scale peptide identification on many integrated core (MIC) architecture","BMC Bioinformatics","","20","1","10.1186/s12859-019-2980-5","Chuang LiKenli LiKeqin LiFeng Lin","2019","http://link.springer.com/article/10.1186/s12859-019-2980-5","Article"
"High performance computing: an essential tool for science and engineering breakthroughs","The Journal of Supercomputing","","70","2","10.1007/s11227-014-1279-6","J. RanillaE. M. GarzónJ. Vigo-Aguiar","2014","http://link.springer.com/article/10.1007/s11227-014-1279-6","Article"
"A novel parallel learning algorithm for pattern classification","SN Applied Sciences","","1","12","10.1007/s42452-019-1687-6","Yi WangJian FuBingyang Wei","2019","http://link.springer.com/article/10.1007/s42452-019-1687-6","Article"
"Domain-Specific Language Techniques for Visual Computing: A Comprehensive Study","Archives of Computational Methods in Engineering","","28","4","10.1007/s11831-020-09492-4","Liming ShenXueyi ChenRichen LiuHailong WangGenlin Ji","2021","http://link.springer.com/article/10.1007/s11831-020-09492-4","Article"
"Source-to-Source Parallelization Compilers for Scientific Shared-Memory Multi-core and Accelerated Multiprocessing: Analysis, Pitfalls, Enhancement and Potential","International Journal of Parallel Programming","","48","1","10.1007/s10766-019-00640-3","Re’em HarelIdan MosseriHarel LevinLee-or AlonMatan RusanovskyGal Oren","2020","http://link.springer.com/article/10.1007/s10766-019-00640-3","Article"
"A Loosely Coordinated Model for Heap-Based Priority Queues in Multicore Environments","International Journal of Parallel Programming","","44","4","10.1007/s10766-015-0398-x","Giuliano LaccettiMarco LapegnaValeria Mele","2016","http://link.springer.com/article/10.1007/s10766-015-0398-x","Article"
"High performance networked computing in media, services and information management","The Journal of Supercomputing","","64","3","10.1007/s11227-013-0942-7","Gang Kou","2013","http://link.springer.com/article/10.1007/s11227-013-0942-7","Article"
"Support for Parallel and Concurrent Programming in C++","Programming and Computer Software","","44","1","10.1134/S0361768818010073","N. I. V’yukovaV. A. GalatenkoS. V. Samborskii","2018","http://link.springer.com/article/10.1134/S0361768818010073","Article"
"3D Segmentation Algorithms for Computerized Tomographic Imaging: a Systematic Literature Review","Journal of Digital Imaging","","31","6","10.1007/s10278-018-0101-z","L. E. CarvalhoA. C. SobieranskiA. von Wangenheim","2018","http://link.springer.com/article/10.1007/s10278-018-0101-z","Article"
"A design methodology for soft-core platforms on FPGA with SMP Linux, OpenMP support, and distributed hardware profiling system","EURASIP Journal on Embedded Systems","","2016","1","10.1186/s13639-016-0051-9","Vittoriano MuttilloGiacomo ValenteFabio FedericiLuigi PomanteMarco FaccioCarlo TieriSerenella Ferri","2016","http://link.springer.com/article/10.1186/s13639-016-0051-9","Article"
"Microarchitectural performance comparison of Intel Knights Corner and Intel Sandy Bridge with CFD applications","The Journal of Supercomputing","","70","1","10.1007/s11227-014-1245-3","Yonggang CheLilun ZhangYongxian WangChuanfu XuWei LiuZhenghua Wang","2014","http://link.springer.com/article/10.1007/s11227-014-1245-3","Article"
"High-performance software implementations of SCAN decoder for polar codes","Annals of Telecommunications","","73","5 - 6","10.1007/s12243-018-0634-7","Bertrand Le GalCamille LerouxChristophe Jego","2018","http://link.springer.com/article/10.1007/s12243-018-0634-7","Article"
"A taxonomy of task-based parallel programming technologies for high-performance computing","The Journal of Supercomputing","","74","4","10.1007/s11227-018-2238-4","Peter ThomanKiril DichevThomas HellerRoman IakymchukXavier AguilarKhalid HasanovPhilipp GschwandtnerPierre LemarinierStefano MarkidisHerbert JordanThomas FahringerKostas KatrinisErwin LaureDimitrios S. Nikolopoulos","2018","http://link.springer.com/article/10.1007/s11227-018-2238-4","Article"
"PCJ Java library as a solution to integrate HPC, Big Data and Artificial Intelligence workloads","Journal of Big Data","","8","1","10.1186/s40537-021-00454-6","Marek NowickiŁukasz GórskiPiotr Bała","2021","http://link.springer.com/article/10.1186/s40537-021-00454-6","Article"
"Parallelizing multiclass support vector machines for scalable image annotation","Neural Computing and Applications","","24","2","10.1007/s00521-012-1237-2","Nasullah Khalid AlhamMaozhen LiYang Liu","2014","http://link.springer.com/article/10.1007/s00521-012-1237-2","Article"
"A stereoscopic video conversion scheme based on spatio-temporal analysis of MPEG videos","EURASIP Journal on Advances in Signal Processing","","2012","1","10.1186/1687-6180-2012-237","Guo-Shiang LinHsiang-Yun HuangWei-Chih ChenCheng-Ying YehKai-Che LiuWen-Nung Lie","2012","http://link.springer.com/article/10.1186/1687-6180-2012-237","Article"
"MapReduce inspired loop mapping for coarse-grained reconfigurable architecture","Science China Information Sciences","","57","12","10.1007/s11432-014-5198-1","ShouYi YinShengJia ShaoLeiBo LiuShaoJun Wei","2014","http://link.springer.com/article/10.1007/s11432-014-5198-1","Article"
"Exploration of 3D grid caching strategies for ray-shooting","Journal of Real-Time Image Processing","","7","1","10.1007/s11554-010-0176-3","Stéphane ManciniZahir LarabiYves MathieuTomasz ToczekLionel Pierrefeu","2012","http://link.springer.com/article/10.1007/s11554-010-0176-3","Article"
"An efficient parallel solution for Caputo fractional reaction–diffusion equation","The Journal of Supercomputing","","68","3","10.1007/s11227-014-1123-z","Chunye GongWeimin BaoGuojian TangBo YangJie Liu","2014","http://link.springer.com/article/10.1007/s11227-014-1123-z","Article"
"Chimera states in Leaky Integrate-and-Fire dynamics with power law coupling","The European Physical Journal B","","93","8","10.1140/epjb/e2020-10252-9","Astero ProvataIoannis E. Venetis","2020","http://link.springer.com/article/10.1140/epjb/e2020-10252-9","Article"
"Type-Driven Automated Program Transformations and Cost Modelling for Optimising Streaming Programs on FPGAs","International Journal of Parallel Programming","","47","1","10.1007/s10766-018-0572-z","Wim VanderbauwhedeSyed Waqar NabiCristian Urlea","2019","http://link.springer.com/article/10.1007/s10766-018-0572-z","Article"
"High-performance parallel frequent subgraph discovery","The Journal of Supercomputing","","71","7","10.1007/s11227-015-1391-2","Saeed ShahrivariSaeed Jalili","2015","http://link.springer.com/article/10.1007/s11227-015-1391-2","Article"
"Serverless Workflows for Containerised Applications in the Cloud Continuum","Journal of Grid Computing","","19","3","10.1007/s10723-021-09570-2","Sebastián RiscoGermán MoltóDiana M. NaranjoIgnacio Blanquer","2021","http://link.springer.com/article/10.1007/s10723-021-09570-2","Article"
"Parallel implementation and optimization of the Sebvhos algorithm","Journal of Electronics (China)","","28","3","10.1007/s11767-011-0618-5","Wen LiLi GuoHongxing YuanYifang WeiHua Guan","2011","http://link.springer.com/article/10.1007/s11767-011-0618-5","Article"
"Smart computational light microscopes (SCLMs) of smart computational imaging laboratory (SCILab)","PhotoniX","","2","1","10.1186/s43074-021-00040-2","Yao FanJiaji LiLinpeng LuJiasong SunYan HuJialin ZhangZhuoshi LiQian ShenBowen WangRunnan ZhangQian ChenChao Zuo","2021","http://link.springer.com/article/10.1186/s43074-021-00040-2","Article"
"Testing machine learning based systems: a systematic mapping","Empirical Software Engineering","","25","6","10.1007/s10664-020-09881-0","Vincenzo RiccioGunel JahangirovaAndrea StoccoNargiz HumbatovaMichael WeissPaolo Tonella","2020","http://link.springer.com/article/10.1007/s10664-020-09881-0","Article"
"Intelligent Classification Method of Remote Sensing Image Based on Big Data in Spark Environment","International Journal of Wireless Information Networks","","26","3","10.1007/s10776-019-00440-z","Zhichao XingGuangming Li","2019","http://link.springer.com/article/10.1007/s10776-019-00440-z","Article"
"Parallelization of spherical discontinuous deformation analysis (SDDA) for geotechnical problems based on cloud computing environment","Science China Technological Sciences","","64","9","10.1007/s11431-020-1768-3","Yu-Yong JiaoZeYang WuFei ZhengQiang ZhaoLong WangGang-Hai HuangFei Tan","2021","http://link.springer.com/article/10.1007/s11431-020-1768-3","Article"
"Survey on Algorithm and VLSI Architecture for MPEG-Like Video Coder","Journal of Signal Processing Systems","","88","3","10.1007/s11265-016-1160-3","Haibing YinHuizhu JiaJun ZhouZhiyong Gao","2017","http://link.springer.com/article/10.1007/s11265-016-1160-3","Article"
"ESMRMB 2019, 36th Annual Scientific Meeting, Rotterdam, NL, October 3–October 5: Electronic Posters / Paper Posters / Clinical Review Posters / Software Exhibits","Magnetic Resonance Materials in Physics, Biology and Medicine","","32","1","10.1007/s10334-019-00756-0","","2019","http://link.springer.com/article/10.1007/s10334-019-00756-0","Article"
"Enable back memory and global synchronization on LLC buffer","The Journal of Supercomputing","","73","12","10.1007/s11227-017-2093-8","Licheng YuYulong PeiTianzhou ChenXueqing LouMinghui WuTiefei Zhang","2017","http://link.springer.com/article/10.1007/s11227-017-2093-8","Article"
"Video reasoning for conflict events through feature extraction","The Journal of Supercomputing","","77","6","10.1007/s11227-020-03514-5","Sheng-Tzong ChengChih-Wei HsuGwo-Jiun HorngCi-Ruei Jiang","2021","http://link.springer.com/article/10.1007/s11227-020-03514-5","Article"
"Continuous Probabilistic Subspace Skyline Query Processing Using Grid Projections","Journal of Computer Science and Technology","","29","2","10.1007/s11390-014-1434-9","Lei ZhaoYan-Yan YangXiaofang Zhou","2014","http://link.springer.com/article/10.1007/s11390-014-1434-9","Article"
"Network Management 2030: Operations and Control of Network 2030 Services","Journal of Network and Systems Management","","28","4","10.1007/s10922-020-09517-0","Alexander ClemmMohamed Faten ZhaniRaouf Boutaba","2020","http://link.springer.com/article/10.1007/s10922-020-09517-0","Article"
"Guest Editors’ Introduction to Special Issue on Advances in DSP System Design","Journal of Signal Processing Systems","","71","3","10.1007/s11265-013-0731-9","J. TakalaW. J. GrossW. Sung","2013","http://link.springer.com/article/10.1007/s11265-013-0731-9","Article"
"A Scalable Farm Skeleton for Hybrid Parallel and Distributed Programming","International Journal of Parallel Programming","","42","6","10.1007/s10766-013-0269-2","Steffen ErnstingHerbert Kuchen","2014","http://link.springer.com/article/10.1007/s10766-013-0269-2","Article"
"Special issue for data intensive eScience","Distributed and Parallel Databases","","30","5 - 6","10.1007/s10619-012-7107-1","Judy QiuDennis Gannon","2012","http://link.springer.com/article/10.1007/s10619-012-7107-1","Article"
"HPP controller: a system controller for high performance computing","Frontiers of Computer Science in China","","4","4","10.1007/s11704-010-0382-y","Fei ChenZheng CaoKai WangXuejun AnNinhui Sun","2010","http://link.springer.com/article/10.1007/s11704-010-0382-y","Article"
"A fine-granularity scheduling algorithm for parallel XDraw viewshed analysis","Earth Science Informatics","","11","3","10.1007/s12145-018-0339-5","Wanfeng DouYanan LiYanli Wang","2018","http://link.springer.com/article/10.1007/s12145-018-0339-5","Article"
"High-performance IP lookup using Intel Xeon Phi: a Bloom filters based approach","Journal of Internet Services and Applications","","9","1","10.1186/s13174-017-0075-y","Alexandre LucchesiAndré C. DrummondGeorge Teodoro","2018","http://link.springer.com/article/10.1186/s13174-017-0075-y","Article"
"A MapReduce-based distributed and scalable framework for stitching of satellite mosaic images","Arabian Journal of Geosciences","","14","18","10.1007/s12517-021-07500-w","Süleyman EkenAhmet Sayar","2021","http://link.springer.com/article/10.1007/s12517-021-07500-w","Article"
"A Roadmap for HEP Software and Computing R&D for the 2020s","Computing and Software for Big Science","","3","1","10.1007/s41781-018-0018-8","Johannes AlbrechtAntonio Augusto Alves JrGuilherme AmadioGiuseppe AndronicoNguyen Anh-KyLaurent AphecetcheJohn ApostolakisMakoto AsaiLuca AtzoriMarian BabikGiuseppe BagliesiMarilena BandieramonteSunanda BanerjeeMartin BarisitsLothar A. T. BauerdickStefano Belforte","2019","http://link.springer.com/article/10.1007/s41781-018-0018-8","Article"
"An asynchronous and task-based implementation of peridynamics utilizing HPX—the C++ standard library for parallelism and concurrency","SN Applied Sciences","","2","12","10.1007/s42452-020-03784-x","Patrick DiehlPrashant K. JhaHartmut KaiserRobert LiptonMartin Lévesque","2020","http://link.springer.com/article/10.1007/s42452-020-03784-x","Article"
"Structured mesh-oriented framework design and optimization for a coarse-grained parallel CFD solver based on hybrid MPI/OpenMP programming","The Journal of Supercomputing","","76","4","10.1007/s11227-019-03063-6","Feng HeXiaoshe DongNianjun ZouWeiguo WuXingjun Zhang","2020","http://link.springer.com/article/10.1007/s11227-019-03063-6","Article"
"A methodology for speeding up matrix vector multiplication for single/multi-core architectures","The Journal of Supercomputing","","71","7","10.1007/s11227-015-1409-9","Vasilios KelefourasAngeliki KritikakouElissavet PapadimaCostas Goutis","2015","http://link.springer.com/article/10.1007/s11227-015-1409-9","Article"
"On the use of models for high-performance scientific computing applications: an experience report","Software & Systems Modeling","","17","1","10.1007/s10270-016-0518-0","Ileana OberMarc PalyartJean-Michel BruelDavid Lugato","2018","http://link.springer.com/article/10.1007/s10270-016-0518-0","Article"
"GridFOR: A Domain Specific Language for Parallel Grid-Based Applications","International Journal of Parallel Programming","","44","3","10.1007/s10766-014-0348-z","Ye WangZhiyuan Li","2016","http://link.springer.com/article/10.1007/s10766-014-0348-z","Article"
"Mapping techniques in multicore processors: current and future trends","The Journal of Supercomputing","","77","8","10.1007/s11227-021-03650-6","Manjari GuptaLava BhargavaS. Indu","2021","http://link.springer.com/article/10.1007/s11227-021-03650-6","Article"
"Self-tuning serverless task farming using proactive elasticity control","Cluster Computing","","24","2","10.1007/s10586-020-03158-3","Stefan KehrerDominik ZietlowJochen ScheffoldWolfgang Blochinger","2021","http://link.springer.com/article/10.1007/s10586-020-03158-3","Article"
"CRFs based parallel biomedical named entity recognition algorithm employing MapReduce framework","Cluster Computing","","18","2","10.1007/s10586-015-0426-z","Zhuo TangLingang JiangLi YangKenli LiKeqin Li","2015","http://link.springer.com/article/10.1007/s10586-015-0426-z","Article"
"Fast implementation of area integral model SART algorithm based on look-up table","Cluster Computing","","22","6","10.1007/s10586-018-2533-0","Shunli ZhangGuohua GengZhan LiYuhe Zhang","2019","http://link.springer.com/article/10.1007/s10586-018-2533-0","Article"
"The evolution of distributed computing systems: from fundamental to new frontiers","Computing","","103","8","10.1007/s00607-020-00900-y","Dominic LindsaySukhpal Singh GillDaria SmirnovaPeter Garraghan","2021","http://link.springer.com/article/10.1007/s00607-020-00900-y","Article"
"A survey: ICT enabled energy efficiency techniques for big data applications","Cluster Computing","","23","2","10.1007/s10586-019-02958-6","Sumedha AroraAnju Bala","2020","http://link.springer.com/article/10.1007/s10586-019-02958-6","Article"
"A fast scalable distributed kriging algorithm using Spark framework","International Journal of Data Science and Analytics","","10","3","10.1007/s41060-020-00215-3","Chandan MisraSourangshu BhattacharyaSoumya K. Ghosh","2020","http://link.springer.com/article/10.1007/s41060-020-00215-3","Article"
"SMOaaS: a Scalable Matrix Operation as a Service model in Cloud","The Journal of Supercomputing","","77","4","10.1007/s11227-020-03400-0","KC UjjwalSudheer Kumar BattulaSaurabh GargRanesh Kumar NahaMd Anwarul Kaium PatwaryAlexander Brown","2021","http://link.springer.com/article/10.1007/s11227-020-03400-0","Article"
"Unimem: Runtime Data Management on Non-Volatile Memory-Based Heterogeneous Main Memory for High Performance Computing","Journal of Computer Science and Technology","","36","1","10.1007/s11390-020-0942-z","Kai WuDong Li","2021","http://link.springer.com/article/10.1007/s11390-020-0942-z","Article"
"Guest Editors’ Comments","Journal of Signal Processing Systems","","54","1 - 3","10.1007/s11265-008-0259-6","Feng LinMalini Olivo","2009","http://link.springer.com/article/10.1007/s11265-008-0259-6","Article"
"Exploiting dynamic transaction queue size in scalable memory systems","Soft Computing","","22","6","10.1007/s00500-016-2470-x","Mario Donato MarinoTien-Hsiung WengKuan-Ching Li","2018","http://link.springer.com/article/10.1007/s00500-016-2470-x","Article"
"Accelerating DES and AES Algorithms for a Heterogeneous Many-core Processor","International Journal of Parallel Programming","","49","3","10.1007/s10766-021-00692-4","Biao XingDanDan WangYongquan YangZhiqiang WeiJiajing WuCuihua He","2021","http://link.springer.com/article/10.1007/s10766-021-00692-4","Article"
"HAT: history-based auto-tuning MapReduce in heterogeneous environments","The Journal of Supercomputing","","64","3","10.1007/s11227-011-0682-5","Quan ChenMinyi GuoQianni DengLong ZhengSong GuoYao Shen","2013","http://link.springer.com/article/10.1007/s11227-011-0682-5","Article"
"Optimizing virtual machine placement in IaaS data centers: taxonomy, review and open issues","Cluster Computing","","23","2","10.1007/s10586-019-02954-w","Hamid TalebianAbdullah GaniMehdi SookhakAhmed Abdelaziz AbdelatifAbdullah YousafzaiAthanasios V. VasilakosFei Richard Yu","2020","http://link.springer.com/article/10.1007/s10586-019-02954-w","Article"
"Method of binary search for image elements of functionally defined objects using graphics processing units","Optoelectronics, Instrumentation and Data Processing","","50","6","10.3103/S8756699014060090","S. I. Vyatkin","2014","http://link.springer.com/article/10.3103/S8756699014060090","Article"
"Acquisition of High Spatial and Spectral Resolution Video with a Hybrid Camera System","International Journal of Computer Vision","","110","2","10.1007/s11263-013-0690-4","Chenguang MaXun CaoXin TongQionghai DaiStephen Lin","2014","http://link.springer.com/article/10.1007/s11263-013-0690-4","Article"
"EANM’16","European Journal of Nuclear Medicine and Molecular Imaging","","43","1","10.1007/s00259-016-3484-4","","2016","http://link.springer.com/article/10.1007/s00259-016-3484-4","Article"
"Parallel synchronous and asynchronous coupled simulated annealing","The Journal of Supercomputing","","74","6","10.1007/s11227-018-2327-4","Kayo Gonçalves-e-SilvaDaniel AloiseSamuel Xavier-de-Souza","2018","http://link.springer.com/article/10.1007/s11227-018-2327-4","Article"
"An improved segmentation algorithm of CT image based on U-Net network and attention mechanism","Multimedia Tools and Applications","","","","10.1007/s11042-021-10841-z","Jin YangKai Qiu","2021","http://link.springer.com/article/10.1007/s11042-021-10841-z","Article"
"Efficient computation of motif discovery on Intel Many Integrated Core (MIC) Architecture","BMC Bioinformatics","","19","9","10.1186/s12859-018-2276-1","Shaoliang PengMinxia ChengKaiwen HuangYingBo CuiZhiqiang ZhangRunxin GuoXiaoyu ZhangShunyun YangXiangke LiaoYutong LuQuan ZouBenyun Shi","2018","http://link.springer.com/article/10.1186/s12859-018-2276-1","Article"
"Deep Arm/Ear-ECG Image Learning for Highly Wearable Biometric Human Identification","Annals of Biomedical Engineering","","46","1","10.1007/s10439-017-1944-z","Qingxue ZhangDian Zhou","2018","http://link.springer.com/article/10.1007/s10439-017-1944-z","Article"
"pocl: A Performance-Portable OpenCL Implementation","International Journal of Parallel Programming","","43","5","10.1007/s10766-014-0320-y","Pekka JääskeläinenCarlos Sánchez de La LamaErik SchnetterKalle RaiskilaJarmo TakalaHeikki Berg","2015","http://link.springer.com/article/10.1007/s10766-014-0320-y","Article"
"Advances in Databases and Information Systems","Information Systems Frontiers","","20","1","10.1007/s10796-017-9819-2","Ladjel BellatrechePatrick ValduriezTadeusz Morzy","2018","http://link.springer.com/article/10.1007/s10796-017-9819-2","Article"
"Challenges and possible approaches: towards the petaflops computers","Frontiers of Computer Science in China","","3","3","10.1007/s11704-009-0022-6","Depei QianDanfeng Zhu","2009","http://link.springer.com/article/10.1007/s11704-009-0022-6","Article"
"Towards predicting GPGPU performance for concurrent workloads in Multi-GPGPU environment","Cluster Computing","","23","3","10.1007/s10586-020-03105-2","Sunggon KimDongwhan KimYongseok SonHyeonsang Eom","2020","http://link.springer.com/article/10.1007/s10586-020-03105-2","Article"
"A survey on data analysis on large-Scale wireless networks: online stream processing, trends, and challenges","Journal of Internet Services and Applications","","11","1","10.1186/s13174-020-00127-2","Dianne S. V. MedeirosHelio N. Cunha NetoMartin Andreoni LopezLuiz Claudio S. MagalhãesNatalia C. FernandesAlex B. VieiraEdelberto F. SilvaDiogo M. F. Mattos","2020","http://link.springer.com/article/10.1186/s13174-020-00127-2","Article"
"Legal Risk Management","Informatik-Spektrum","","39","2","10.1007/s00287-016-0962-9","","2016","http://link.springer.com/article/10.1007/s00287-016-0962-9","Article"
"Parallel technology for numerical modeling of fluid dynamics problems by high-accuracy algorithms","Computational Mathematics and Mathematical Physics","","55","4","10.1134/S0965542515040065","A. V. Gorobets","2015","http://link.springer.com/article/10.1134/S0965542515040065","Article"
"Modeling of a method of parallel hierarchical transformation for fast recognition of dynamic images","EURASIP Journal on Advances in Signal Processing","","2013","1","10.1186/1687-6180-2013-87","Leonid I. TimchenkoNataliya I. KokryatskayaViktoriya V. Shpakovych","2013","http://link.springer.com/article/10.1186/1687-6180-2013-87","Article"
"Optimizing inter-nest data locality in imperfect stencils based on loop blocking","The Journal of Supercomputing","","74","10","10.1007/s11227-018-2443-1","Yousef SeyfariShahriar LotfiJaber Karimpour","2018","http://link.springer.com/article/10.1007/s11227-018-2443-1","Article"
"Intelligent and independent processes for overcoming big graphs","The Journal of Supercomputing","","73","4","10.1007/s11227-016-1834-4","Masoud SagharichianHassan Naderi","2017","http://link.springer.com/article/10.1007/s11227-016-1834-4","Article"
"Parallelizing Convolutional Neural Networks for Action Event Recognition in Surveillance Videos","International Journal of Parallel Programming","","45","4","10.1007/s10766-016-0451-4","Qicong WangJinhao ZhaoDingxi GongYehu ShenMaozhen LiYunqi Lei","2017","http://link.springer.com/article/10.1007/s10766-016-0451-4","Article"
"Combining metaheuristics with mathematical programming, constraint programming and machine learning","4OR","","11","2","10.1007/s10288-013-0242-3","El-Ghazali Talbi","2013","http://link.springer.com/article/10.1007/s10288-013-0242-3","Article"
"Solving Dynamic Programming Problems on a Computational Grid","Computational Economics","","45","2","10.1007/s10614-014-9419-x","Yongyang CaiKenneth L. JuddGreg ThainStephen J. Wright","2015","http://link.springer.com/article/10.1007/s10614-014-9419-x","Article"
"A review of parallel computing for large-scale remote sensing image mosaicking","Cluster Computing","","18","2","10.1007/s10586-015-0422-3","Lajiao ChenYan MaPeng LiuJingbo WeiWei JieJijun He","2015","http://link.springer.com/article/10.1007/s10586-015-0422-3","Article"
"From latex specifications to parallel codes","The Journal of Supercomputing","","64","1","10.1007/s11227-012-0797-3","Alejandro AcostaFrancisco AlmeidaIgnacio Peláez","2013","http://link.springer.com/article/10.1007/s11227-012-0797-3","Article"
"A semantics comparison workbench for a concurrent, asynchronous, distributed programming language","Formal Aspects of Computing","","30","1","10.1007/s00165-017-0443-1","Claudio CorrodiAlexander HeußnerChristopher M. Poskitt","2018","http://link.springer.com/article/10.1007/s00165-017-0443-1","Article"
"MapReduce for parallel trace validation of LTL properties","Journal of Cloud Computing","","4","1","10.1186/s13677-015-0032-x","Sylvain HalléMaxime Soucy-Boivin","2015","http://link.springer.com/article/10.1186/s13677-015-0032-x","Article"
"ParDSL: a domain-specific language framework for supporting deployment of parallel algorithms","Software & Systems Modeling","","18","5","10.1007/s10270-018-00705-w","Bedir TekinerdoganEthem Arkin","2019","http://link.springer.com/article/10.1007/s10270-018-00705-w","Article"
"Canny edge detection and Hough transform for high resolution video streams using Hadoop and Spark","Cluster Computing","","23","1","10.1007/s10586-019-02929-x","Bilal IqbalWaheed IqbalNazar KhanArif MahmoodAbdelkarim Erradi","2020","http://link.springer.com/article/10.1007/s10586-019-02929-x","Article"
"Dynamic resource provisioning for cyber-physical systems in cloud-fog-edge computing","Journal of Cloud Computing","","9","1","10.1186/s13677-020-00181-y","Zhanyang XuYanqi ZhangHaoyuan LiWeijing YangQuan Qi","2020","http://link.springer.com/article/10.1186/s13677-020-00181-y","Article"
"Combining metaheuristics with mathematical programming, constraint programming and machine learning","Annals of Operations Research","","240","1","10.1007/s10479-015-2034-y","El-Ghazali Talbi","2016","http://link.springer.com/article/10.1007/s10479-015-2034-y","Article"
"Cloud workflow scheduling with hybrid resource provisioning","The Journal of Supercomputing","","74","12","10.1007/s11227-017-2043-5","Long ChenXiaoping Li","2018","http://link.springer.com/article/10.1007/s11227-017-2043-5","Article"
"A Resource Aware MapReduce Based Parallel SVM for Large Scale Image Classifications","Neural Processing Letters","","44","1","10.1007/s11063-015-9472-z","Wenming GuoNasullah Khalid AlhamYang LiuMaozhen LiMan Qi","2016","http://link.springer.com/article/10.1007/s11063-015-9472-z","Article"
"High-level dataflow programming for real-time image processing on smart cameras","Journal of Real-Time Image Processing","","12","4","10.1007/s11554-014-0462-6","Jocelyn SérotFrançois BerryCédric Bourrasset","2016","http://link.springer.com/article/10.1007/s11554-014-0462-6","Article"
"Dynamic frequency based parallel k-bat algorithm for massive data clustering (DFBPKBA)","International Journal of System Assurance Engineering and Management","","9","4","10.1007/s13198-017-0665-x","Ashish Kumar TripathiKapil SharmaManju Bala","2018","http://link.springer.com/article/10.1007/s13198-017-0665-x","Article"
"FDGLib: A Communication Library for Efficient Large-Scale Graph Processing in FPGA-Accelerated Data Centers","Journal of Computer Science and Technology","","36","5","10.1007/s11390-021-1242-y","Yu-Wei WuQing-Gang WangLong ZhengXiao-Fei LiaoHai JinWen-Bin JiangRan ZhengKan Hu","2021","http://link.springer.com/article/10.1007/s11390-021-1242-y","Article"
"On the impact of quantum computing technology on future developments in high-performance scientific computing","Ethics and Information Technology","","19","4","10.1007/s10676-017-9438-0","Matthias MöllerCornelis Vuik","2017","http://link.springer.com/article/10.1007/s10676-017-9438-0","Article"
"Deep learning for intelligent traffic sensing and prediction: recent advances and future challenges","CCF Transactions on Pervasive Computing and Interaction","","2","4","10.1007/s42486-020-00039-x","Xiaochen FanChaocan XiangLiangyi GongXin HeYuben QuSaeed AmirgholipourYue XiPriyadarsi NandaXiangjian He","2020","http://link.springer.com/article/10.1007/s42486-020-00039-x","Article"
"Big data fuzzy C-means algorithm based on bee colony optimization using an Apache Hbase","Journal of Big Data","","8","1","10.1186/s40537-021-00450-w","Seyyed Mohammad RazaviMohsen KahaniSamad Paydar","2021","http://link.springer.com/article/10.1186/s40537-021-00450-w","Article"
"Dynamic top-k influence maximization in social networks","GeoInformatica","","","","10.1007/s10707-020-00419-6","Binbin ZhangHao WangLeong Hou U","2020","http://link.springer.com/article/10.1007/s10707-020-00419-6","Article"
"Soil-moisture estimation from TerraSAR-X data using neural networks","Machine Vision and Applications","","23","5","10.1007/s00138-011-0375-3","Matej KsenemanDušan GleichBožidar Potočnik","2012","http://link.springer.com/article/10.1007/s00138-011-0375-3","Article"
"Real-Time FPGA Implementation of FIR Filter Using OpenCL Design","Journal of Signal Processing Systems","","","","10.1007/s11265-021-01723-6","Iman FirmansyahYoshiki Yamaguchi","2022","http://link.springer.com/article/10.1007/s11265-021-01723-6","Article"
"Primitives towards verifiable computation: a survey","Frontiers of Computer Science","","12","3","10.1007/s11704-016-6148-4","Haseeb AhmadLicheng WangHaibo HongJing LiHassan DawoodManzoor AhmedYixian Yang","2018","http://link.springer.com/article/10.1007/s11704-016-6148-4","Article"
"Bayesian computation: a summary of the current state, and samples backwards and forwards","Statistics and Computing","","25","4","10.1007/s11222-015-9574-5","Peter J. GreenKrzysztof ŁatuszyńskiMarcelo PereyraChristian P. Robert","2015","http://link.springer.com/article/10.1007/s11222-015-9574-5","Article"
"Massively parallel acceleration methods for image handling operations","Cluster Computing","","20","2","10.1007/s10586-017-0788-5","Nakhoon BaekKwan-Hee Yoo","2017","http://link.springer.com/article/10.1007/s10586-017-0788-5","Article"
"High-performance interconnection networks in the Exascale and Big-Data Era","The Journal of Supercomputing","","72","12","10.1007/s11227-016-1893-6","Jesús Escudero-SahuquilloPedro Javier Garcia","2016","http://link.springer.com/article/10.1007/s11227-016-1893-6","Article"
"Efficient parallel derivation of short distinguishing sequences for nondeterministic finite state machines using MapReduce","Journal of Big Data","","8","1","10.1186/s40537-021-00535-6","Bilal ElghadyryFaissal OuardiZineb LotfiSébastien Verel","2021","http://link.springer.com/article/10.1186/s40537-021-00535-6","Article"
"CHAOS: a parallelization scheme for training convolutional neural networks on Intel Xeon Phi","The Journal of Supercomputing","","75","1","10.1007/s11227-017-1994-x","André ViebkeSuejb MemetiSabri PllanaAjith Abraham","2019","http://link.springer.com/article/10.1007/s11227-017-1994-x","Article"
"Multimedia and multi-feature cluster fusion model based on saliency for mobile network applications","Cluster Computing","","22","4","10.1007/s10586-017-1335-0","Zhenze JiaXiaoguang FanHaoxiang Wang","2019","http://link.springer.com/article/10.1007/s10586-017-1335-0","Article"
"RCSoS: An IEC 61508 Compatible Server Model for Reliable Communication","Journal of Signal Processing Systems","","80","3","10.1007/s11265-014-0914-z","Rui ZhouXiaolong ChenHuaming ChenFenglong YanChunlin ChenQi YuQingguo ZhouKuan-Ching Li","2015","http://link.springer.com/article/10.1007/s11265-014-0914-z","Article"
"Volume rendering visualization of 3D spherical mantle convection with an unstructured mesh","Visual Geosciences","","13","1","10.1007/s10069-008-0012-0","Shi ChenHuai ZhangDavid A. YuenShuxia ZhangJian ZhangYaolin Shi","2008","http://link.springer.com/article/10.1007/s10069-008-0012-0","Article"
"Performance analysis of deep learning workloads using roofline trajectories","CCF Transactions on High Performance Computing","","1","3 - 4","10.1007/s42514-019-00018-4","M. Haseeb JavedKhaled Z. IbrahimXiaoyi Lu","2019","http://link.springer.com/article/10.1007/s42514-019-00018-4","Article"
"Dynamic simulation of liquid-filled flexible multibody systems via absolute nodal coordinate formulation and SPH method","Nonlinear Dynamics","","75","4","10.1007/s11071-013-1093-3","Wei HuQiang TianHaiyan Hu","2014","http://link.springer.com/article/10.1007/s11071-013-1093-3","Article"
"Scalable parallel implementation of migrating birds optimization for the multi-objective task allocation problem","The Journal of Supercomputing","","77","3","10.1007/s11227-020-03369-w","Dindar ÖzIşıl Öz","2021","http://link.springer.com/article/10.1007/s11227-020-03369-w","Article"
"Guest Editorial: Special Issue on Computing Frontiers","International Journal of Parallel Programming","","46","2","10.1007/s10766-018-0556-z","Antonino TumeoHubertus FrankeGianluca PalermoJohn Feo","2018","http://link.springer.com/article/10.1007/s10766-018-0556-z","Article"
"Special issue on data management on modern hardware","Distributed and Parallel Databases","","33","3","10.1007/s10619-014-7168-4","Qiong LuoJens Teubner","2015","http://link.springer.com/article/10.1007/s10619-014-7168-4","Article"
"Hybrid clusters for budget supercomputers and cloud computing","Automation and Remote Control","","75","10","10.1134/S0005117914100130","N. P. VasilyevM. M. Rovnyagin","2014","http://link.springer.com/article/10.1134/S0005117914100130","Article"
"Big Data-Aware Intrusion Detection System in Communication Networks: a Deep Learning Approach","Journal of Grid Computing","","19","4","10.1007/s10723-021-09581-z","Mahzad MahdavisharifShahram JamaliReza Fotohi","2021","http://link.springer.com/article/10.1007/s10723-021-09581-z","Article"
"PIC methods in astrophysics: simulations of relativistic jets and kinetic physics in astrophysical systems","Living Reviews in Computational Astrophysics","","7","1","10.1007/s41115-021-00012-0","Kenichi NishikawaIoana DuţanChristoph KöhnYosuke Mizuno","2021","http://link.springer.com/article/10.1007/s41115-021-00012-0","Article"
"Distributed deep learning platform for pedestrian detection on IT convergence environment","The Journal of Supercomputing","","76","7","10.1007/s11227-020-03195-0","Seong-Soo HanYoon-Ki KimYou-Boo JeonJinSoo ParkDoo-Soon ParkDuHyun HwangChang-Sung Jeong","2020","http://link.springer.com/article/10.1007/s11227-020-03195-0","Article"
"Downsampling Algorithms for Large Sparse Matrices","International Journal of Parallel Programming","","43","5","10.1007/s10766-014-0315-8","Daniel LangrPavel TvrdíkIvan ŠimečekTomáš Dytrych","2015","http://link.springer.com/article/10.1007/s10766-014-0315-8","Article"
"Big data as the new enabler in business and other intelligence","Vietnam Journal of Computer Science","","1","1","10.1007/s40595-013-0001-6","Gottfried Vossen","2014","http://link.springer.com/article/10.1007/s40595-013-0001-6","Article"
"A novel approach for big data processing using message passing interface based on memory mapping","Journal of Big Data","","6","1","10.1186/s40537-019-0275-3","Saad Ahmed DheyabMohammed Najm AbdullahButhainah Fahran Abed","2019","http://link.springer.com/article/10.1186/s40537-019-0275-3","Article"
"Seeking the best Weather Research and Forecasting model performance: an empirical score approach","The Journal of Supercomputing","","76","12","10.1007/s11227-020-03219-9","R. MorenoE. AriasD. CazorlaJ. J. PardoF. J. Tapiador","2020","http://link.springer.com/article/10.1007/s11227-020-03219-9","Article"
"The READEX formalism for automatic tuning for energy efficiency","Computing","","99","8","10.1007/s00607-016-0532-7","Joseph SchuchartMichael GerndtPer Gunnar KjeldsbergMichael LysaghtDavid HorákLubomír ŘíhaAndreas GochtMohammed SourouriMadhura KumaraswamyAnamika ChowdhuryMagnus JahreKai DiethelmOthman BouiziUmbreen Sabir MianJakub KružíkRadim Sojka","2017","http://link.springer.com/article/10.1007/s00607-016-0532-7","Article"
"High-level dataflow design of signal processing systems for reconfigurable and multicore heterogeneous platforms","Journal of Real-Time Image Processing","","9","1","10.1007/s11554-013-0326-5","Endri BezatiRichard ThavotGhislain RoquierMarco Mattavelli","2014","http://link.springer.com/article/10.1007/s11554-013-0326-5","Article"
"Machine Learning Meets Databases","Datenbank-Spektrum","","17","1","10.1007/s13222-017-0247-8","Stephan Günnemann","2017","http://link.springer.com/article/10.1007/s13222-017-0247-8","Article"
"Street sweeper: detecting and removing cars in street view images","Multimedia Tools and Applications","","74","23","10.1007/s11042-014-2213-x","Wei-Ta ChuYing-Chieh ChaoYi-Sheng Chang","2015","http://link.springer.com/article/10.1007/s11042-014-2213-x","Article"
"ZAKI: A Smart Method and Tool for Automatic Performance Optimization of Parallel SpMV Computations on Distributed Memory Machines","Mobile Networks and Applications","","","","10.1007/s11036-019-01318-3","Sardar UsmanRashid MehmoodIyad KatibAiiad AlbeshriSaleh M. Altowaijri","2019","http://link.springer.com/article/10.1007/s11036-019-01318-3","Article"
"Parallel decomposition of combinatorial optimization problems using electro-optical vector by matrix multiplication architecture","The Journal of Supercomputing","","62","2","10.1007/s11227-010-0517-9","Dan E. TamirNatan T. ShakedWilhelmus J. GeertsShlomi Dolev","2012","http://link.springer.com/article/10.1007/s11227-010-0517-9","Article"
"Energy-efficient computing-in-memory architecture for AI processor: device, circuit, architecture perspective","Science China Information Sciences","","64","6","10.1007/s11432-021-3234-0","Liang ChangChenglong LiZhaomin ZhangJianbiao XiaoQingsong LiuZhen ZhuWeihang LiZixuan ZhuSiqi YangJun Zhou","2021","http://link.springer.com/article/10.1007/s11432-021-3234-0","Article"
"Parallel Asynchronous Strategies for the Execution of Feature Selection Algorithms","International Journal of Parallel Programming","","46","2","10.1007/s10766-017-0493-2","Jorge SilvaAna AguiarFernando Silva","2018","http://link.springer.com/article/10.1007/s10766-017-0493-2","Article"
"Taxonomy and issues for antifragile-based multimedia cloud computing","Journal of Reliable Intelligent Environments","","2","1","10.1007/s40860-016-0017-7","Syed Fawad HaiderLaraib AbbasAmjad AliMuddesar IqbalImran RazaSyed Asad HussainDoug Young Suh","2016","http://link.springer.com/article/10.1007/s40860-016-0017-7","Article"
"Parallelization Strategy for Elementary Morphological Operators on Graphs: Distance-Based Algorithms and Implementation on Multicore Shared-Memory Architecture","Journal of Mathematical Imaging and Vision","","59","1","10.1007/s10851-017-0737-1","Imane YoukanaJean CoustyRachida SaouliMohamed Akil","2017","http://link.springer.com/article/10.1007/s10851-017-0737-1","Article"
"Real-Time 3D Depth Generation for Stereoscopic Video Applications with Thread-Level Superscalar-Pipeline Parallelization","Journal of Signal Processing Systems","","72","1","10.1007/s11265-012-0691-5","Guo-An JianCheng-An ChienPeng-Sheng ChenJiun-In Guo","2013","http://link.springer.com/article/10.1007/s11265-012-0691-5","Article"
"Mobile clusters of single board computers: an option for providing resources to student projects and researchers","SpringerPlus","","5","1","10.1186/s40064-016-1981-3","Christian Baun","2016","http://link.springer.com/article/10.1186/s40064-016-1981-3","Article"
"A two-level storage strategy for map-reduce enabled computation of local map algebra","Earth Science Informatics","","13","2","10.1007/s12145-020-00452-x","Jianbo ZhangSimin ZhouTingnan LiangYongchang LiCaikun ChenHao Xia","2020","http://link.springer.com/article/10.1007/s12145-020-00452-x","Article"
"Distributed discovery of frequent subgraphs of a network using MapReduce","Computing","","97","11","10.1007/s00607-015-0446-9","Saeed ShahrivariSaeed Jalili","2015","http://link.springer.com/article/10.1007/s00607-015-0446-9","Article"
"A multilayer shallow learning approach to variation prediction and variation source identification in multistage machining processes","Journal of Intelligent Manufacturing","","32","4","10.1007/s10845-020-01649-z","Filmon YacobDaniel Semere","2021","http://link.springer.com/article/10.1007/s10845-020-01649-z","Article"
"An Intra-Server Interconnect Fabric for Heterogeneous Computing","Journal of Computer Science and Technology","","29","6","10.1007/s11390-014-1483-0","Zheng CaoXiao-Li LiuQiang LiXiao-Bing LiuZhan WangXue-Jun An","2014","http://link.springer.com/article/10.1007/s11390-014-1483-0","Article"
"Shared memory implementation and performance analysis of LSB steganography based on chaotic tent map","Innovations in Systems and Software Engineering","","17","4","10.1007/s11334-021-00385-8","Gaurav GambhirJyotsna Kumar Mandal","2021","http://link.springer.com/article/10.1007/s11334-021-00385-8","Article"
"A fully-customized dataflow engine for 3D earthquake simulation with a complex topography","Science China Information Sciences","","65","5","10.1007/s11432-020-2976-5","Bingwei ChenHaohuan FuWayne LukGuangwen Yang","2021","http://link.springer.com/article/10.1007/s11432-020-2976-5","Article"
"Hybridizing particle swarm optimization with simulated annealing and differential evolution","Cluster Computing","","24","2","10.1007/s10586-020-03179-y","Emad MirsadeghiSalman Khodayifar","2021","http://link.springer.com/article/10.1007/s10586-020-03179-y","Article"
"Frame-based Programming, Stream-Based Processing for Medical Image Processing Applications","Journal of Signal Processing Systems","","91","1","10.1007/s11265-018-1422-3","Joost HoozemansRob de JongSteven van der VlugtJeroen Van StratenUttam Kumar ElangoZaid Al-Ars","2019","http://link.springer.com/article/10.1007/s11265-018-1422-3","Article"
"HeDPM: load balancing of linear pipeline applications on heterogeneous systems","The Journal of Supercomputing","","73","9","10.1007/s11227-017-1971-4","Andreu MorenoAnna SikoraEduardo CésarJoan SorribesTomàs Margalef","2017","http://link.springer.com/article/10.1007/s11227-017-1971-4","Article"
"Could we use a million cores to solve an integer program?","Mathematical Methods of Operations Research","","76","1","10.1007/s00186-012-0390-9","Thorsten KochTed RalphsYuji Shinano","2012","http://link.springer.com/article/10.1007/s00186-012-0390-9","Article"
"Improving the performance of GIS polygon overlay computation with MapReduce for spatial big data processing","Cluster Computing","","18","2","10.1007/s10586-015-0428-x","Yong WangZhenling LiuHongyan LiaoChengjun Li","2015","http://link.springer.com/article/10.1007/s10586-015-0428-x","Article"
"A survey on reliability and availability modeling of edge, fog, and cloud computing","Journal of Reliable Intelligent Environments","","","","10.1007/s40860-021-00154-1","Paulo MacielJamilson DantasCarlos MeloPaulo PereiraFelipe OliveiraJean AraujoRubens Matos","2021","http://link.springer.com/article/10.1007/s40860-021-00154-1","Article"
"Automating NEURON Simulation Deployment in Cloud Resources","Neuroinformatics","","15","1","10.1007/s12021-016-9315-8","David B. StocktonFidel Santamaria","2017","http://link.springer.com/article/10.1007/s12021-016-9315-8","Article"
"Molecular simulation and the collaborative computational projects","The European Physical Journal H","","45","4 - 5","10.1140/epjh/e2020-10034-9","William SmithMartyn GuestIlian TodorovPaul Durham","2020","http://link.springer.com/article/10.1140/epjh/e2020-10034-9","Article"
"Towards Enabling Live Thresholding as Utility to Manage Elastic Master-Slave Applications in the Cloud","Journal of Grid Computing","","15","4","10.1007/s10723-017-9405-3","Vinicius Facco RodriguesRodrigo da Rosa RighiGustavo RostirollaJorge Luis Victória BarbosaCristiano André da CostaAntônio Marcos AlbertiVictor Chang","2017","http://link.springer.com/article/10.1007/s10723-017-9405-3","Article"
"High-Level Heterogeneous and Hierarchical Parallel Systems (HLPGPU 2014)","International Journal of Parallel Programming","","43","5","10.1007/s10766-015-0367-4","Christopher Brown","2015","http://link.springer.com/article/10.1007/s10766-015-0367-4","Article"
================================================
FILE: notebooks/example.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Example of using litstudy\n",
"\n",
"This notebook shows an example of how to use `litstudy` from inside a Jupyter notebook. It shows how to load a dataset, plot statistics, perform topic modeling, do network analysis, and some more advanced features. \n",
"\n",
"This notebook focuses on the topic of programming model for GPUs. GPUs (Graphic Processing Units) are specialized processors that are used in many data centers and supercomputers for data processing and machine learning. However, programming these devices remaining difficult, which is why there is a plethora of research on developing programming models for GPUs."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Imports"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# Import other libraries \n",
"import os\n",
"import sys\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sbs\n",
"\n",
"# Options for plots\n",
"plt.rcParams['figure.figsize'] = (10, 6)\n",
"sbs.set('paper')\n",
"\n",
"# Import litstudy\n",
"path = os.path.abspath(os.path.join('..'))\n",
"if path not in sys.path:\n",
" sys.path.append(path)\n",
"\n",
"import litstudy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Collecting the dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For this example, we have queried both IEEE Xplore and Springer Link for `\"GPU\" and \"programming model\"`. IEEE Xplore gives 5 CSV files (1 per page) and Springer Link gives a single CSV file. We load all files document sets and merge the resulting document sets."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"441 papers loaded from IEEE\n",
"1000 papers loaded from Springer\n",
"1441 papers loaded from CSV\n"
]
}
],
"source": [
"# Load the CSV files\n",
"docs1 = litstudy.load_ieee_csv('data/ieee_1.csv')\n",
"docs2 = litstudy.load_ieee_csv('data/ieee_2.csv')\n",
"docs3 = litstudy.load_ieee_csv('data/ieee_3.csv')\n",
"docs4 = litstudy.load_ieee_csv('data/ieee_4.csv')\n",
"docs5 = litstudy.load_ieee_csv('data/ieee_5.csv')\n",
"docs_ieee = docs1 | docs2 | docs3 | docs4 | docs5\n",
"print(len(docs_ieee), 'papers loaded from IEEE')\n",
"\n",
"docs_springer = litstudy.load_springer_csv('data/springer.csv')\n",
"print(len(docs_springer), 'papers loaded from Springer')\n",
"\n",
"# Merge the two document sets\n",
"docs_csv = docs_ieee | docs_springer\n",
"print(len(docs_csv), 'papers loaded from CSV')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also exclude some papers that we are not interested in. Here, we load a document set from a RIS file and subtract these documents from our original document set."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 papers were excluded\n",
"1440 paper remaining\n"
]
}
],
"source": [
"docs_exclude = litstudy.load_ris_file('data/exclude.ris')\n",
"docs_remaining = docs_csv - docs_exclude\n",
"\n",
"print(len(docs_exclude), 'papers were excluded')\n",
"print(len(docs_remaining), 'paper remaining')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The amount metadata provided by the CSV files is minimal. To enhance the metadata, we can find the corresponding articles on Scopus using `refine_scopus`. This function returns two sets: the set of documents that were found on Scopus and the set of original documents not were not found. We have two options on how to handle these two sets: (1) merge the two sets back into one set or (2) discard the documents that were not found. We chose the second option here for simplicity."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1440/1440 [00:03<00:00, 361.20it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1387 papers found on Scopus\n",
"53 papers were not found and were discarded\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"import logging\n",
"logging.getLogger().setLevel(logging.CRITICAL)\n",
"\n",
"docs_scopus, docs_notfound = litstudy.refine_scopus(docs_remaining)\n",
"\n",
"print(len(docs_scopus), 'papers found on Scopus')\n",
"print(len(docs_notfound), 'papers were not found and were discarded')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we plot the number of documents per publication source."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAAGBCAYAAABRiHSlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA0nklEQVR4nO3df3zN9f//8fvZmWE0PxKliOiNd1L5EfGmVn5F45MfzWTeNBv9YPqW+dHeqLcuTfQp9JZQfGTWO5FCTSpZH5VaVtZvKyTlx7uZMyP79fz+4eO88zbOC+e18zrb7frPe1uvc87zebe38/A657zuLmOMEQAAAGwREugFAAAAVGQMWwAAADZi2AIAALARwxYAAICNGLYAAABsxLAFAABgI4YtAOfsvvvu05tvvun9PjU1VVOnTrX9cT/55BP17dtXQ4cOvaD7+fnnn3XXXXeV+d+6dOkiScrOztbs2bPP677T09O936elpZ3yPYDKJzTQCwAQfCZPnqxRo0bp1ltv1fHjx7Vs2TK9/PLL531/JSUlcrvdPo9bt26dHnzwQXXv3v28H8uqa6+9Vtdee+05327v3r3asGGDevfuLUmKiYnx99IABBmGLQDnrFGjRurbt68WLVqkvLw8jRgxQmFhYZowYYJ+/PFHSdLf/vY3XX/99XrnnXf0/PPPq7CwUA0bNtTs2bNVo0YNTZo0SdWqVVN2drb69u2re+65x3v/u3fv1uTJk5Wfn6+rrrpKTzzxhN5++22lp6frww8/1JYtWzRt2jTv8atXr9b777+vgwcPKjc3VyNHjtSQIUO0detWvfzyy3r66aclSbGxsZo+fbqqVq2qwsJCjR07Vjk5OWrfvr0effRRhYT8+2T/H2975MgRTZs2Td9//71CQkI0Y8YMNW3aVPfdd5/y8/NljFFycrLat2+vp59+Wj/88IP69++vuLg47d69W/Xq1VNMTIy2b9+u6dOnq6ioSG3bttXUqVPldrt166236r/+67/0zjvv6KKLLtLzzz+vmjVraubMmdq0aZPCwsLUr18/jRo1qpz+hAH4lQGA83Ds2DHTu3dvM2jQIFNSUmJmzZplNm7caIwx5tdffzV33nmnMcaYvLw8720WLlxoli5daowxZuLEieb//b//Z0pLS0+771GjRpkNGzYYY4yZOXOm+cc//uG9zebNm087ftWqVSYyMtLk5+eb/Px807NnT7Nv3z7z8ccfm/Hjx3uPGzZsmMnJyTF79uwxLVu2NF9//bUpLS01999/v3nrrbeMMcZ07tzZGGNOuW1KSoqZO3euMcaYoqIik5+fbwoLC01+fr53v4MGDTrtdsYYM3fuXLNixQpjjDF9+/Y12dnZxhhjEhMTzZo1a4wxxkRGRprXXnvNGGPMY489Zv75z3+a3NxcExkZaUpKSowxxng8nrP/gQBwLM5sATgv1apVU+/evVWvXj2FhIToww8/VEZGhubNmydJysvLU3FxsX799VclJibqt99+07Fjx9S5c2fvffTq1Usul+u0+/7mm2/Us2dPSVK/fv0svXeqW7duqlmzpiTppptuUnZ2ti666KIzHt+0aVO1atVKktSnTx999tln3pf+/tPHH3+shQsXSpJCQ0NVs2ZNFRYWatasWdq2bZtCQkL0008/nXV9Ho9HpaWlat26tSQpKipKGRkZ6t+/vyTptttukyS1atVKe/bs0UUXXaQaNWrokUceUffu3XXLLbf4zACAMzFsAThvISEh3pfejDFatGiRGjRocMoxM2bM0NixY9WxY0elp6fr/fff9/63atWq+W0tfxzaTn7tdrtVWlrq/XlhYeEZjy9r6DubtWvXqqioSGvWrJHb7dYNN9xwvkuXJIWFhUk6kWlJSYlCQ0O1atUqffDBB1q7dq02btyolJSUC3oMAIHBpxEB+MVNN92kFStWeL//9ttvJUlHjhzRJZdcotLSUr3++uuW7qtVq1Z67733JJ14U3y7du183iYjI0NHjhzRkSNH9NFHH+naa6/VZZddppycHBUXF2vv3r367rvvvMf/+OOP+vbbb2WM0VtvvXXWx7jpppu8HwAoLi72Ps7FF18st9ut9PR0HT16VJJUo0YNFRQUnHYfERERcrvd3lzWr19/1scsKChQfn6+brvtNk2YMEHffPONzwwAOBNntgD4xf33368ZM2YoKipKJSUluummm/S3v/1N9913n+Lj41W7dm21bdtW+fn5Pu8rOTlZkydP1tNPP+19g7wv11xzjeLj471vkD95hu2mm25S37591aJFC1199dXe41u0aKF//OMf2rFjhzp06KAePXqc8b7vu+8+TZs2TVFRUXK73d59jh49WlFRUerYsaPq1avnvd/ff//d+wb5P3r88cc1ZcoUFRUV6YYbblDfvn3P+JgFBQW69957VVRUJJfLpcTERJ8ZAHAmlzHGBHoRAHAhVq9erR9//FEPP/xwoJcCAKfhZUQAAAAbcWYLAADARpzZAgAAsBHDFgAAgI0YtgAAAGzk6Es/HDzo+yPilV3t2uHKyzsa6GU4GhlZQ07WkJM15GQNOVkTDDldcsmZGyscPWwp1O390h3iUklhcQAXAwAAcO4cPWzdM2Oj9+sXk898wUEAAACn8vmeraKiIg0ZMkTt27dXenq6JCkzM1NDhgzR0KFDtXr1aklSaWmpJk+erGHDhmnMmDHKy8uTJD355JOKjY1VbGysOnbsqHfffde+3QAAADiMzzNboaGhmjt3rv75z396fzZz5kw999xzqlOnjoYPH67bbrtNW7duVUREhJYvX653331Xixcv1sMPP6ykpCRJUklJifr06aO//OUv9u0GAADAYXye2XK5XKpfv/4pP/v9999Vr149ud1uNWnSRNu3b9euXbt0zTXXSDrRUfbpp5+ecpuPP/5Y119/vapWrerH5QMAADjbeV36oUaNGvrxxx917NgxZWVlyePxqEWLFtqyZYskacuWLTp8+PApt1m3bt1ZS1cBAAAqovN6g/z06dM1Y8YMhYaGqnnz5rrkkkt04403atu2bYqNjVXbtm3VoEED7/GFhYX67LPP9Pe//91vCwcAAAgG5zVstWzZUi+++KKOHTumcePG6frrr5ckPfjgg5KkN954Q/Xq1fMe//7776tLly4KDXX0hx8BAAD8ztL0k5iYqC+//FLh4eHavn276tatq82bN8vtdisxMVFhYWHKzc1VYmKi3G63mjdvrokTJ3pvv27dOg0fPty2TQAAADiVyxhjAr2IM4l66HXv1y8m95CKSwK4GmcKhqvqBhoZWUNO1pCTNeRkDTlZEww5Be0V5P94IVN3iEuMWgAAINg4etj645ksBi0AABCMzuvSDwAAALCGYQsAAMBGDFsAAAA2sr2I+ssvv9Rdd92lu+++WxMmTFBJCe++AgAAlYfPYetkEfVf//pX789mzpypZ599Vi+99JJWrVqlw4cP65133vEWUQ8ePFiLFy+WJC1ZskRJSUlKTU1VlSpV9Mknn9i3GwAAAIexvYj66quvlsfjkTFGR44cUZ06dWzYBgAAgDPZXkR9yy23aMaMGerTp4+MMWrRooX/Vg8AAOBw5zVs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2GOn/B1FTqcr6/eoVq1ays/P9x6Tn5+v2rVrB2iFzpCenq4vvvhC9913nySe+/5TSUmJVq5cqbvuuuuUnwdrTo5b5XXXXadPP/1UJSUl+uqrr3TllVcGekmOUVxcrAcffFCxsbFq27atJKldu3bavHmzJCkjI0Pt27cP5BID7vvvv9eGDRsUFxen7777Tg8//DAZleG6667Tzp07VVpaqoMHDyosLIycylBaWqpatWopJCRENWvW1NGjR9WhQwdlZGRIIqeylPV7dOWVV2rXrl06evSoDh48KLfbfco/iCqbrVu3asWKFXryySe9wwLPfaf617/+pdzcXN17772aNWuWNm3apHXr1gVtTi7jwHNwaWlpev311xUaGqrHH388aMK025o1azRjxgy1atVKknTzzTdrwIABSkpKUkFBgTp16qTExMQAr9I5YmNjNWfOHEkiozK8+uqrWr16tYqLizVhwgQ1a9aMnP5DSUmJJk2apL179+r48eP661//qh49emjSpEn617/+pWbNmmn69OlB869rOyQmJurLL79UeHi4unbtqlGjRpX5e/Tuu+9q4cKFcrlcmjx5sq677roAr7z8/GdGb7/9tmrUqOF9aXXOnDmqW7dupX/u+8+ckpKSJJ0YTjds2KCpU6dKCs4ZwZHDFgAAQEVRef85BgAAUA4YtgAAAGzEsAUAAGAjhi0AAAAbMWwBAADYiGELgF+0aNFCzz77rPf7SZMmea9H5S+JiYnq16+f3njjjTMek5aW5vgibY/Ho5UrVwZ6GQDKCcMWAL+oWbOmXnvtNR07dsyW+z9w4IB27dqlN954Q/369bPlMcoLwxZQuTBsAfCLatWqqWfPnnr11VdP+2+bN29WVFSU7rjjDktnnebPn6877rhDUVFReu+99yRJY8aM0e7du9W/f3999913pxz/zjvvqFevXho0aJC2b9/u/fn27ds1YMAARUVFadq0aSopKZF0oix50KBB6tevn0aNGiXp1DNxP//8s7cmZN68eZo8ebKGDBmi7t2765NPPtFDDz2kXr16ae7cud7HevXVVzVw4ED169fPe4Zv69atiouL05gxY9SzZ08999xzkqSnn35a33//vfr376/Fixfr448/VlRUlPr3768hQ4ZYCxxA8DAA4AedO3c2+/btMz179jRFRUVm4sSJZvPmzebYsWMmMjLS/PLLL6awsNBER0ebTz/99Iz388UXX5iBAwea48ePm/3795vIyEhz5MgRs2fPHjN48ODTjj95//v27TPHjx83gwYNMnPnzjXGGNO3b1+TnZ1tjDEmMTHRrFmzxhw/ftx0797d5OTkGGOMOXTokDHGeNdrjDnlsebOnWvi4uJMSUmJ2bhxo+nQoYP56aefzPHjx83NN99sjhw5Ynbs2GHGjRtniouLTUlJiRk9erTZvn27+fjjj02nTp1Mbm6uOXr0qOnWrZspKCg4bS+jR482H330kTHGGI/Hc4F/EgCchjNbAPymQYMGateund58803vz3bu3KlmzZrpsssuU5UqVdSnTx9t27btjPexbds29erVS2FhYapfv77+/Oc/Kycn54zHn7z/Bg0aKCwsTD179pR04qW60tJStW7dWpIUFRWlbdu26ccff1Tjxo3VrFkzSbJUiNytWzeFhISoRYsWuvzyy9WoUSOFhYXp8ssv18GDB/XRRx/p888/14ABA3TnnXfqhx9+0O7duyVJbdu2VZ06dVS9enVdccUVOnDgwGn3f8MNN2jWrFlavny5CgsLfa4HQHAJDfQCAFQscXFxeuihh9SyZctye0yXy1Xm1+ciJCRE5v/ay/5z4KlSpYr3vk9+ffI2JSUlMsYoJiZGY8aMOeV2W7duVVhY2GnHh4ae+lfv6NGj1a1bN7333nsaPHiwVq1apTp16pzXPgA4D2e2APhVs2bNdPnll+ujjz6SJDVt2lQ//PCD9u/fr+LiYqWnp6tt27ZnvH3btm31zjvvqKioSAcPHtTXX3+t5s2bn/H4pk2bKicnR/v371dRUZE2btwoSYqIiJDb7da3334rSVq/fr3atWunq666Snv27NEPP/wgScrLy5MkNWzYUN98840ked8nZlWnTp20fv16eTweSdK+fft06NChMx5fo0YNFRQUeL/fs2ePWrVqpfvvv1+XX3659u3bd06PD8DZOLMFwO/i4+MVHR0t6cQb56dNm6b4+HiVlpaqV69eat++vSSpf//+ev3110+5bZs2bXTzzTfrzjvvlMvlUnJysmrUqHHG4aVatWqaMmWKhg8froiIiFMGs8cff1xTpkxRUVGRbrjhBvXt21dut1szZ85UUlKSioqKdNlll+n555/X4MGDde+99yo9PV1dunQ5p/3+6U9/UlxcnIYNGyZjjGrUqKH//u//PuPxderUUYsWLbxviv/ll1+0detWhYSEqG3btuV6VhCA/Vzm5HlzAAAA+B0vIwIAANiIYQsAAMBGDFsAAAA2YtgCAACwEcMWAACAjRi2AAAAbMSwBQAAYKP/DwIMQGQcpJx9AAAAAElFTkSuQmCC\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"litstudy.plot_year_histogram(docs_scopus);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this example, we discover that one document was published in 1997. This document should not be in our set since GPUs were not used for general purpose computing before 2006. We can remove this document by filtering on year of publication."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"docs = docs_scopus.filter_docs(lambda d: d.publication_year >= 2000)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Print how many papers are left"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1386 papers remaining\n"
]
}
],
"source": [
"print(len(docs), 'papers remaining')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## General statistics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"litstudy supports plot many general statistics of the document set as histograms. We show some simple examples below. "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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wcGYDQAAoMILWMb69u2r3/72t/r4449lWZZmzJih2NjYYMwGAABQ4QUsY5JUt25dtW3bVl6vV5J08OBBPpsSAADgKghYxl566SWtXr1a//M//+NfxmdTAgAAXB0By9iGDRu0adOmC86+DwAAgKsj4Lspf/Ob3+jEiRPBmAUAAKDSCbhlrH///urTp4/q1aun0NBQWZYlh8OhFStWBGM+AACACi1gGXv66af117/+VTfccINCQgJuSAMAAMAVCFjGatasqU6dOgVjFgAAgEonYBlr1KiRhg0bprZt26pKlSr+5f369StV4OTJk/XFF1/I5/PpiSeeUPPmzTV27FgdP35csbGxmjBhAlvgAABApRGw9dStW1fNmjVTdna2Tpw44f9XGocOHdLXX3+tFStWKDk5WbNmzdKqVavUpEkTLVu2TCEhIdq2bVup1g0AAFAeBdwy9uijj161sFq1aik8PFzFxcXKzc1VzZo1tWPHDn9G+/bttX37drVr1+6qZQIAAJRlActYv379LvnB4KV5N2XVqlVVt25dde3aVT/88INmz56tWbNmye12S5LcbrdycnKueL0AAADlVcAy9re//c3/dWFhof7xj3+UujB9+OGHys7O1ubNm3Xy5Ek99NBDql+/vnJzcxUTEyOPx6OoqKjLXl90dGSp5gDKo9z8QtszQkIccl/ieUU22WSTXdGyy5KAZaxevXoXXB4yZIj69OmjJ5544orDfD6foqKiFBISomrVqik/P1+33HKL0tPTdf311ys9PV133HHHZa8vOzv/imcAyi2X0/YIn8+69POKbLLJJruiZQdZTEz1Eq8LWMY++OAD/9c+n0979uy55G7Ly3H77bcrJSVFAwYMUEFBgUaMGKHOnTtr7NixGjhwoK6//nq1bdu2VOsGAAAojy7rsynPCwkJUd26dfXyyy+XKszpdGr69OkXLU9OTi7V+gAAAMq7gGVs2rRpwZgDAACgUgp4nrFhw4YpNzfXfzknJ0cPPfSQrUMBAABUFgHL2PHjx/2nnpCkqKgoff/997YOBQAAUFkELGNVqlTRwYMH/ZcPHDgglyvg3k0AAABchoCtKikpScOHD1eDBg1kWZaOHDmi559/PhizAQAAVHgBy1iLFi20fv16/9axRo0aXfCB4QAAACi9gGXMsixt2rRJGRkZkqT4+HjdfffdpT7XGAAA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PFq6dKmSkpIUFRWlZ599VsuXL7c1e+rUqXK5XGrcuLE++ugjRUZGqri4WE2aNNHvf/97W7MnTZokh8Oh9u3by+12y+PxaOvWrSoqKtKkSZNszS7J4MGDbX+svfrqq0pLS1OVKlV07bXXauLEiQoNDfU//u2UlJQkSfL5fMrJyVHDhg1VrVo1HT161Pbn90MPPXTRsszMTDVt2lRz5861Nfv8ffv6668rPT1dnTp10o4dO1SvXj098cQTQcmeOHGioqOj1aZNG2VlZemzzz7TnDlzbM1u166drrnmGoWGhuqee+7RXXfdpejoaFszz3vooYfUrFkzeTwe7dy5Uz179lR0dLRWrFhh++N8/vz5ysrKUuPGjfXpp5/ql7/8pfLy8tSrVy917NjR1mxe14L/uiZVwC1j5+3YsUNLly6V9OMTetCgQbZnnt/ydurUKf3ud7+TJNWpU0evv/667dl16tRRcnKy8vLylJaWpunTp+vkyZPq2rXrJX+JXE1er1f33nuvJOmtt95S27ZtJSkoWyq++uor//3bs2dP/5P2gQcesL2M7du3T2+++eYFy9q0aaPExERbcyWpZcuWl9xa8O2339qenZaWphUrVkiSUlNTNWzYMM2cOVPB+Lvum2++0dKlS2VZlrp16+YvQcG4z2vVqqXTp09r2LBhiomJkWVZSkpK0vjx423PPm/z5s1avHixQkNDlZCQoISEBNszzz+PDx486H+uxcXF6b333rM9u379+nrjjTd0+PBhpaSkKDExUfXq1VP37t3Vo0cPW7Pz8vI0YsQIST++tgwYMECS/I99O23btk1vvPGGJGno0KEaPny4FixYoMGDB9texnhdC/7rmlQBy9ihQ4c0ZcoUff/99yoqKlKVKlUkSefOnbM9++6779aECRN03XXXKSkpSbfffrt2794dtF1mklS1alX16tVLvXr10unTp7Vx40bbM0NDQ/XKK6/o7Nmzqlq1qpYvX64aNWrYvltY+vEXxZYtW/TrX/9aH374oX8zvs/nsz07JiZGixYtUvv27RUVFaXc3Fxt3brVv5vc7ux33nlHYWFhFyx/8MEHbc/+zxenrl27KiYmRsOHD5fH47E9+zyHw6H+/fsHLU+SpkyZooMHD2ru3LmqVauWhg4dqvDwcNWrV8/27GPHjmnx4sU6c+aM/zXN4XAE5RfFLbfcovnz5+vXv/61Zs+erdtvv11ZWVmqXbu27dnnNWjQQI8++qgeffRR7d69Wxs2bLC9jFmWpb///e/Kzc2V1+vVtm3bFB0dreLiYltzzzu/eywjI0OhoaEKCQnhdc1Gpl/XKtxuys8++8z/ddOmTRUREaGzZ89qw4YN6tevn+35X331lTZv3qzjx48rKipKt9xyi9q0aSOHw2Fr7vr163XPPffYmlESj8ej1NRUNWrUSDfccIMWLlwon8+nQYMG2X6sx8mTJzV37lwdPnxYN954o4YNGya3262PPvpIrVu3tjW7oKBA77zzjj7//HPl5OQoKipK8fHx6tOnj8LDw23N3rZtm5o3by63233B8qysLDVp0sTW7NmzZ6tnz56qX7++f9m+ffs0depUvfbaa7Zmr1q1Svfee+8FW10LCwv1yiuvaNSoUbZm/6esrCzNnTtXR44c0bp162zPW7Nmjf/rzp07q1q1ajp79qwWLVqkxx57zPb8LVu2aNOmTf7XtZYtW6p3794X/dK82l577TU98MADtmaU5Ntvv9Xbb7+tG264QXFxcZo+fbokafjw4bb/gX3gwAFNnz5d3333nRo1aqS//OUvuuaaa7Ru3Tr/Xgi78LoW/Nc1qQKWsfMKCwv9D6TQ0FCyyQYAoEyqcKe2yMrK0oABA5SYmKixY8cqMTFRAwcOVGZmpu3ZmZmZ/uykpCR/9q5du2zPLunnDkb2f/7cJrODfZ+X5PxB5mSTTTbZ5S37u+++0/jx4zVp0iQdOnTIv/y5554LavbBgwcrTbZUAY8Zmzp1qmbOnHnB7rETJ07oscces/2dfX/961+NZVfWn9tk9uLFiy9aZlmWdu7caWsu2WSTTbZdnn76aQ0ePFhVqlTRuHHj9MADD+jOO+9UVlZWULPHjx9fabKlCljGLMu6aH9z9erVg3KgK9mVK3vevHkaO3bsRVnnD7Amm2yyyS5v2cXFxWrTpo0k6eabb9bo0aP1/fff237cc2XOlipgGRs+fLgGDBighg0byu12Kzc3V4cOHdLIkSPJJvuqio+PV+vWrS96V9nu3bvJJptssstlts/nU25urtxut8LCwjRz5kxNnDhR//znP8m2UYU8gN/n8+nQoUPKycmR2+3WddddF5TTLJBd+bIBoCL55ptvFBUVpaioqAuW79ixQ/Hx8WTbpMJtGZN+PDnhjh07/O+uk6Trr7+ebLKvuq+//vqC7Pj4eLLJJpvscptdv359ff3110pNTb0gOxiFpLJmSxVwy9js2bOVmZl5wUc5pKenq3HjxrbvuiKbbLLJJptsssm+YlYFM2DAgCtaTjbZZJNNNtlkk20q27Isq8KdZywyMlKbNm1SYWGhpB9PBpqWlqbIyEiyySabbLLJJpvsMpUtVcDdlGfOnNGCBQuUkZGh/Px8RUZGKi4uTkOGDFGNGjXIJptssskmm2yyy0y2pIq3m9Lj8VivvPKKNX/+fOvMmTP+5a+++irZZJNNNtlkk012mcq2rAq4m/LJJ59UjRo1VLNmTQ0ZMsR/jpAtW7aQTTbZZJNNNtlkl6lsqQKe2iIvL0/9+vWTJHXs2FF/+tOflJiYSDbZZJNNNtlkk13msqUK+EHhRUVFKigokCTVqFFD8+bN06pVq7R3716yySabbLLJJpvsMpUtqeIdM7Zz507r+PHjFywrLi621q5dSzbZZJNNNtlkk12msi3LsircuykBAADKkwq3mxIAAKA8oYwBAAAYRBkDAAAwiDIGAABgEGUMAADAoP8H/pNy7p73zDwAAAAASUVORK5CYII=\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"litstudy.plot_continent_histogram(docs);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Network analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The network below shows an example of a co-citation network. \n",
"This is a type of network where nodes represent documents and edges represent pairs of documents that have been cited together simulatenously by other papers. The strength of the edges indicates how often two documents have been cited together.\n",
"Two papers with a high co-citation strength (i.e., stronger edge) are usually highly related. "
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1000/1000 [00:00<00:00, 1752.38it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"BarnesHut Approximation took 0.14 seconds\n",
"Repulsion forces took 0.32 seconds\n",
"Gravitational forces took 0.01 seconds\n",
"Attraction forces took 0.01 seconds\n",
"AdjustSpeedAndApplyForces step took 0.04 seconds\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"litstudy.plot_cocitation_network(docs, max_edges=500)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Topic modeling"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"litstudy supports automatic topic discovery based on the words used in documents abstracts. We show an example below. First, we need to build a corpus from the document set. Note that `build_corpus` supports many arguments to tweak the preprocessing stage of building the corpus. In this example, we pass `ngram_threshold=0.85`. This argument adds commonly used n-grams (i.e., frequent consecutive words) to the corpus. For instance, `artificial` and `intelligence` is a bigram, so a token `artificial_intelligence` is added to the corpus."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"corpus = litstudy.build_corpus(docs, ngram_threshold=0.8)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can compute a word distribution using `litstudy.compute_word_distribution` which shows how often each word occurs across all documents. In this example, we focus only on n-grams by selecting tokens that contain a `_`. We see that words such as `artificial intelligence` and `trade offs` indeed have been recognized as common bigrams."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(20, 3))\n",
"litstudy.plot_word_distribution(corpus, limit=50, title=\"Top words\", vertical=True, label_rotation=45);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This word distribution looks normal. Next, we train an NMF topic model. Topic modeling is a technique from natural language processing for discovering abstract \"topics\" in a set of document. We need to manually select the number of desired topics. Here we choose 15 topics. It is recommended to experiment with more or less topics to obtain topics that are more fine-grained or more coarse-grained"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"num_topics = 15\n",
"topic_model = litstudy.train_nmf_model(corpus, num_topics, max_iter=250)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To understand the result of NMF, we can print the top 3 words for each topic."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Topic 1: ['cluster', 'mpi', 'node', 'hybrid', 'communication']\n",
"Topic 2: ['mapreduce', 'big', 'data', 'hadoop', 'cloud']\n",
"Topic 3: ['simulation', 'particle', 'numerical', 'fluid', 'flow']\n",
"Topic 4: ['learning', 'network', 'deep', 'deep_learning', 'training']\n",
"Topic 5: ['fpga', 'memory', 'access', 'cache', 'bandwidth']\n",
"Topic 6: ['openacc', 'compiler', 'openmp', 'directive', 'language']\n",
"Topic 7: ['image', 'segmentation', 'algorithm', 'medical', 'sensing']\n",
"Topic 8: ['sequence', 'alignment', 'protein', 'database', 'search']\n",
"Topic 9: ['video', 'decoding', 'encoding', 'ldpc', 'motion']\n",
"Topic 10: ['gpgpu', 'cuda', 'code', 'general_purpose', 'general']\n",
"Topic 11: ['energy', 'heterogeneous', 'power', 'consumption', 'systems']\n",
"Topic 12: ['graph', 'vertex', 'framework', 'analytics', 'edge']\n",
"Topic 13: ['scheduling', 'task', 'heterogeneous', 'resources', 'execution']\n",
"Topic 14: ['intel', 'matrix', 'phi', 'xeon', 'cloud']\n",
"Topic 15: ['opencl', 'portability', 'benchmark', 'platforms', 'sycl']\n"
]
}
],
"source": [
"for i in range(num_topics):\n",
" print(f'Topic {i+1}:', topic_model.best_tokens_for_topic(i))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An alternative way to visualize the output of NMF is to plot each discovered topic as a word cloud. The size of each word in a cloud indicate the importance of that word for that topic."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1MAAAEkCAYAAADKAGvMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOy9d4AdZ3n2/Zt+etteterNsmTJvWPjBhhMCaGHhJCQvEBCeuENIfVLQhoEAiQhEEIJvHRsMDbuvciS1btWWm0vp7cpz/fHMzO7q2ILg0vgXInw7p5z5kx5yl2u+7oVIYSghRZaaKGFFlpooYUWWmihhR8J6ot9Ai200EILLbTQQgsttNBCC/8b0XKmWmihhRZaaKGFFlpooYUWngNazlQLLbTQQgsttNBCCy200MJzQMuZaqGFFlpooYUWWmihhRZaeA5oOVMttNBCCy200EILLbTQQgvPAS1nqoUWWmihhRZaaKGFFlpo4TlAf7FP4MXE6173OlzXZXp6Gl3XyWQyZLNZPvvZz571Md797nfz8Y9/HNM0n/W9n/rUp/jSl76Ebds8+OCDP8aZt/CzihdyzHqex6//+q9z9OhRNE3jTW96E29/+9t/zCto4WcNL/Q6+0d/9Efs2rUL13XZsmULH/rQh1DVVtywhbPHCz1mA7z//e9nfHycr3zlK8/hrFv4WcYLPWbf/va3Mz09Hb73W9/61nM99Z8KKK0+U/Cxj32M9vZ23vzmNz+v37Njxw46Ozt53ete13KmWvix8EKMWc/zePjhh7nsssuoVqu8/vWv59Of/jQDAwPP23e28NOLF2qdLZfLJBIJhBD8xm/8Bq95zWu49tprn9fvbOGnEy/UmAV48MEH+epXv8ro6GjLmWrhOeOFGrNvf/vb+dM//VOWL1/+vH7P/xa0wnUn4d577+Xmm2/mVa96FR/72MfCv1966aX8yZ/8Ca94xSt473vfS61WA+Caa66h0WgA8JWvfIWbb76ZV7/61Xz0ox895dgbNmygq6vrhbmQFn5m8HyNWVVVueyyywCIxWIMDQ0xNTX1Al1VCz/NeD7X2UQiAYDrujSbTRRFeQGuqIWfdjyfY9a2bT75yU/ya7/2ay/MxbTwM4Hnc8y2sBgtZ2oB6vU6H/7wh/n0pz/NN77xDR588EGeeOIJAGZmZrjqqqu47bbb6O3t5Ytf/OKiz+7du5cvfOELfOlLX+Lb3/4273jHO16MS2jhZwwv1JidmJhg3759rFmz5nm9nhZ++vFCjNnf/u3f5rLLLiMej3P11Vc/35fUwk85nu8x+5//+Z+89rWvJR6PvyDX08JPP16IdfYDH/gAr33ta/nCF77wvF/PSx0tZ2oBjhw5wvLly+np6cEwDF7xilewdetWAKLRaEgVedWrXsWTTz656LOPPfYYr3zlK8OoaCaTeUHPvYWfTbwQY7bZbPKBD3yA3/3d3yUWiz1/F9PCzwReiDH793//99x///2oqsrDDz/8/F1MCz8TeD7H7MTEBA8++CCvfe1rn/8LaeFnBs/3OvuRj3yEb3/723z2s5/l29/+No8++ujze0EvcbScqeeIFnWkhf9teK5j9oMf/CAXXXQRN91000/4jFpo4Znx46yzpmly3XXXceedd/4Ez6iFFp4ZP+qY3bNnD4cOHeLaa6/lLW95C7t37+Y973nP83R2LbRwKp7LOhuUrKTTaW644QZ27tz5kz6t/1VoOVMLsHTpUg4dOsTExASO4/D973+fzZs3A1Cr1bj77rsB+N73vseWLVsWffbiiy/m1ltvpVwuA5DP51/Qc2/hZxPP95j9xCc+gW3bvP/9739+L6SFnxk8n2NWCMGxY8cAKaBy9913s2zZsuf5ilr4acfzOWavvvpqHnjgAe666y6++MUvsm7dOj75yU8+/xfVwk81ns8x6zgOs7OzgGSu3H///axYseJ5vqKXNn6mpdFPRiQS4UMf+hDvfve78TyPG264gfPPPx+AtrY27r77bj7ykY8wNDR0inG5atUq3va2t/GmN70JVVW57rrreN/73rfoPZ/4xCf48pe/zOzsLFdeeSW/+qu/ylvf+tYX7Ppa+OnD8zlmy+UyH/3oR1m6dCm33HILAL//+7/PpZde+oJdXws/fXg+x6wQgt/7vd+jUqkghGDLli286U1vekGvr4WfPjzftkELLfyk8XyO2WazyS//8i9j2zZCCG688UauuuqqF/T6XmpoSaOfJS677LKWnHkL/6vQGrMt/G9Da8y28L8NrTHbwv82tMbsTx4tml8LLbTQQgsttNBCCy200MJzQCsz1UILLbTQQgsttNBCCy208BzQyky10EILLbTQQgsttNBCCy08B7ScqRZaaKGFFlpooYUWWmihheeAljPVQgsttNBC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d+V6uvj3jwu5Zv/gD/6A66+/nsOHD/PmN7/5u3ZNXfz7xoVas3fddRfbt29naGjou3o9Xfz7x4XcZ3//938/TsJ+EAlvP/DJ1LFjx1i/fj2Dg4MYhsFtt93GE088AUAikeBVr3oVALfffjuPP/74qt999NFHee1rXxtXP/P5/Pf1vXfxg4kLuWbDMOTXf/3Xeetb38rg4OC//mK6+IHAhVyz/+k//SceeOABtm/fzpe+9KV//cV08QOBC7Fmm80mf/d3f8d73/ve796FdPEDgwu1z37gAx/grrvu4pOf/CQHDhzgs5/97Hflev4t4Qc+mXox6FJEuvi3hu/2mv3TP/1TTNPkPe95z3f1dbvoIsL3Yp9VFIXbb7+de+6557v+2l108d1as6dOneLkyZPcdttt3HzzzSwuLvKGN7zhu/LaXXSxEt/Nfbavrw9FUbBtmzvvvJM9e/Z811773wp+4JOptWvXcuTIEWZmZvA8j7vvvpudO3cC0Gq1uO+++wD48pe/zK5du1b97tVXX82XvvQl6vU6AOVy+fv63rv4wcSFWrOf+9znePTRR/lv/+2/fXcupIsfGFyoNXv8+PH43/feey/r1q37111IFz8wuBBrdvPmzTz00EPce++93HvvvRSLRT7zmc989y6qi3/XuFD77OzsLABBEHDfffexYcOG78LV/NvCD3wyZds2v/3bv8173/teXv/613PNNdfEsyClUon77ruP1772tZw8efIspZRNmzbxzne+k7e97W3ceeed/P3f//1Zr/8Xf/EX3HDDDSwuLnLDDTfw8Y9/HIBPf/rT3HDDDUxPT3PrrbfyR3/0R9/7i+3i3wUu1Jr9vd/7PWZmZnjzm9/M6173uh/IVn4XLw0Xas3+0R/9Ebfffjt33HEHR48e5ed+7ue+9xfbxb8LXKg120UXLxUXas3+yq/8SixckUgkeMtb3vK9v9iXGX5gpdHPB9ddd11XlrSLf1Portku/q2hu2a7+LeG7prt4t8aumv2e4sf+M5UF1100UUXXXTRRRdddNHFS0G3M9VFF1100UUXXXTRRRdddPES0O1MddFFF1100UUXXXTRRRddvAR0k6kuuuiiiy666KKLLrrooouXgG4y1UUXXXTRRRdddNFFF1108RLQTaa66KKLLrrooosuuuiiiy5eAvQX88O1jsfJpRaqNE7uz1h4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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(15, 5))\n",
"litstudy.plot_topic_clouds(topic_model, ncols=5);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These 15 topics look promising. For example, there is one topic on graphs, one on OpenACC (the open accelerators programming standard), one on OpenCL (the open compute language), one on FPGAs (field-programmable gate array), etc. \n",
"\n",
"We can visualize the results as a \"landscape\" plot. This is a visual appealing way to place documents on 2D plane. The documents are placed such that similar documents are located closed to each other. However, this is a non-linear embedding so the distances between the documents are not linear."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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5jOf4iMf+RgdHR389Kc/YfPmzbzyyjZKSkrYuLGO733v+3zsYx9l5cq3xGVizJs3l5Ur38Lq1f9Jf38/BQWJowh/9KMf84MffJ9IJMqePXt48smnAFix4joA1q79G+9+97v53OdupaWlhby82Fjrm29+N0899RTPPLOBadOmceedd/C+932Aj3/849x772959tln+djHPprx/V117TU0NO/nC9+7k/y8PB797f+j8eXtlLg8zJ05i+s+cAtnnXoqd3z28zz5XB03r3oruTk5XHrDKsrcHkoKiyisrGDZRUu5+uZ3YVkW9//wLs45/Uya6+sJRKPk2B30Duud0x0OcfMXP4fP7yc/L4+H77s/LmiT73AyEI3gPfz49v/6HN/9+d088+xGvvuZWBZTxDLpM8MsqKzgrR98P6cvOIXbP3srdZs24TLsnDZnLh/84IeYW13NPffczSc/+Wl+/OO7+PWvf8ns2bPx+/28/e1v42Mf+wShUIhPf/pTXHbZpbz22r+oqanmttu+xoEDB/j1r3/JrFmz+MUvfsXy5ct573vfl/EznTdvHnfccSe7d+/mW9+6ncsuu5Qnn3yKkpISnnnmGX7wgx9y5ZVXMG3aNN797vcwd+5cvvnNr/POd97Er371a6qrq7nnnp8DcNttX+Hee+/j9ddf57TTTuOjH/0ot976+bjXKy0t5cknn+Kuu37Cd77zbc4991w2b96c8TxFRERETjYK2oiITDFVVVU0NDTS2toKwOOPP85ZZ53FK69sY2BggGeffRaAxx5bz003vSsuaHPOOeewfv3j9Pf3A9DT05Nw/Le+dRUf+9gn2Lt3L5/73H+xYsV1rF37t7iyrG3btnHrrZ/ln/98jCeeeBKA888/jwsvvIBbbnkvAIWFRdjtdhYsmB93TqecsiDt+7twyRLmz5nDO94cCxLl5eZRWT4NmwGPP/sMpmnyymuvUTVjBgCXnL+En/72PiCWMWMEgryp9iIWnnkm63//x8PHyGVO1Wx69u0nZAboT9Lb58PvvIlrLrscgNkzZlJRVja0zxcOxgV5Fp5yCo8+8zTFDjePPfY4c09ZQEOgl4AZ5eFnnmYgEmbra68ye8Z0opaFy2bjpS0vYoYj7NlTTygUYvv27QDs3buXiooKqqpmM2/ePH7+87sBcLvdHDx4kNde+xeNjY3s378fgD179lBZ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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(20, 20))\n",
"litstudy.plot_embedding(corpus, topic_model);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Advanced topic modeling"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can combine the results of topic modeling with the plotting of statistics. Here we show we a simple example.\n",
"\n",
"One of the topics appears to be on \"deep_learning\". First, we find the topic id for the topic that most strongly belongs to \"deep_learning\". "
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"topic_id = topic_model.best_topic_for_token('deep_learning')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's print the top 10 papers that most stongly belong to this topic to check the results. We see that these are indeed documents on the topic of deep learning."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"High performance networked computing in media, services and information management\n",
"What do Programmers Discuss about Deep Learning Frameworks\n",
"Sparse evolutionary deep learning with over one million artificial neurons on commodity hardware\n",
"Deep learning for intelligent traffic sensing and prediction: recent advances and future challenges\n",
"SOLAR: Services-oriented learning architectures: Deep learning as a service\n",
"Reveal training performance mystery between TensorFlow and PyTorch in the single GPU environment\n",
"Network Management 2030: Operations and Control of Network 2030 Services\n",
"SOLAR: Services-Oriented Deep Learning Architectures-Deep Learning as a Service\n",
"DLPlib: A Library for Deep Learning Processor\n",
"Machine Learning and Deep Learning frameworks and libraries for large-scale data mining: a survey\n"
]
}
],
"source": [
"for doc_id in topic_model.best_documents_for_topic(topic_id, limit=10):\n",
" print(docs[int(doc_id)].title)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we annotate the document set with a \"dl_topic\" tag for document that strongly belong to this topic (i.e., weight above a certain threshold).\n",
"\n",
"After this, we define two groups: documents that have the tag \"dl_topic\" and documents that do not have this tag. Now we can, for instance, print the publications over the years to see if interest in deep learning has increased or decreased over the years."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAAGBCAYAAABRiHSlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABKqUlEQVR4nO3df1zV9d3/8cfhgHDIDkgZRZaakrrKbUCX5CpgleYc6oKmNPHKFGyJEWuRFsPal67pldea6ZyWDkYCXf2wWlSWXTnoMnMw2HL9MipbVi6WwDke6MCBz/cPrk6Z4jkhx/NBn/fbbbfb+fF+fz6v9+ucyav3+30+H4thGAYiIiIiEhAhwQ5ARERE5ESmYktEREQkgFRsiYiIiASQii0RERGRAFKxJSIiIhJAKrZEREREAkjFloh8YzfddBPPPvus93lFRQXFxcUBP++f//xnpk+fznXXXXdMx9m3bx8//vGPj/je9773PQB2797NqlWr+nXsrVu3ep9XVVUd8lxETj6hwQ5ARAafZcuWsXDhQr7//e/jdrspLy/n4Ycf7vfxuru7sVqtPttVV1dTUFDAlVde2e9z+euiiy7ioosu+sb9PvroI55//nmuvvpqALKysgY6NBEZZFRsicg3ds455zB9+nQefPBBWltbuf766xkyZAi33XYb7733HgC/+MUv+M53vsOLL77Ihg0b6OzsJC4ujlWrVnHKKaewdOlSIiIi2L17N9OnT+eGG27wHv+DDz5g2bJlOJ1OzjvvPH71q1/xwgsvsHXrVl555RV27NjB8uXLve23bNnCn/70J5qbmzlw4ADz589nzpw57Nq1i4cffpj77rsPgOzsbO666y7Cw8Pp7OxkyZIlNDU1kZSUxN13301IyJeT/V/te/DgQZYvX86ePXsICQmhpKSE0aNHc9NNN+F0OjEMg6KiIpKSkrjvvvt49913mTlzJgsWLOCDDz7g9NNPJysri9dee4277rqLrq4uEhISKC4uxmq18v3vf59Zs2bx4osvcuqpp7JhwwaGDh3KypUr2b59O0OGDGHGjBksXLjwOH3CIjKgDBGRfujo6DCuvvpqIzMz0+ju7jbuvfdeY9u2bYZhGMYnn3xi/OhHPzIMwzBaW1u9fR544AGjrKzMMAzDuP32242f/exnRk9Pz2HHXrhwofH8888bhmEYK1euNH772996+9TU1BzW/vHHHzfS0tIMp9NpOJ1OY8qUKcb+/fuNV1991bjlllu87ebOnWs0NTUZH374oTF+/HjjjTfeMHp6eozFixcbzz33nGEYhjF58mTDMIxD+q5YscK4//77DcMwjK6uLsPpdBqdnZ2G0+n0jjczM/OwfoZhGPfff79RWVlpGIZhTJ8+3di9e7dhGIaRn59vPPnkk4ZhGEZaWprxxBNPGIZhGL/85S+N//7v/zYOHDhgpKWlGd3d3YZhGIbD4Tj6ByIipqWZLRHpl4iICK6++mpOP/10QkJCeOWVV6itrWXNmjUAtLa24vF4+OSTT8jPz+ezzz6jo6ODyZMne48xdepULBbLYcd+8803mTJlCgAzZszwa+/U5ZdfztChQwG45JJL2L17N6eeemqf7UePHs2ECRMA+MEPfsBf/vIX79Lf17366qs88MADAISGhjJ06FA6Ozu59957aWhoICQkhH/84x9Hjc/hcNDT08OFF14IQHp6OrW1tcycOROAK664AoAJEybw4Ycfcuqpp3LKKadw5513cuWVV5KamuozByJiTiq2RKTfQkJCvEtvhmHw4IMPEhsbe0ibkpISlixZwqRJk9i6dSt/+tOfvO9FREQMWCxfLdq+eGy1Wunp6fG+3tnZ2Wf7IxV9R/P000/T1dXFk08+idVq5bvf/W5/QwdgyJAhQG9Ou7u7CQ0N5fHHH+fll1/m6aefZtu2baxYseKYziEiwaFfI4rIgLjkkkuorKz0Pn/rrbcAOHjwIMOHD6enp4ennnrKr2NNmDCBl156CejdFJ+YmOizT21tLQcPHuTgwYPs3LmTiy66iLPOOoumpiY8Hg8fffQRb7/9trf9e++9x1tvvYVhGDz33HNHPccll1zi/QGAx+Pxnue0007DarWydetW2tvbATjllFNwuVyHHcNut2O1Wr15eeaZZ456TpfLhdPp5IorruC2227jzTff9JkDETEnzWyJyIBYvHgxJSUlpKen093dzSWXXMIvfvELbrrpJnJycoiOjiYhIQGn0+nzWEVFRSxbtoz77rvPu0HelwsuuICcnBzvBvkvZtguueQSpk+fzrhx44iPj/e2HzduHL/97W955513uPjii7nqqqv6PPZNN93E8uXLSU9Px2q1ese5aNEi0tPTmTRpEqeffrr3uJ9//rl3g/xX3XPPPdxxxx10dXXx3e9+l+nTp/d5TpfLxU9/+lO6urqwWCzk5+f7zIGImJPFMAwj2EGIiByLLVu28N577/Hzn/882KGIiBxGy4giIiIiAaSZLREREZEA0syWiIiISACp2BIREREJIBVbIiIiIgFk6ks/NDf7/on4yS46OpLW1vZgh2FqypF/lCf/KE/+UZ78ozz5ZzDkafjwvu9YYepiK2qI2/u4xxKK020NYjQiIiIi35ypi619axd5H4/I2wCo2BIREZHBRXu2RERERALI1DNbIiIiZudyOenoONivvq2tIXg8Pb4bnuTMliebbSinnNL3Hq2vU7ElIiJyDDo6DnLaaWdisVi+cV+rNYTubvMUEWZlpjwZhsFnn+3/RsWWz2XExsZGZs+ezdy5c8nNzcXhcHDgwAEWLlxIVlYWa9as8bbdvn07s2fPZs6cObz22msA7Nq1i8suu4zs7Gyys7Npbm7ux9BERETMqz+FlgxO/fmsfc5sxcXFUVZWhs1mo6qqioqKChwOBxkZGUybNo3c3FyampoYPXo0q1evZvPmzbhcLm655RaqqqoAuOqqqyguLv7mIxIREREZ5HzObMXGxmKz2QAICwvDarXS0NBAWloaAKmpqdTV1bF3715GjRrF0KFDiY2NxePx4Hb3XrrhT3/6E1lZWdx3333oVowiInKisg4JhVCr3//rtliO+Lp1iP+7fLKzfzzg49i0aQPbt7844Md95523eeSRqgE/7ld98snHFBbectQYdu/+m9/He/bZp6msfOiYYvL702xpaaGyspKNGzfy9NNPExERAYDdbmffvn20tbVht9u97e12O62trVx44YVs3bqV0NBQ7rzzTp599lmmT59+TEGLiIiYUXePwQ0l2475OL8vumoAogme7u5urNbDL9cUHz+O+PhxAT2HL++8s4fW1lYuuujbAxKHP/wqtjo6OsjPz6eoqIiYmBhsNhtut5vw8HCcTidRUVFERUXhdH55xXen00l0dDTh4eHe166++mr+/Oc/q9gSERHpp56eHkpKlvPpp/9k3LgJ3tf37/+EVat+RWdnJ3Z7FL/4xS8JDw/nt79dzZtvvk53dzdLlhTwrW9dyNy5PyYhIZF33tnDhAnf4uabb+3zfP/93xXU1Gynu7ubefNu4Hvfu4yHH97MK6/8LwcPOpk5M4OZM6/h2Wef5tVXX6Gz082ll17Oww9XMmlSMq+//ncmTLiA/PxbaWio509/+h9+9rPbmTv3x4e973IdpLj4Drq7PYwePYaPPvqQ//zP3xwSz+zZs0hISKKjo4Mbb8w7bMxfdaQ4H320CpfLxSuvvMyKFb/m1Vd3sGXLo/T09DB9+gzS02fx/vvv8R//cTdRUVFERNj41rcuPKbPzOcyosfjoaCggOzsbBISEgBITEykpqYGgNraWpKSkhg5ciR79+6lvb2d5uZmrFartxj7wp///GdGjRp1TAGLiIiczF5+uYZTTz2VtWsf4NJLL/e+vm7d/dx44xLuv3893/nOd3nuuWp27txBT083a9c+wH/8xyp+97veH7V9/nkHP/zhTH73u0188snHvP32W0c81/vvv8fu3X9j3bqN3H//en7/+wcAmDkzg/vvX8+GDWU8+mgVPT29vxTs6upkxYpf88MfzsLt/pyZMzNYv/73NDTU43IdenmMI73/xz8+yaRJyfzmN+s4//wjz4A1NzezYMGN3HXXPUcc81cdKc5rr81i1qxM1q59gJ6ebp588nHWrNnAunUbee65alyug2zYsJZbb13KqlX3ExkZ2b8P6it8zmxVV1dTX1+Py+WivLyclJQUcnJyKCwspLS0lOTkZOLj4wHIy8tj/vz5WCwWli1bBsAzzzzDI488QkREBOeeey633HLLMQctIiJysvrwww+44IKLAA6Zcdm79z1+85t7Aejs7GTy5Etpb3exa9ervP12LgDt7b33FwwNDeX888cDMH78t9i37x+MGzf+sHO9//577NnzNnl5vf07Otppb3fx0ksv8txz1VgsFv71r2acTgeANy6A8PAIzj13JNC7//urky99vb9v3z+YOvUH3rEdad/YWWedxemnn97nmL/qf/7nhSPG+YWPPtrHvn0fkp//UwCcTgfNzc188snHjB8/4f/iuID29o7D4vgmfBZbs2bNYtasWYe9vnHjxsNeu+KKK7jiiisOeW3OnDnMmTOn/xGKiIiI1znnnEtjYwNTpkzjzTdf975+7rmjyM39KeeeOwqArq4u6up2cemll3PjjXne16B31eqdd/YQH38+b731JpMmTT7iuUaOHMUFF1zE8uUl3v5hYWE89FApmzc/imEYXHddBl/89i0k5Ms9VF+/QsLXfyB3pPfPPvsc3nrrTSZO/M4hY/uqkJAvF+WONOZ//evLS0wdKc7Q0DC6u7sBiIs7m5EjR3PffWsJCQnB4/EQGhrKmWeexZ49b3H++eN5443XGTXqvCPG4i9d1FRERGSAWEMsA7K53RpiobuP9y69NIXt2/+HvLzcQ2aS8vJu4de//k8+/7x3Fubf/30Bkydfyt/+1kheXi4Wi4UJEy7gpptuJiLCxnPPPc2vf/0648ZN8M7ifN2YMWOZMOECFi/OISQkhNjYMykqupt/+7dL+OlPF3DeeWM49VT/L+7py4wZP6K4eCk7drzMOeecS2ho2FHbH2nMcXFne98/UpwXXTSRJ554hLfffoM77ljOjBmzWLJkESEhIQwZEs699/6GRYsW86tf/RK7PZqoqKhjHpfFMPG1GN67J8P7eETeBto6w4/S+uQUHR1Ja2t7sMMwNeXIP8qTf5Qn/5xMefrXvz7h9NPP6lffYF0ZPTv7xzz00CPH/by+GIZBd3c3oaGhPPdcNe+//x433XSzqa4gD0f+zIcP77voNPXM1oi8Dd7HPRZThyoiIiLHqLu7m5tvvhGLxUJISIh3+XKwM3UFo5ksERGRgWfGWS3o3bi/bt3he8IHO5+XfhARERGR/jP1zFbUEHe/+vVYQnG6v/lVZUVEREQGmqmLrX1rF/WrX+9eLxVbIiIiEnymLrZEREQGk1PDuwkxPN+ghwWsh18UQCs0JxYVWyIiIgMkxPD0e1Xmq77pCs2WLY9yzTXXArBp0wbOO28MaWlXHnMcMjC0QV5ERGSQe+KJR4/5GF/c31AGns+ZrcbGRlasWEFYWBiRkZGsWrUKj8dDYWEhLpeLyZMns2TJEgC2b9/O+vXrsVgs3HHHHUycOBGARx99lGeeeYbu7m5uvPFGvve97wV2VCIiIieonp4eVq4sYd++D7FYLCQnT+aTTz4mLy+Xyy9PA3pvVv3cc8/Q0vIZK1feR0zMabz44vNs2fIoPT09TJ8+g/T0Wdxzz12Eh0ewf//HLFq0mPj4I9/8WY6Nz2IrLi6OsrIybDYbVVVVVFRU4HA4yMjIYNq0aeTm5tLU1MTo0aNZvXo1mzdvxuVyccstt1BVVcXbb7/N7t27KSsrOw7DERERObG9/HINERER/Pa3D/LGG3/noYfKOOusONaufQDoXUaMjT2T4uLFPPzwZl56aRtTpkzjyScfZ82aDVgsFvLycvn+93uXGc8991x+/vOlwRzSCc9nsRUbG+t9HBYWhtVqpaGhgfz8fABSU1Opq6vDYrEwatQohg4dytChQ/F4PLjdbrZt20ZISAjXX389p512GsXFxQNynyEREZGT0YcffuC9J+K3vnUhH3+877A2X8xQxcaeyfvvv8dHH+1j374Pyc//KQBOp4Pm5t4bNl9wwcTjFPnJy+89Wy0tLVRWVpKZmUl7ezsREREA2O122traaGtrw263e9vb7XZaW1v59NNP6ejooKysjOTkZB544IGBH4WIiMhJ4pxzzuX113cD8MYbfycu7mxCQg79c26xfPnYMAzi4s5m5MjR3H//etaufYDS0kpGjRoN9N6fUQLLr18jdnR0kJ+fT1FRETExMdhsNtxuN+Hh4TidTqKiooiKisLpdHr7OJ1OoqOjsdvtnH/++QBcdtllvPDCC4EZiYiISJD1WEIPua+vbxbgyJd+6Mtll6Xyv/9by003LcRisVBYeCfPPVfNbbflk5KSdsQ+UVHRzJgxiyVLFhESEsKQIeHce+9vvkGccix8Flsej4eCggKys7NJSEgAIDExkZqaGqZMmUJtbS0/+9nPGDlyJHv37qW9vR2Xy4XVaiU8PJyLL76YV155hRkzZvD3v/+dc889N+CDEhERCYbea2P5f8kGqzWE7u5v9ivAkJAQ7rzzrkNeu/HGvCO2TUu70nsJiCuumMIVV0w55P2vH0cCw2exVV1dTX19PS6Xi/LyclJSUsjJyaGwsJDS0lKSk5OJj48HIC8vj/nz52OxWFi2bBnQO5tVU1NDdnY2VquVlStXBnZEIiIiIiZiMQzj8PlLk3jvnox+9RuRt4G2zvABjsacoqMjaW1tD3YYpqYc+Ud58o/y5J+TKU//+tcnnH76Wf3q25+ZrZOR2fJ0pM98+PBT+2yvXXEiIiLHwGKx0N39TW7RI4NZd7cHy1d/geAH3a5HRETkGAwdGkVLS3O/+oaGhuDxmGfGxqzMlqdTT43+Ru1NXWx9s190fOlov+IQEREZSOHhNsLDbf3qezIttx6LwZ4nU1clJ8u+KxERETlxac+WiIiISACZemYraoh7wI/ZYwn9v+ugiIiIiASeqYutfWsXDfgxe/eBqdgSERGR40PLiCIiIiIBpGJLREREJIBUbImIiIgEkM89W42NjaxYsYKwsDAiIyNZtWoVHo+HwsJCXC4XkydPZsmSJQBs376d9evXY7FYuOOOO5g4cSJPP/00jzzyCAD79+/n+9//vve+iSIiIiInOp/FVlxcHGVlZdhsNqqqqqioqMDhcJCRkcG0adPIzc2lqamJ0aNHs3r1ajZv3ozL5eKWW26hqqqK9PR00tPTAbj55puZMmWKjzOKiIiInDh8LiPGxsZis/VeGTcsLAyr1UpDQwNpaWkApKamUldXx969exk1ahRDhw4lNjYWj8eD2/3lpRsOHjzIO++8Q0JCQoCGIiIiImI+fu/ZamlpobKykszMTNrb24mIiADAbrfT1tZGW1sbdrvd295ut9Pa2up9vm3bNq644opvfPNGERERkcHMr2Kro6OD/Px8ioqKiImJwWazeWetnE4nUVFRREVF4XQ6vX2cTifR0dHe59XV1fzwhz8c2OhFRERETM5nseXxeCgoKCA7O9u7BJiYmEhNTQ0AtbW1JCUlMXLkSPbu3Ut7ezvNzc1YrVbCw3vvbfjZZ5/R3NzM+PHjAzgUEREREfPxuUG+urqa+vp6XC4X5eXlpKSkkJOTQ2FhIaWlpSQnJxMfHw9AXl4e8+fPx2KxHPKLw61bt3L11VcHbhQiIiIiJmUxDMMIdhB9ee+ejAE/5oi8DbR1hg/4cYMlOjqS1tb2YIdhasqRf5Qn/yhP/lGe/KM8+Wcw5Gn48FP7fE8XNRUREREJIBVbIiIiIgHkc89WMI3I2zDgx+yxmHrIIiIicoIxdeVxIu2tEhERkZOTlhFFREREAkjFloiIiEgAmXoZkVCr96E9tAtLT1cQgwmcHksoTrfVd0MREREZdExdbN1Qss37+PHiS9m3dlEQowmc3h8CqNgSERE5EWkZUURERCSAVGyJiIiIBJDPZcTGxkZWrFhBWFgYkZGRrFq1Co/HQ2FhIS6Xi8mTJ7NkyRIAtm/fzvr167FYLNxxxx1MnDgRh8PBLbfcQldXFxaLhXvvvZfY2NiAD0xERETEDHzObMXFxVFWVsbmzZtJS0ujoqKCBx98kIyMDKqqqti9ezdNTU10d3ezevVqNm3axOrVq/nVr34F9N6EOjExkYceeohrrrmGhx9+OOCDEhERETELn8VWbGwsNpsNgLCwMKxWKw0NDaSlpQGQmppKXV0de/fuZdSoUQwdOpTY2Fg8Hg9ut5vzzjsPl8sFgNPpJCYmJoDDERERETEXv/dstbS0UFlZSWZmJu3t7URERABgt9tpa2ujra0Nu93ubW+322ltbeX888+noaGB9PR0Nm/ezIwZMwZ+FCIiIiIm5Vex1dHRQX5+PkVFRcTExGCz2XC73UDvbFVUVBRRUVE4nU5vH6fTSXR0NBs3biQ9PZ2nn36aO+64g3vvvTcwIxERERExIZ/FlsfjoaCggOzsbBISEgBITEykpqYGgNraWpKSkhg5ciR79+6lvb2d5uZmrFYr4eHh9PT0MGzYMACio6NxOBwBHI6IiIiIufj8NWJ1dTX19fW4XC7Ky8tJSUkhJyeHwsJCSktLSU5OJj4+HoC8vDzmz5+PxWJh2bJlAGRnZ1NYWEhVVRVdXV0sX748sCMSERERMRGfxdasWbOYNWvWYa9v3LjxsNeuuOIKrrjiikNei42N5Q9/+EP/IxQREREZxHRRUxEREZEAUrElIiIiEkCmvhH174uu8j42Qrr+74bNJ54ei6k/BhERETkG5v4r7+n2PnR4QoDw4MUiIiIi0g9aRhQREREJIBVbIiIiIgFk6mXEqCHuYIdgfh2dRA0xgh2F6fRYQnG6rcEOQ0RExNzF1r61i4IdggxSvT+mULElIiLBp2VEERERkQBSsSUiIiISQD6XERsbG1mxYgVhYWFERkayatUqPB4PhYWFuFwuJk+ezJIlSwDYvn0769evx2KxcMcddzBx4kSam5tZunQpnZ2djBs3jjvvvBOLxRLwgYmIiIiYgc+Zrbi4OMrKyti8eTNpaWlUVFTw4IMPkpGRQVVVFbt376apqYnu7m5Wr17Npk2bWL16Nb/61a8A2LBhA9dddx0PPfQQVquVl19+OeCDEhERETELn8VWbGwsNpsNgLCwMKxWKw0NDaSlpQGQmppKXV0de/fuZdSoUQwdOpTY2Fg8Hg9ut5u9e/dy4YUXAvCtb32Lurq6AA5HRERExFz83rPV0tJCZWUlmZmZtLe3ExERAYDdbqetrY22tjbsdru3vd1up7W1lfPPP5///d//BeCVV16hra1tgIcgIiIiYl5+FVsdHR3k5+dTVFRETEwMNpsNt7v3GlhOp5OoqCiioqJwOp3ePk6nk+joaBYtWsQrr7zC9ddfj81m44wzzgjMSERERERMyGex5fF4KCgoIDs7m4SEBAASExOpqakBoLa2lqSkJEaOHMnevXtpb2+nubkZq9VKeHg4UVFR/Nd//RdlZWX09PRw5ZVXBnZEIiIiIibi89eI1dXV1NfX43K5KC8vJyUlhZycHAoLCyktLSU5OZn4+HgA8vLymD9/PhaLhWXLlgGwY8cO7y8Uf/CDHzB+/PjAjkhERETERCyGYZj2Xi/v3ZMR7BBkkBqRt4G2znAAoqMjaW1tD3JE5qc8+Ud58o/y5B/lyT+DIU/Dh5/a53u6qKmIiIhIAKnYEhEREQkgU9+IuvdmwnI0FosFE68EB02PxdRfbREROYmY+i/SF3tupG/R0ZG0mXwdW0RE5GSmZUQRERGRAFKxJSIiIhJApl5GJNTqfWgP7cLS0xXEYEyqo5OoIdqzdVTHKUc9llCcbqvvhiIiclIxdbF1Q8k27+PHiy9l39pFQYxG5Oh6f9ChYktERA6lZUQRERGRAFKxJSIiIhJAPoutxsZGZs+ezdy5c8nNzcXhcHDgwAEWLlxIVlYWa9as8bZdvHgxkyZNYtOmTd7XPv/8c2655Rauu+46li9fTk9PT2BGIiIiImJCPoutuLg4ysrK2Lx5M2lpaVRUVPDggw+SkZFBVVUVu3fvpqmpCYDi4mJuv/32Q/o//vjjXHjhhVRWVhISEsLLL78cmJGIiIiImJDPYis2NhabzQZAWFgYVquVhoYG0tLSAEhNTaWurs7b9uvq6+uP2FZERETkZOD3nq2WlhYqKyvJzMykvb2diIgIAOx2O21tbX32a2trw263+9VWRERE5ETjV7HV0dFBfn4+RUVFxMTEYLPZcLvdADidTqKiovrsa7fbcTgcfrUVEREROdH4LLY8Hg8FBQVkZ2eTkJAAQGJiIjU1NQDU1taSlJTUZ/+LL76Y2tpav9qKiIiInGh8XtS0urqa+vp6XC4X5eXlpKSkkJOTQ2FhIaWlpSQnJxMfHw9ASUkJO3fuxOPxsGfPHlauXMk111zD0qVL+clPfsKYMWO4/PLLAz4oEREREbPwWWzNmjWLWbNmHfb6xo0bD3utqKjosNdsNhurV6/uX3QiIiIig5wuaioiIiISQCq2RERERALI1Dei/n3RVd7HRkjX/93oV77KYrFgGEawwzC145WjHoup/+8kIiJBYu6/Dp5u70OHJwQID14sJhUdHUlba3uwwzA15UhERIJJy4giIiIiAaRiS0RERCSAzL2MGGr1q5k9tAtLT1eAgzGpjk6ihmjP1lEpR/5RnvwTpDz1WEJxuv37N1FEzMXUxdYNJdv8avd48aXsW7sowNGIiARP7w+EVGyJDEZaRhQREREJIBVbIiIiIgHks9hqbGxk9uzZzJ07l9zcXBwOBwcOHGDhwoVkZWWxZs0ab9vFixczadIkNm3a5H2ttraWH/zgB7oBtYiIiJyUfO7ZiouLo6ysDJvNRlVVFRUVFTgcDjIyMpg2bRq5ubk0NTUxduxYiouL2bFjBy0tLd7+EydOZMuWLWRmZgZ0ICIiIiJm5HNmKzY2FpvNBkBYWBhWq5WGhgbS0tIASE1Npa6uztv266Kjo4mIiBjImEVEREQGDb/3bLW0tFBZWUlmZibt7e3eAsput9PW1hawAEVEREQGM7+KrY6ODvLz8ykqKiImJgabzYbb7QbA6XQSFRUV0CBFREREBiufxZbH46GgoIDs7GwSEhIASExMpKamBujdAK/N7yIiIiJH5nODfHV1NfX19bhcLsrLy0lJSSEnJ4fCwkJKS0tJTk4mPj4egJKSEnbu3InH42HPnj2sXLmS3bt381//9V989NFHXH/99SxatIhLLrkk4AMTERERMQOLYRimvT9H+q1P+dWu9wryuQGORkQkeEbkbaCtMzzYYfgtOjqS1tb2YIdhesqTfwZDnoYPP7XP93RRUxEREZEAUrElIiIiEkCmXkZsbvFvytAe2oWlpyvA0ZiTxWLBxB+hKShH/lGe/BOsPPVYQnG6B8+NqAfDso8ZKE/+GQx5Otoyos8N8kHl6farmcMTAgyevQwDKTo6kjaTfwGDTTnyj/LkH+VJRL4pLSOKiIiIBJCKLREREZEAMvcyYqh/+xNO5j1bdHQSNUT7bI5KOfKP8uQf5ck/R8nTYNt/JnKsTF1s3VCyza92vdfZWhTgaEREZCCMyNsAqNiSk4eWEUVEREQCSMWWiIiISACp2BIREREJIJ97thobG1mxYgVhYWFERkayatUqPB4PhYWFuFwuJk+ezJIlSwBYvHgx9fX15ObmsmDBAgDWrFnDyy+/DMBVV11FTk5OAIcjIiIiYi4+i624uDjKysqw2WxUVVVRUVGBw+EgIyODadOmkZubS1NTE2PHjqW4uJgdO3bQ0tLi7Z+ens6SJUswDIOsrCzS09M588wzAzooEREREbPwuYwYGxuLzWYDICwsDKvVSkNDA2lpaQCkpqZSV1fnbft1o0aNAnpvcREaGkpIiFYuRURE5OThd+XT0tJCZWUlmZmZtLe3ExERAYDdbqetrc1n/61bt3LOOedwxhln9D9aERERkUHGr+tsdXR0kJ+fT1FRETExMdhsNtxuN+Hh4TidTqKioo7a/y9/+QuVlZU88MADAxK0iIiIyGDhc2bL4/FQUFBAdnY2CQkJACQmJlJTUwNAbW0tSUlJffZ/5513WLlyJb/5zW+8s2EiIiIiJwufM1vV1dXU19fjcrkoLy8nJSWFnJwcCgsLKS0tJTk5mfj4eABKSkrYuXMnHo+HPXv2sHLlSkpKSnA4HOTn5wNQVFTEuHHjAjsqEREREZOwGIZh2pt8pd/6lF/tem/XkxvgaEREZCCMyNtAW2d4sMMwhejoSFpb24MdhukNhjwNH35qn+/pp4EiIiIiAWTqma3mFv+qWHtoF5aergBHY04WiwUTf4SmoBz5R3nyj/Lkn6PlqccSitOtG1HD4JixMYPBkKejzWz59WvEoPF0+9XM4QkBTs4p6ejoSNpM/gUMNuXIP8qTf5Qn/yhPIl/SMqKIiIhIAKnYEhEREQkgcy8jhvZvTf+k2sPV0UnUEO0fOSrlyD/Kk3+UJ/8cpzxp/5cMBqYutm4o2davfr2Xglg0wNGIiIjZjMjbAKjYEnPTMqKIiIhIAKnYEhEREQkgFVsiIiIiAeRzz1ZjYyMrVqwgLCyMyMhIVq1ahcfjobCwEJfLxeTJk1myZAkAixcvpr6+ntzcXBYsWADAY489xpYtWzAMg5EjR3LPPfdgtWp9XURERE4OPoutuLg4ysrKsNlsVFVVUVFRgcPhICMjg2nTppGbm0tTUxNjx46luLiYHTt20NLS4u0/Y8YMMjMzAVi6dCm7du1i8uTJgRuRiIiIiIn4XEaMjY3FZrMBEBYWhtVqpaGhgbS0NABSU1Opq6vztv26IUOGAGAYBj09PZxzzjkDFryIiIiI2fm9Z6ulpYXKykoyMzNpb28nIiICALvdTltb21H7lpaWcvXVV9PW1sbpp59+bBGLiIiIDCJ+FVsdHR3k5+dTVFRETEwMNpsNt9sNgNPpJCoq6qj958+fz/PPP8/o0aPZsmXLsUctIiIiMkj4LLY8Hg8FBQVkZ2eTkJAAQGJiIjU1NQDU1taSlJTUZ//Ozk7v46FDh3pnxEREREROBj43yFdXV1NfX4/L5aK8vJyUlBRycnIoLCyktLSU5ORk4uPjASgpKWHnzp14PB727NnDypUrWbduHX/5y1/o6elhxIgR5ObmBnxQIiIiImZhMQzDtDf5Sr/1qX71671dj4o6EZET3Yi8DbR1hgc7jH6Ljo6ktbU92GGY3mDI0/Dhp/b5ni5qKiIiIhJAKrZEREREAsjUy4jNLf2bMrSHdmHp6RrgaMzJYrFg4o/QFJQj/yhP/lGe/HO88tRjCcXpHrx3JRkMy2NmMBjydLRlRJ8b5IPK092vbg5PCDB41/C/iejoSNpM/gUMNuXIP8qTf5Qn/yhPIl/SMqKIiIhIAGkZcZDTkoZvypF/lCf/KE/+UZ7889U8DfYl0UDSMmIA3VCyrV/9ei/9sGiAoxEREQmcEXkbABVbJyItI4qIiIgEkIotERERkQBSsSUiIiISQD6LrcbGRmbPns3cuXPJzc3F4XBw4MABFi5cSFZWFmvWrPG2Xbx4MZMmTWLTpk2HHaeoqIhFi7SPSkRERE4uPjfIx8XFUVZWhs1mo6qqioqKChwOBxkZGUybNo3c3FyampoYO3YsxcXF7Nixg5aWlkOO8d577/HZZ58FbBAiIiIiZuVzZis2NhabzQZAWFgYVquVhoYG0tLSAEhNTaWurs7b9kjWr19PTk7OQMUsIiIiMmj4vWerpaWFyspKMjMzaW9vJyIiAgC73U5bW1uf/Xbv3s1pp53GGWeccezRioiIiAwyfhVbHR0d5OfnU1RURExMDDabDbfbDYDT6SQqKqrPvprVEhERkZOZz2LL4/FQUFBAdnY2CQkJACQmJlJTUwNAbW0tSUlJffb/xz/+wW233cbSpUt57bXXKCsrG5jIRURERAYBnxvkq6urqa+vx+VyUV5eTkpKCjk5ORQWFlJaWkpycjLx8fEAlJSUsHPnTjweD3v27GHlypU8/fTTAOzbt4//9//+H9dff31AByQiIiJiJqa+N2L6rU/1q1/v7XpyBzgaERGRwBmRt4G2zvBgh2FKg/3eiLqoqYiIiEgAqdgSERERCSBTLyM2t/RvytAe2oWlp2uAozEni8WCiT9CU1CO/KM8+Ud58o/y5J+v5qnHEorTbQ1yROY02JcRfW6QDypPd7+6OTwhwMmx7h0dHUmbyb+AwaYc+Ud58o/y5B/lyT/K08lBy4giIiIiAWTuma1Q806nmmapsqOTqCGaqj8q5cg/ypN/lCf/nMB50nKffFOmLrZuKNkW7BD61Ht5iUXBDkNERI6zEXkbABVb4j8tI4qIiIgEkIotERERkQBSsSUiIiISQD6LrcbGRmbPns3cuXPJzc3F4XBw4MABFi5cSFZWFmvWrPG2Xbx4MZMmTWLTpk3e17Zs2cKVV15JdnY22dnZgRmFiIiIiEn53CAfFxdHWVkZNpuNqqoqKioqcDgcZGRkMG3aNHJzc2lqamLs2LEUFxezY8cOWlpaDjlGVlYWCxYsCNggRERERMzK58xWbGwsNpsNgLCwMKxWKw0NDaSlpQGQmppKXV2dt+2RPProo2RlZVFWVjZAYYuIiIgMDn7v2WppaaGyspLMzEza29uJiIgAwG6309bW1me/K6+8kmeeeYY//OEP1NbW8te//vWYgxYREREZLPwqtjo6OsjPz6eoqIiYmBhsNhtutxsAp9NJVFRUn33tdjtWq5UhQ4ZwxRVX8MYbbwxM5CIiIiKDgM9iy+PxUFBQQHZ2NgkJCQAkJiZSU1MDQG1tLUlJSX32dzqdABiGQX19PaNGjRqAsEVEREQGB58b5Kurq6mvr8flclFeXk5KSgo5OTkUFhZSWlpKcnIy8fHxAJSUlLBz5048Hg979uxh5cqV/P73v2fHjh1YLBaSkpKYPHlywAclIiIiYhYWwzBMe/Oq9FufCnYIfeq9XU9usMMQEZHjbETeBto6wwfkWNHRkbS2tg/IsU5kgyFPw4ef2ud7uqipiIiISACp2BIREREJIFMvIza3mHfK0B7ahaWnK9hhYLFYMPFHaArKkX+UJ/8oT/45kfPUYwnF6bYOyLEGw/KYGQyGPB1tGdHnBvmg8nQHO4I+OTwhwMCs2R+L6OhI2kz+BQw25cg/ypN/lCf/KE8iX9IyooiIiEgAmXtmK3Rgpmn9ZZalwW+ko5OoISfmVP2AUY78ozz5R3nyjwnzNJDLfyLfhKmLrRtKth3X8/VezmHRcT2niIgcHyPyNgAqtuT40zKiiIiISACp2BIREREJIBVbIiIiIgHks9hqbGxk9uzZzJ07l9zcXBwOBwcOHGDhwoVkZWWxZs0ab9vFixczadIkNm3adMgx1q1bx/z588nOzubtt98e+FGIiIiImJTPDfJxcXGUlZVhs9moqqqioqICh8NBRkYG06ZNIzc3l6amJsaOHUtxcTE7duygpaXF23/79u2EhIRQWloa0IGIiIiImJHPma3Y2FhsNhsAYWFhWK1WGhoaSEtLAyA1NZW6ujpv26974YUXaG1tZd68eRQXF9PZ2TmQ8YuIiIiYmt97tlpaWqisrCQzM5P29nYiIiIAsNvttLW19dnv008/JTIykvLycoYNG8Zjjz127FGLiIiIDBJ+FVsdHR3k5+dTVFRETEwMNpsNt9sNgNPpJCoqqs++drud733vewBcdtll7NmzZwDCFhERERkcfBZbHo+HgoICsrOzSUhIACAxMZGamhoAamtrSUpK6rP/xRdfzOuvvw7A3//+d84999yBiFtERERkUPC5Qb66upr6+npcLhfl5eWkpKSQk5NDYWEhpaWlJCcnEx8fD0BJSQk7d+7E4/GwZ88eVq5cyTXXXMOdd95JdnY2Q4cOZdWqVQEflIiIiIhZWAzDMNfNq74i/danjuv5em/Xk3tczykiIsfHiLwNtHWGBzuMQ0RHR9La2h7sMExvMORp+PBT+3xPFzUVERERCSAVWyIiIiIBZOplxOaW4ztlaA/twtLTdVzPeawsFgsm/ghNQTnyj/LkH+XJP2bMU48lFKfbGuwwDjEYlsfMYDDk6WjLiD43yAeVp/u4ns7hCQHMtZ7vS3R0JG0m/wIGm3LkH+XJP8qTf5QnkS9pGVFEREQkgFRsiYiIiASQuZcRQ/u3tj4Y9171W0cnUUPMtS/CdJQj/yhP/lGe/HMS5cmMe8HEXExdbN1Qsq1f/Xqvl7VogKMRERE53Ii8DYCKLemblhFFREREAkjFloiIiEgA+VxGbGxsZMWKFYSFhREZGcmqVavweDwUFhbicrmYPHkyS5YsAWDx4sXU19eTm5vLggULACgtLeWll14C4IMPPmDhwoXMmzcvgEMSERERMQ+fxVZcXBxlZWXYbDaqqqqoqKjA4XCQkZHBtGnTyM3NpampibFjx1JcXMyOHTtoaWnx9p8/fz7z588H4Nprr2XKlCmBG42IiIiIyfhcRoyNjcVmswEQFhaG1WqloaGBtLQ0AFJTU6mrq/O27cvevXsJDw/nzDPPHIi4RURERAYFv/dstbS0UFlZSWZmJu3t7URERABgt9tpa2vz2b+6uprp06f3P1IRERGRQcivYqujo4P8/HyKioqIiYnBZrPhdrsBcDqdREVF+TzG888/z9SpU48tWhEREZFBxmex5fF4KCgoIDs7m4SEBAASExOpqakBoLa2lqSkpKMe4/XXX+ess84iJiZmAEIWERERGTx8bpCvrq6mvr4el8tFeXk5KSkp5OTkUFhYSGlpKcnJycTHxwNQUlLCzp078Xg87Nmzh5UrV3qPoSVEERERORlZDMMw7f0U0m99ql/9eq8gnzvA0YiIiBxuRN4G2jrD+9U3OjqS1tb2AY7oxDMY8jR8+Kl9vqeLmoqIiIgEkIotERERkQAy9TJic0v/pgztoV1YeroGOBpzslgsmPgjNAXlyD/Kk3+UJ/+cTHnqsYTidPfvRtSDYXnMDAZDno62jOhzg3xQebr71c3hCQH6t34+2ERHR9Jm8i9gsClH/lGe/KM8+Ud5EvmSlhFFREREAkjFloiIiEgAnZB7tgbKYNj7dTLti+gv5cg/ypN/lCf/KE/+Gag8Hcu+scFAe7YC6IaSbUE9f+/1uhYFNQYRERFfRuRtAE7cYmuw0zKiiIiISACp2BIREREJIJ/LiI2NjaxYsYKwsDAiIyNZtWoVHo+HwsJCXC4XkydPZsmSJQAsXryY+vp6cnNzWbBgAQD79u3j9ttvJyQkhMjISO677z4iIyMDOyoRERERk/A5sxUXF0dZWRmbN28mLS2NiooKHnzwQTIyMqiqqmL37t00NTUBUFxczO23335I/0cffZRrr72Whx56iIkTJ/Lss88GZiQiIiIiJuSz2IqNjcVmswEQFhaG1WqloaGBtLQ0AFJTU6mrq/O2/bqxY8fidDoBcDqdxMTEDFjwIiIiImbn956tlpYWKisryczMpL29nYiICADsdjttbW199ktKSqKqqor09HQaGxu57LLLjj1qERERkUHCr2Kro6OD/Px8ioqKiImJwWaz4Xa7gd7ZqqioqD77rlq1ittvv52nn36aGTNmsHHjxoGJXERERGQQ8FlseTweCgoKyM7OJiEhAYDExERqamoAqK2tJSkpqc/+PT09DBs2DIBhw4bhcDgGIm4RERGRQcHnrxGrq6upr6/H5XJRXl5OSkoKOTk5FBYWUlpaSnJyMvHx8QCUlJSwc+dOPB4Pe/bsYeXKldx4443cddddhIb2nmrlypWBHZGIiIiIiZj6dj3ptz4V1PP3XkE+N6gxiIiI+DIibwNtneHBDiNgBvvtenRRUxEREZEAUrElIiIiEkCmXkZsbgnulKE9tAtLT1dQY/BloO4YfyJTjvyjPPlHefKP8uSfgcpTjyUUp/vEvRH1YF9G9LlBPqg83UE9vcMTAph7DTw6OpI2k38Bg0058o/y5B/lyT/Kk3+Up5ODlhFFREREAkjFloiIiEgAac9WgByv/V7aF+GbcuQf5ck/ypN/lCf/KE/+6W+ejudetkG7Z+uGkm3BDqHfeq/RtSjYYYiIiJy0RuRtAIL/wwEtI4qIiIgEkIotERERkQDyWWw1NjYye/Zs5s6dS25uLg6HgwMHDrBw4UKysrJYs2aNt+3ixYuZNGkSmzZt8r727rvvMnfuXObOncv69esDMwoRERERk/K5ZysuLo6ysjJsNhtVVVVUVFTgcDjIyMhg2rRp5Obm0tTUxNixYykuLmbHjh20tLR4+997770UFRUxfvx4lixZwrvvvsuYMWMCOigRERERs/A5sxUbG4vNZgMgLCwMq9VKQ0MDaWlpAKSmplJXV+dt+3UfffQR48ePB2DChAnetiIiIiInA7/3bLW0tFBZWUlmZibt7e1EREQAYLfbaWtr67Pfeeedx6uvvorH42HXrl04HI5jj1pERERkkPCr2Oro6CA/P5+ioiJiYmKw2Wy43W4AnE4nUVFRffa9/fbbKSsrIzc3l7POOovhw4cPTOQiIiIig4DPYsvj8VBQUEB2djYJCQkAJCYmUlNTA0BtbS1JSUl99o+Li2P9+vU8+OCDuFwuLr/88gEKXURERMT8fG6Qr66upr6+HpfLRXl5OSkpKeTk5FBYWEhpaSnJycnEx8cDUFJSws6dO/F4POzZs4eVK1fy5JNP8vjjj2OxWJg3bx6nnXZawAclIiIiYhamvl1P+q1PBTuEfuu9gnxusMMQERE5aY3I20BbZ/hxOdfRbteji5qKiIiIBJCKLREREZEAMvUyYnNLe7BD6Dd7aBeWnq6An0d3jPdNOfKP8uQf5ck/ypN/lCf/9DdPPZZQnO7jcyPqoy0j+twgH1Se7mBH0G8OTwgQ+HXi6OhI2loHb1F6PChH/lGe/KM8+Ud58o/y5J/BnictI4qIiIgEkIotERERkQAy9zJi6PFZZ+2P47Uny6eOTqKGaL3/qJQj/yhP/lGe/DPI83Q89/rIic/UxdYNJduCHUKfeq+jtSjYYYiISACMyNsAqNiSgaFlRBEREZEAUrElIiIiEkAqtkREREQCyOeercbGRlasWEFYWBiRkZGsWrUKj8dDYWEhLpeLyZMns2TJEj744AOWLVuGxWIhNDSUe+65hxEjRvD555+zdOlSPv30U+Lj41m+fDkhIarxRERE5OTgs+qJi4ujrKyMzZs3k5aWRkVFBQ8++CAZGRlUVVWxe/dumpqasNvtrFu3joqKChYsWMD69esBePzxx7nwwguprKwkJCSEl19+OeCDEhERETELn8VWbGwsNpsNgLCwMKxWKw0NDaSlpQGQmppKXV0dw4YNIzo6+pB2APX19Ye1FRERETlZ+L2e19LSQmVlJZmZmbS3txMREQGA3W6nra3N287tdrN27VrmzZsHQFtbG3a7/YhtRURERE50fhVbHR0d5OfnU1RURExMDDabDbfbDYDT6SQqKgqA7u5ubrvtNubNm8eYMWOA3gLL4XAc1lZERETkZOCz2PJ4PBQUFJCdnU1CQgIAiYmJ1NTUAFBbW0tSUhIAd999N0lJSUydOtXb/+KLL6a2tvawtiIiIiInA5/FVnV1NfX19ZSXl5Odnc3GjRvJycnhkUceISsri/HjxxMfH099fT1PPPEE27ZtIzs7mxUrVgBwzTXX8Ne//pWf/OQndHZ2cvnllwd8UCIiIiJmYTEMw7Q3r0q/9algh9Cn3tv15AY7DBERCYAReRto6wwP+HmioyNpbW0P+HkGu8GQp+HDT+3zPV3wSkRERCSATD2z1dxi3irWHtqFpacr2GFgsVgw8UdoCsqRf5Qn/yhP/hnseeqxhOJ0B/5G1INhxsYMBkOejjaz5fMK8kHl6Q52BH1yeEKAwE8x+xIdHUmbyb+AwaYc+Ud58o/y5B/lSeRLWkYUERERCSAVWyIiIiIBpD1bJvRN9oMN9n0Rx4Ny5B/lyT/Kk3+UJ/8MVJ6O1x6zYNGerQC6oWRbsEMIit7LSiwKdhgiIjJIjMjbAJy4xdZgp2VEERERkQBSsSUiIiISQCq2RERERALI556txsZGVqxYQVhYGJGRkaxatQqPx0NhYSEul4vJkyezZMkSPvjgA5YtW4bFYiE0NJR77rmHESNGUFtby4oVK/j000+pr68/HmMSERERMQ2fxVZcXBxlZWXYbDaqqqqoqKjA4XCQkZHBtGnTyM3NpampidNOO41169YRHR1NbW0t69evp6SkhIkTJ7JlyxYyMzOPx3hERERETMXnMmJsbCw2mw2AsLAwrFYrDQ0NpKWlAZCamkpdXR3Dhg0jOjr6kHYA0dHRREREBCh8EREREXPze89WS0sLlZWVZGZm0t7e7i2g7HY7bW1t3nZut5u1a9cyb968gY9WREREZJDxq9jq6OggPz+foqIiYmJisNlsuN1uAJxOJ1FRUQB0d3dz2223MW/ePMaMGRO4qEVEREQGCZ/FlsfjoaCggOzsbBISEgBITEykpqYGgNraWpKSkgC4++67SUpKYurUqQEMWURERGTw8FlsVVdXU19fT3l5OdnZ2WzcuJGcnBweeeQRsrKyGD9+PPHx8dTX1/PEE0+wbds2srOzWbFiBQC7d+/m+uuv56OPPuL6669n586dAR+UiIiIiFmY+t6I6bc+FewQgqL3dj25wQ5DREQGiRF5G2jrDA92GAEz2O+NqIuaioiIiASQii0RERGRADL1MmJzi7mnDAPFHtqFpafLr7YWiwUTf4SmoBz5R3nyj/LkH+XJPwOVpx5LKE63dQAiMqfBvozo8wryQeXpDnYEQeHwhAD+rb1HR0fSZvIvYLApR/5RnvyjPPlHefKP8nRy0DKiiIiISACZe2Yr9Msp0W+ytPZNnOhTryIiIhJcpi62bijZ5n3cezmERQN+jhF5GwAVWyIiIhIYWkYUERERCSAVWyIiIiIBpGJLREREJIB87tlqbGxkxYoVhIWFERkZyapVq/B4PBQWFuJyuZg8eTJLlizhgw8+YNmyZVgsFkJDQ7nnnnsYMWIEa9as4eWXXwbgqquuIicnJ+CDEhERETELn8VWXFwcZWVl2Gw2qqqqqKiowOFwkJGRwbRp08jNzaWpqYnTTjuNdevWER0dTW1tLevXr6ekpIT09HSWLFmCYRhkZWWRnp7OmWeeeTzGJiIiIhJ0PpcRY2NjsdlsAISFhWG1WmloaCAtLQ2A1NRU6urqGDZsGNHR0Ye0Axg1ahSAd8YrJEQrlyIiInLy8LvyaWlpobKykszMTNrb24mIiADAbrfT1tbmbed2u1m7di3z5s07pP/WrVs555xzOOOMMwYodBERERHz8+s6Wx0dHeTn51NUVERMTAw2mw232014eDhOp5OoqCgAuru7ue2225g3bx5jxozx9v/LX/5CZWUlDzzwQGBGISIiImJSPme2PB4PBQUFZGdnk5CQAEBiYiI1NTUA1NbWkpSUBMDdd99NUlISU6dO9fZ/5513WLlyJb/5zW+8s2EiIiIiJwufM1vV1dXU19fjcrkoLy8nJSWFnJwcCgsLKS0tJTk5mfj4eOrr63niiSf4zne+w7Zt27jgggtYunQpJSUlOBwO8vPzASgqKmLcuHEBH5iIiIiIGfgstmbNmsWsWbMOe33jxo2HPE9KSmL37t2HtfvDH/7Q/+hEREREBjn9NFBEREQkgFRsiYiIiASQX79GDJbfF13lfWyEdDEib8OAn6PHYuoUiIiIyCBn7krD0+196PCEAOHBi0VERESkHyyGYRjBDkJERETkRKU9WyIiIiIBpGJLREREJIBUbImIiIgEkIotERERkQBSsSUiIiISQCq2RERERAJIxZaIiIhIAKnYEhEREQkgUxZbjzzyCHPmzCE7O5sPP/ww2OGYRmNjI7Nnz2bu3Lnk5ubicDg4cOAACxcuJCsrizVr1gQ7RNOor69n3LhxHDhwQDnqw2uvvcYNN9xAdnY2GzduVJ768Mtf/pI5c+bw4x//mF27dvH5559zyy23cN1117F8+XJ6enqCHWLQdHV1MWfOHJKSkti6dStAn9+j7du3M3v2bObMmcNrr70WrJCPuyPlqKioiNmzZ3Pttdfy5JNPetuezH/7jpSnL8yfP59f/vKX3ueDMk+GybS0tBiZmZlGV1eX8be//c24+eabgx2Saezfv99ob283DMMwKisrjXXr1hkrVqwwnn32WcMwDCMnJ8d45513ghmiaeTl5RnXXHON8dlnnylHR+B2u42cnBzv98kwDOXpCN5//31j3rx5hmEYxscff2xcd911xubNm40HH3zQMAzDuOuuu4w//elPwQwxqHp6eox//vOfxv33328899xzhmEc+Xvk8XiMmTNnGk6n09i/f78xZ86cYIZ9XB0pR++//75hGL3/P5w6darR1dV10v/tO1KeDMMwduzYYeTk5Bh33323YRiDt0Yw3czWa6+9xr/9278RGhrKxIkTef/994MdkmnExsZis9kACAsLw2q10tDQQFpaGgCpqanU1dUFM0RT2L59O4mJiURGRgIoR0fw17/+lYiICG6++WZuuOEG3nrrLeXpCE4//XQiIiLweDw4HA5iYmKor69Xnv6PxWLhjDPOOOS1I32P9u7dy6hRoxg6dCixsbF4PB7cbncwQj7ujpSjUaNGAV/+O26xWE76v31HyhNAeXk5P/nJT7zPB2ueTFdstbW1ERUV5X1u6NaNh2lpaaGyspLMzEza29uJiIgAwG6309bWFuTogqunp4fKykqysrK8rylHh/v0009pampi9erV3Hnnndx9993K0xGccsopxMXFcfXVV7NgwQIWLFhAW1sbdrsdUJ6O5Ejfo6/m7IvXW1tbgxShefz+979n2rRpWK1W/e07gq1bt3LppZd6v08weGsE0xVbdrsdh8PhfR4SYroQg6qjo4P8/HyKioqIiYnBZrN5/wvR6XQe8iU8GT399NN8//vfJzw83PuacnQ4u91OQkICkZGRjBkzhoMHDypPR7Bjxw5aW1t54YUX2LJlC7/85S8P+TdKeTrckb5HUVFROJ1Obxun00l0dHSQIjSHrVu38re//Y2bbroJ0N++r+vu7ubRRx/lxz/+8SGvD9Y8mS7Kb3/729TV1dHd3c3rr7/OyJEjgx2SaXg8HgoKCsjOziYhIQGAxMREampqAKitrSUpKSmYIQbdnj17eP7551mwYAFvv/02P//5z5WjI/j2t7/N+++/T09PD83NzQwZMkR5OoKenh6ioqIICQlh6NChtLe3c/HFF1NbWwsoT0dypO/RyJEj2bt3L+3t7TQ3N2O1Wg/5D6KTza5du6isrOQ///M/vcWC/vYd6l//+hcHDhzgpz/9Kffeey/bt2+nurp60ObJYphwDq6qqoqnnnqK0NBQ7rnnnkGTzEB78sknKSkpYcKECQCkpKRwzTXXUFhYiMvlIjk5mfz8/CBHaR7Z2dmsXr0aQDk6gscee4wtW7bg8Xi47bbbGDNmjPL0Nd3d3SxdupSPPvoIt9vNv//7v3PVVVexdOlS/vWvfzFmzBjuuuuuQfNf14GQn5/P3//+dyIjI7nssstYuHDhEb9H//M//8MDDzyAxWJh2bJlfPvb3w5y5MfP13P0wgsvcMopp3iXVlevXk1MTMxJ/7fv63kqLCwEeovT559/nuLiYmBw1gimLLZEREREThQn73+OiYiIiBwHKrZEREREAkjFloiIiEgAqdgSERERCSAVWyIiIiIBpGJLRAbEuHHjWLt2rff50qVLvdejGij5+fnMmDGDP/7xj322qaqqMv2NtB0OB48++miwwxCR40TFlogMiKFDh/LEE0/Q0dERkON/+umn7N27lz/+8Y/MmDEjIOc4XlRsiZxcVGyJyICIiIhgypQpPPbYY4e9V1NTQ3p6Oj/84Q/9mnVat24dP/zhD0lPT+ell14C4MYbb+SDDz5g5syZvP3224e0f/HFF5k6dSqZmZm89tpr3tdfe+01rrnmGtLT01m+fDnd3d1A782SMzMzmTFjBgsXLgQOnYnbt2+f9zYha9asYdmyZcyZM4crr7ySP//5z9x6661MnTqV+++/33uuxx57jIyMDGbMmOGd4du1axcLFizgxhtvZMqUKfzud78D4L777mPPnj3MnDmTjRs38uqrr5Kens7MmTOZM2eOfwkXkcHDEBEZAJMnTzb2799vTJkyxejq6jJuv/12o6amxujo6DDS0tKMjz/+2Ojs7DRmz55t1NXV9Xmcv/3tb0ZGRobhdruNf/7zn0ZaWppx8OBB48MPPzSuvfbaw9p/cfz9+/cbbrfbyMzMNO6//37DMAxj+vTpxu7duw3DMIz8/HzjySefNNxut3HllVcaTU1NhmEYRktLi2EYhjdewzAOOdf9999vLFiwwOju7ja2bdtmXHzxxcY//vEPw+12GykpKcbBgweNd955x7j55psNj8djdHd3G4sWLTJee+0149VXXzWSk5ONAwcOGO3t7cbll19uuFyuw8ayaNEiY+fOnYZhGIbD4TjGT0JEzEYzWyIyYGJjY0lMTOTZZ5/1vvb+++8zZswYzjrrLMLCwvjBD35AQ0NDn8doaGhg6tSpDBkyhDPOOINvfetbNDU19dn+i+PHxsYyZMgQpkyZAvQu1fX09HDhhRcCkJ6eTkNDA++99x7nnnsuY8aMAfDrhsiXX345ISEhjBs3jrPPPptzzjmHIUOGcPbZZ9Pc3MzOnTv561//yjXXXMOPfvQj3n33XT744AMAEhISGDZsGDabjREjRvDpp58edvzvfve73HvvvWzevJnOzk6f8YjI4BIa7ABE5MSyYMECbr31VsaPH3/czmmxWI74+JsICQnB+L+7l3294AkLC/Me+4vHX/Tp7u7GMAyysrK48cYbD+m3a9cuhgwZclj70NBD/+ldtGgRl19+OS+99BLXXnstjz/+OMOGDevXOETEfDSzJSIDasyYMZx99tns3LkTgNGjR/Puu+/yz3/+E4/Hw9atW0lISOizf0JCAi+++CJdXV00NzfzxhtvMHbs2D7bjx49mqamJv75z3/S1dXFtm3bALDb7VitVt566y0AnnnmGRITEznvvPP48MMPeffddwFobW0FIC4ujjfffBPAu0/MX8nJyTzzzDM4HA4A9u/fT0tLS5/tTznlFFwul/f5hx9+yIQJE1i8eDFnn302+/fv/0bnFxFz08yWiAy4nJwcZs+eDfRunF++fDk5OTn09PQwdepUkpKSAJg5cyZPPfXUIX0nTpxISkoKP/rRj7BYLBQVFXHKKaf0WbxERERwxx13MG/ePOx2+yGF2T333MMdd9xBV1cX3/3ud5k+fTpWq5WVK1dSWFhIV1cXZ511Fhs2bODaa6/lpz/9KVu3buV73/veNxrv+eefz4IFC5g7dy6GYXDKKafw61//us/2w4YNY9y4cd5N8R9//DG7du0iJCSEhISE4zorKCKBZzG+mDcXERERkQGnZUQRERGRAFKxJSIiIhJAKrZEREREAkjFloiIiEgAqdgSERERCSAVWyIiIiIBpGJLREREJID+P1kC62P2PZfIAAAAAElFTkSuQmCC\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"threshold = 0.2\n",
"dl_topic = topic_model.doc2topic[:, topic_id] > threshold\n",
"\n",
"docs = docs.add_property('dl_topic', dl_topic)\n",
"\n",
"\n",
"groups = {\n",
" 'deep learning related': 'dl_topic',\n",
" 'other': 'not dl_topic', \n",
"}\n",
"\n",
"litstudy.plot_year_histogram(docs, groups=groups, stacked=True);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The histogram shows that interest in deep learning has clearly risen over the years. We can even calculate the exact amount by calculating the percentage of documents on deep learning each year. The example below shows that this percentage has increased from just 3.4% in 2011 to 13.6% in 2021."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
deep learning related
\n",
"
other
\n",
"
\n",
" \n",
" \n",
"
\n",
"
2005
\n",
"
0.000000
\n",
"
100.000000
\n",
"
\n",
"
\n",
"
2006
\n",
"
0.000000
\n",
"
100.000000
\n",
"
\n",
"
\n",
"
2007
\n",
"
0.000000
\n",
"
100.000000
\n",
"
\n",
"
\n",
"
2008
\n",
"
6.250000
\n",
"
93.750000
\n",
"
\n",
"
\n",
"
2009
\n",
"
0.000000
\n",
"
100.000000
\n",
"
\n",
"
\n",
"
2010
\n",
"
2.127660
\n",
"
97.872340
\n",
"
\n",
"
\n",
"
2011
\n",
"
3.409091
\n",
"
96.590909
\n",
"
\n",
"
\n",
"
2012
\n",
"
2.941176
\n",
"
97.058824
\n",
"
\n",
"
\n",
"
2013
\n",
"
3.738318
\n",
"
96.261682
\n",
"
\n",
"
\n",
"
2014
\n",
"
3.305785
\n",
"
96.694215
\n",
"
\n",
"
\n",
"
2015
\n",
"
9.565217
\n",
"
90.434783
\n",
"
\n",
"
\n",
"
2016
\n",
"
7.272727
\n",
"
92.727273
\n",
"
\n",
"
\n",
"
2017
\n",
"
3.448276
\n",
"
96.551724
\n",
"
\n",
"
\n",
"
2018
\n",
"
7.200000
\n",
"
92.800000
\n",
"
\n",
"
\n",
"
2019
\n",
"
9.027778
\n",
"
90.972222
\n",
"
\n",
"
\n",
"
2020
\n",
"
9.734513
\n",
"
90.265487
\n",
"
\n",
"
\n",
"
2021
\n",
"
13.600000
\n",
"
86.400000
\n",
"
\n",
"
\n",
"
2022
\n",
"
14.285714
\n",
"
85.714286
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" deep learning related other\n",
"2005 0.000000 100.000000\n",
"2006 0.000000 100.000000\n",
"2007 0.000000 100.000000\n",
"2008 6.250000 93.750000\n",
"2009 0.000000 100.000000\n",
"2010 2.127660 97.872340\n",
"2011 3.409091 96.590909\n",
"2012 2.941176 97.058824\n",
"2013 3.738318 96.261682\n",
"2014 3.305785 96.694215\n",
"2015 9.565217 90.434783\n",
"2016 7.272727 92.727273\n",
"2017 3.448276 96.551724\n",
"2018 7.200000 92.800000\n",
"2019 9.027778 90.972222\n",
"2020 9.734513 90.265487\n",
"2021 13.600000 86.400000\n",
"2022 14.285714 85.714286"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"table = litstudy.compute_year_histogram(docs, groups=groups)\n",
"table.div(table.sum(axis=1), axis=0) * 100"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alternatively, we can plot the two groups for the publications source. We can see that some journals/conferences have a strong focus on deep learning (e.g. \"Neural Computing and Applications\"), while others have no or few publications on deep learning (e.g. \"Journal of Real Time Image Processing\")."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA+YAAAJbCAYAAABpQ444AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzdeWCM5/7//+dkFUuQihBUQpDYVQ+tQ1VRToO21kQMtdROrRVLtai1QZVa42ilQa2nx1LqUNX2o3Faa45Quw4VTSUhEtlmfn/kl/mKJESbGElfj39M7vu6r/t93dekzXuuZQwWi8WCiIiIiIiIiNiEna0DEBEREREREfkrU2IuIiIiIiIiYkNKzEVERERERERsSIm5iIiIiIiIiA0pMRcRERERERGxISXmIiIiIiIiIjakxFxEREREClydOnV49dVXeeWVV5g8eTJmsznXshEREYwePTrbcZPJRPfu3QHYt28fa9eufeQ4oqKi+L//+z/rz4sWLeLIkSOPXI+ISH5ysHUAIiIiIlL0lSlThi+++IL09HTeeOMN9u7dS7t27f5wfa1bt/5D10VFRXHhwgWaNWsGwFtvvfWHYyhI6enp2Nvb2zoMEXlMNGIuIiIiIo+Nvb09DRo04MqVK2zdupWQkBDruZdeeonk5GQA4uLi6Nu3L+3ateOjjz7KVs+910ZHRzNw4EA6depE586d+fXXX7ly5QqBgYG8/vrr9OjRg/Pnz5Oens5HH33E1q1befXVV/nhhx8IDg7m4MGDAHzzzTd07NiRDh06sHjxYuu9/v73v/P+++/j7+/PkCFDSE9PzxJLeno648aNw9/fn44dO7J9+/aH1pdp8eLFrF+/3tr++fPn8+qrr3L06FE2btxIx44d6dSpk/UZnDhxgp49e/L6668zcuRIkpKS/nhniMgTQyPmIiIiIvLY3L17l4iICIYNG8bNmzdzLXfs2DF2795N2bJl6dWrF61ataJs2bI5lp05cybt27enc+fO3L17FwCLxcKnn36Kk5MTJ06cYMGCBXz88ceMHDmSCxcuMG7cOAD+9a9/WeOaNm0a4eHhlCtXDqPRyPPPP8+zzz5LTEwM7dq1Y8qUKQwePJgffvghS3IdFRXF9evX2blzJwC3b99+YH0PUqlSJb744gtOnz5NeHg469evp2TJksTFxZGSksK8efNYtmwZpUuXJjQ0lHXr1tG/f/88P38ReTIpMRcRERGRAhcXF8err76KwWCgZcuWvPjii2zdujXX8s8++yweHh4AtG3blp9++ok2bdrkWPbo0aMsWrQIgGLFigEQHx/P9OnTOXPmDHZ2dtaR+NxcvHiR6tWrU7FiRQBeeeUVjhw5wrPPPourqyt/+9vfAPDz8+Pq1atZrq1SpQrXrl1jxowZtGnThueff56oqKhc63uQ9u3bA3D48GH8/f0pWbIkkLEU4MyZM5w5c4bevXsDkJqayvPPP//A+kSkcFBiLiIiIiIFLnON+b3s7OyybAKXkpJifW0wGLK8vvfnvPj000/x9vYmJCSE2NhYunbt+gcjBycnpywx3z+VvXTp0vz73//m4MGDrFq1ih9//DHXDxEga9vubTOAi4tLrtdZLBbq1avHP//5z0dtgog84bTGXERERERsolKlSpw5cwbIWDsdExNjPffjjz8SHR1Namoqe/fu5Zlnnsm1nmeeeYZt27YBkJyczN27d0lISKBcuXIYDAbrOYASJUpw586dbHV4e3tz/vx5oqOjSUtLY/fu3Q+8570yp+S/8sorDB48mKioqAfW5+LiwvXr10lJSeH777/Psc7nnnuOnTt3kpCQAGTMOKhWrRomk8n6zBITE7l8+XKeYhSRJ5tGzEVERETEJho3bkzx4sV55ZVXePbZZ63TvgEaNGjAxIkTuXr1Kv7+/tSrVw+TyZRjPZMnT2by5MmsWbMGR0dHli5dSkBAAG+99Rbr16/PsoN706ZNWblyJa+99hrBwcHW48WKFePdd9/lzTffxGw2065du4dOO88UHR3NxIkTsVgs2NvbM3Xq1AfWN2LECHr16kWFChXw9vbOsc6aNWvSq1cvAgICsLOzo23btowYMYKQkBDeffddEhMTsVgsjB8/nqpVq+YpThF5chksFovF1kGIiIiIiIiI/FVpKruIiIiIiIiIDSkxFxEREREREbEhJeYiIiIiIiIiNqTEXERERERERMSGlJiLiIiIiIiI2JAScxEREREREREb0veYi4hIofbbb7dtHYLkszJlihMXl2jrMKQAqG+LJvVr0aR+zX/u7qVyPafvMRcRkULtt9jC+0eDq0MqBnOqrcN44hgMBvTnSdGkvi2a1K9F01+pX80GB24n2xf4fR6UmGvEXERECrV+7++1dQh/2JapzTEtGWTr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x2vz5s3s2rWLhIQEunfvXmSScsjYxO6TTz4hMTGRZs2a/amvvxMREREpTDRiLiIihZpGzCUnGjF/MmkErmhSvxZN6tf896ARc7vHGIeIiIiIiIiI3EeJuYiIiIiIiIgNaY25iIgUapWHr7B1CJLPDAYDf3alndmgP3FERKTw0P+1RESkUNM64qKnTJnixGtdo4iI/IVoKruIiIiIiIiIDSkxFxEREREREbEhTWUXEZHCzcE+x8OuDqkYzKmPORjJF0kplHbK+xpzs8GB28k5vw9EREQKAyXmIiJSqPV7f2+Ox7dMbY5pyaDHHI3YQsYGgErMRUSk8NJUdhEREREREREbUmIuIiIiIiIiYkNKzEVERERERERsSIm5iIiIiIiIiA0pMRcRKSAnT56kb9++9OrVi8DAQPbuzdikrEOHDo9UT0REBOfOnfvDcXz33Xf06tWLXr16YTQa+fHHH/9wXY/i/rgnTpz4WO4rIiIiUthoV3YRkQJw69YtJk2axIoVK/D09CQlJYVjx479oboOHz5MjRo18PHxeWhZiyXjK6YMBgMAV65cYeHChaxevZoyZcqQkJDwp5L8R3F/3LNnz34s9xUREREpbJSYi4gUgAMHDtC6dWs8PT0BcHJyokmTJlnKBAcHExQURL169Vi9ejVly5aldevWDB8+3Fpm6dKlbNu2DRcXFzZv3kxoaCiffPIJX331Fenp6QwePJhWrVphNBqpW7cuUVFRLFiwADc3NwB27txJQEAAZcqUAaBkyZI0bNgQs9nMlClTuHz5MnZ2dkyfPh1vb2/8/f1p1qwZR44coVWrVsTFxXH06FFatmzJyJEjWbx4MRcuXOD27dskJiaycOFCPDw86NChAzt27AAyZgSsX78+W9yZZYKDg3FycuLatWskJycTGhqKs7MzM2fO5OTJk9SqVYuIiAh27979GHpKRERExPY0lV1EpABcv36dChUqPPJ1p06dolatWoSFhbF27VpKlizJ66+/zogRIwgNDeXcuXMcOXKEdevWsXbtWhYvXmy9tnHjxnzyySfWpPxBcezbtw8XFxfCw8MZP348ISEhACQlJdGzZ08+//xzwsPDef3119m8eTO7du2yjsY/9dRThIaG0rdvX1atWpVjO0qVKpUl7vvVqVOH0NBQatWqxffff09kZCRXr15lw4YNDBgwgJiYmEd+diIi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nTvHyJEjGT9+vLVst27dmDx5MkFBQdjb2/PBBx8QFhbG0aNHSUtLo2vXro98fxEREZHCyGC5f9hERESkEOk49ossP2+Z2hzTkoE2iib/VR6+gviUh+9BUJSUKVOcuLhEW4chBUB9WzSpX4sm9Wv+c3cvles5TWUXERERERERsSEl5iIiIiIiIiI2pMRcRERERERExIaUmIuIiIiIiIjYkDZ/ExGRQu232Kwb07g6pGIwp9oomvxnNjhwO9ne1mE8VtpwqOhS3xZN6teiSf2a/x60+Zu+Lk1ERAq3tPQsP95KswP+WruYi4iISOGmqewiIiIiIiIiNqTEXERERERERMSGNJVdREQKN4ec118XlbXmf8U15iIiIn81SsxFRKRQ6/f+3hyPb5naHNOSQY85mvxXefgKQIm5iIhIUaap7CIiIiIiIiI2pMRcRERERERExIaUmIuIiIiIiIjYkBJzERERERERERtSYi7yBDKZTAwa9Hg2rdq6dSurV6/OU9nvv/+eLl26MH/+/CzHY2JiGD16NL169SIgIIDFixcXRKjZ3Lp1i+3bt//h68PDw+nWrRtBQUG88cYbuZY7ePAgu3bt+sP3eRw6dOiQ5edly5ZhNBpp3749bdq0wWg0Mm/evDzVZTQauXnz5h+OJSIigunTp//h60VERET+arQru0gRk56ejr19wezgvGfPHqZMmUKjRo2yHB8/fjwDBgzg73//OwDfffddgdz/frdu3WLHjh107NgxT+XvfTYJCQls2rSJLVu2YG9vT1xcXK7XvfDCC/kR7mM1ZMgQhgwZwtatW4mNjaV///62DklEREREcqHEXOQJ9tNPPzFv3jwMBgPNmjVj5MiRWRKtkydPEh4ezpw5c/D39+eFF14gKiqKTp068fXXX5Oeno7JZGLBggX4+Pgwb948Tp48yZ07dxg2bBitW7fO8b5ms5kpU6Zw+fJl7OzsmD59Or/88gv79u0jMjKSXr160blzZwCio6NJTk62JuUAzZs3B2Dv3r2sXLkSgC5dulhH0y9dusTt27e5desWAQEBfPHFFyQlJREaGkpcXByjRo3C09OTX375hf79+9OhQweCg4MJCgqiXr16rF69mrJly3L69GmOHTuG0WhkxIgRuLq6Mnv2bMxmM97e3kybNo1t27Zx8OBBkpOTeemll+jWrRsA9vb2JCYmcvz4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btGjRw++/PLLPF3XcewXOR7fMrU5piUD8zPEh6o8fAXxKc6P9Z5FUZkyxYmLS7R1GFIA1LdFk/q1aFK/5j9391K5ntOIuYiIPBGWL1/O4cOHSUhI4K233rJ1OCIiIiKPjRJzERHJs86dOxdY3SNGjCiwukVERESeZNr8TURERERERMSGlJiLiIiIiIiI2JA2fxMRkULtt9icN6ZxdUjFYE59rLGYDQ7cTrZ/rPcsirThUNGlvi2a1K9Fk/o1/2nzNxERKbrScv6u9FtpdoB2SBcREZEnn6ayi4iIiIiIiNiQEnMRERERERERG9JUdhERKdwcMtZ0P6415VpHLiIiIvlNibmIiBRq/d7fC8CWqc0xLRlU4PerPHwFoMRcRERE8o+msouIiIiIiIjYkBJzERERERERERtSYi4iIiIiIiJiQ0rMRURERERERGxIibmISAExmUwMGlTwm5EBbN26ldWrV+ep7Pfff0+XLl2YP39+luNt2rTBaDQSFBTEsGHDSElJAWDixIl5jqNhw4YYjUb69OnDyJEjuXTp0gPLh4eH57luERERkaJKibmIyBMoPT29wOres2cPU6ZMYezYsVmOFytWjLCwMMLDw6lYsSIHDx4EYPbs2Xmuu3LlyoSFhfHpp58yYMAARowYYU3wc7J+/fo/1ggRERGRIkRflyYiUsB++ukn5s2bh8FgoFmzZowcOZKtW7cSGxtL//79OXnyJOHh4cyZMwd/f39eeOEFoqKi6NSpE19//TXp6emYTCYWLFiAj48P8+bN4+TJk9y5c4dhw4bRunXrHO9rNpuZMmUKly9fxs7OjunTp/PLL7+wb98+IiMj6dWrF507d87x2jt37lCiRAkAOnTowI4dO7h+/TpjxozBxcUFT09PHB0dmTp1aq7trl+/PrVq1eLEiROUKVOGadOmYTabcXV1ZdGiRaxfvx6TyYTRaCQwMJD09HQ2btxIUlISLVq04K233vrzD19ERESkEFBiLiJSwGbPns3HH3+Mh4cHAwcOJCoqKteySUlJdOrUiQkTJrB161acnJyYP38+X331FZs3byY4OJjhw4dTvHhx4uPj6du3b66J+b59+3BxcSE8PJwTJ04QEhLCxx9/TIsWLQgKCqJevXpZyt+9exej0citW7ewt7encePGWc6vWrWKfv360aZNG5YsWcLNmzcf2vYKFSpw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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10, 10))\n",
"litstudy.plot_source_histogram(docs, groups=groups, limit=25, stacked=True);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can even calculate the most popular publication venues for deep learning in our dataset using some simple Panda functions. It appears that \"Neural Computing and Applications\" is the most popular publication venue."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
deep learning related
\n",
"
other
\n",
"
total
\n",
"
ratio
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Neural Computing and Applications
\n",
"
3
\n",
"
3
\n",
"
6
\n",
"
50.000000
\n",
"
\n",
"
\n",
"
Computing
\n",
"
3
\n",
"
12
\n",
"
15
\n",
"
20.000000
\n",
"
\n",
"
\n",
"
IEEE International Symposium on Workload Characterization IISWC
\n",
"
1
\n",
"
4
\n",
"
5
\n",
"
20.000000
\n",
"
\n",
"
\n",
"
Science China Information Sciences
\n",
"
2
\n",
"
8
\n",
"
10
\n",
"
20.000000
\n",
"
\n",
"
\n",
"
IEEE High Performance Extreme Computing Conference HPEC
\n",
"
1
\n",
"
7
\n",
"
8
\n",
"
12.500000
\n",
"
\n",
"
\n",
"
European Physical Journal C
\n",
"
1
\n",
"
7
\n",
"
8
\n",
"
12.500000
\n",
"
\n",
"
\n",
"
Journal of Grid Computing
\n",
"
1
\n",
"
7
\n",
"
8
\n",
"
12.500000
\n",
"
\n",
"
\n",
"
Journal of Computer Science and Technology
\n",
"
3
\n",
"
21
\n",
"
24
\n",
"
12.500000
\n",
"
\n",
"
\n",
"
Multimedia Tools and Applications
\n",
"
3
\n",
"
25
\n",
"
28
\n",
"
10.714286
\n",
"
\n",
"
\n",
"
Journal of Supercomputing
\n",
"
20
\n",
"
205
\n",
"
225
\n",
"
8.888889
\n",
"
\n",
"
\n",
"
BMC Bioinformatics
\n",
"
2
\n",
"
22
\n",
"
24
\n",
"
8.333333
\n",
"
\n",
"
\n",
"
Journal of Big Data
\n",
"
1
\n",
"
11
\n",
"
12
\n",
"
8.333333
\n",
"
\n",
"
\n",
"
Cluster Computing
\n",
"
3
\n",
"
52
\n",
"
55
\n",
"
5.454545
\n",
"
\n",
"
\n",
"
International Journal of Parallel Programming
\n",
"
5
\n",
"
87
\n",
"
92
\n",
"
5.434783
\n",
"
\n",
"
\n",
"
IEEE International Parallel and Distributed Processing Symposium Workshops IPDPSW
\n",
"
1
\n",
"
21
\n",
"
22
\n",
"
4.545455
\n",
"
\n",
"
\n",
"
Journal of Signal Processing Systems
\n",
"
1
\n",
"
42
\n",
"
43
\n",
"
2.325581
\n",
"
\n",
"
\n",
"
Soft Computing
\n",
"
0
\n",
"
16
\n",
"
16
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
BMC Research Notes
\n",
"
0
\n",
"
6
\n",
"
6
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
Journal of the Brazilian Society of Mechanical Sciences and Engineering
\n",
"
0
\n",
"
5
\n",
"
5
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
IEEE International Conference on Cluster Computing CLUSTER
\n",
"
0
\n",
"
5
\n",
"
5
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
IEEE International Symposium on High Performance Computer Architecture HPCA
\n",
"
0
\n",
"
5
\n",
"
5
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
IEEE International Conference on Parallel and Distributed Systems ICPADS
\n",
"
0
\n",
"
5
\n",
"
5
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
Journal of Real Time Image Processing
\n",
"
0
\n",
"
57
\n",
"
57
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
Journal of Scientific Computing
\n",
"
0
\n",
"
5
\n",
"
5
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
Computing and Visualization in Science
\n",
"
0
\n",
"
5
\n",
"
5
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
Visual Computer
\n",
"
0
\n",
"
7
\n",
"
7
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
IEEE ACM International Symposium on Cluster Cloud and Grid Computing CCGrid
\n",
"
0
\n",
"
6
\n",
"
6
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
Euromicro International Conference on Parallel Distributed and Network Based Processing PDP
\n",
"
0
\n",
"
6
\n",
"
6
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
IEEE Transactions on Parallel and Distributed Systems
\n",
"
0
\n",
"
7
\n",
"
7
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
International Conference for High Performance Computing Networking Storage and Analysis SC
\n",
"
0
\n",
"
7
\n",
"
7
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
Frontiers of Computer Science
\n",
"
0
\n",
"
8
\n",
"
8
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
VLDB Journal
\n",
"
0
\n",
"
8
\n",
"
8
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
Computer Science Research and Development
\n",
"
0
\n",
"
10
\n",
"
10
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
IEEE International Parallel and Distributed Processing Symposium IPDPS
\n",
"
0
\n",
"
11
\n",
"
11
\n",
"
0.000000
\n",
"
\n",
"
\n",
"
International Conference on High Performance Computing and Simulation HPCS