mirror of
https://github.com/NVIDIA/cuda-samples.git
synced 2026-10-23 21:28:17 +08:00
add and update samples for CUDA 11.5
This commit is contained in:
18
Samples/dwtHaar1D/.vscode/c_cpp_properties.json
vendored
Normal file
18
Samples/dwtHaar1D/.vscode/c_cpp_properties.json
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Linux",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**",
|
||||
"${workspaceFolder}/../../Common"
|
||||
],
|
||||
"defines": [],
|
||||
"compilerPath": "/usr/local/cuda/bin/nvcc",
|
||||
"cStandard": "gnu17",
|
||||
"cppStandard": "gnu++14",
|
||||
"intelliSenseMode": "linux-gcc-x64",
|
||||
"configurationProvider": "ms-vscode.makefile-tools"
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
||||
7
Samples/dwtHaar1D/.vscode/extensions.json
vendored
Normal file
7
Samples/dwtHaar1D/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"nvidia.nsight-vscode-edition",
|
||||
"ms-vscode.cpptools",
|
||||
"ms-vscode.makefile-tools"
|
||||
]
|
||||
}
|
||||
10
Samples/dwtHaar1D/.vscode/launch.json
vendored
Normal file
10
Samples/dwtHaar1D/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "CUDA C++: Launch",
|
||||
"type": "cuda-gdb",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/dwtHaar1D"
|
||||
}
|
||||
]
|
||||
}
|
||||
15
Samples/dwtHaar1D/.vscode/tasks.json
vendored
Normal file
15
Samples/dwtHaar1D/.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "sample",
|
||||
"type": "shell",
|
||||
"command": "make dbg=1",
|
||||
"problemMatcher": ["$nvcc"],
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
337
Samples/dwtHaar1D/Makefile
Normal file
337
Samples/dwtHaar1D/Makefile
Normal file
@@ -0,0 +1,337 @@
|
||||
################################################################################
|
||||
# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
################################################################################
|
||||
#
|
||||
# Makefile project only supported on Mac OS X and Linux Platforms)
|
||||
#
|
||||
################################################################################
|
||||
|
||||
# Location of the CUDA Toolkit
|
||||
CUDA_PATH ?= /usr/local/cuda
|
||||
|
||||
##############################
|
||||
# start deprecated interface #
|
||||
##############################
|
||||
ifeq ($(x86_64),1)
|
||||
$(info WARNING - x86_64 variable has been deprecated)
|
||||
$(info WARNING - please use TARGET_ARCH=x86_64 instead)
|
||||
TARGET_ARCH ?= x86_64
|
||||
endif
|
||||
ifeq ($(ARMv7),1)
|
||||
$(info WARNING - ARMv7 variable has been deprecated)
|
||||
$(info WARNING - please use TARGET_ARCH=armv7l instead)
|
||||
TARGET_ARCH ?= armv7l
|
||||
endif
|
||||
ifeq ($(aarch64),1)
|
||||
$(info WARNING - aarch64 variable has been deprecated)
|
||||
$(info WARNING - please use TARGET_ARCH=aarch64 instead)
|
||||
TARGET_ARCH ?= aarch64
|
||||
endif
|
||||
ifeq ($(ppc64le),1)
|
||||
$(info WARNING - ppc64le variable has been deprecated)
|
||||
$(info WARNING - please use TARGET_ARCH=ppc64le instead)
|
||||
TARGET_ARCH ?= ppc64le
|
||||
endif
|
||||
ifneq ($(GCC),)
|
||||
$(info WARNING - GCC variable has been deprecated)
|
||||
$(info WARNING - please use HOST_COMPILER=$(GCC) instead)
|
||||
HOST_COMPILER ?= $(GCC)
|
||||
endif
|
||||
ifneq ($(abi),)
|
||||
$(error ERROR - abi variable has been removed)
|
||||
endif
|
||||
############################
|
||||
# end deprecated interface #
|
||||
############################
|
||||
|
||||
# architecture
|
||||
HOST_ARCH := $(shell uname -m)
|
||||
TARGET_ARCH ?= $(HOST_ARCH)
|
||||
ifneq (,$(filter $(TARGET_ARCH),x86_64 aarch64 sbsa ppc64le armv7l))
|
||||
ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
||||
ifneq (,$(filter $(TARGET_ARCH),x86_64 aarch64 sbsa ppc64le))
|
||||
TARGET_SIZE := 64
|
||||
else ifneq (,$(filter $(TARGET_ARCH),armv7l))
|
||||
TARGET_SIZE := 32
|
||||
endif
|
||||
else
|
||||
TARGET_SIZE := $(shell getconf LONG_BIT)
|
||||
endif
|
||||
else
|
||||
$(error ERROR - unsupported value $(TARGET_ARCH) for TARGET_ARCH!)
|
||||
endif
|
||||
|
||||
# sbsa and aarch64 systems look similar. Need to differentiate them at host level for now.
|
||||
ifeq ($(HOST_ARCH),aarch64)
|
||||
ifeq ($(CUDA_PATH)/targets/sbsa-linux,$(shell ls -1d $(CUDA_PATH)/targets/sbsa-linux 2>/dev/null))
|
||||
HOST_ARCH := sbsa
|
||||
TARGET_ARCH := sbsa
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
||||
ifeq (,$(filter $(HOST_ARCH)-$(TARGET_ARCH),aarch64-armv7l x86_64-armv7l x86_64-aarch64 x86_64-sbsa x86_64-ppc64le))
|
||||
$(error ERROR - cross compiling from $(HOST_ARCH) to $(TARGET_ARCH) is not supported!)
|
||||
endif
|
||||
endif
|
||||
|
||||
# When on native aarch64 system with userspace of 32-bit, change TARGET_ARCH to armv7l
|
||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_SIZE),aarch64-aarch64-32)
|
||||
TARGET_ARCH = armv7l
|
||||
endif
|
||||
|
||||
# operating system
|
||||
HOST_OS := $(shell uname -s 2>/dev/null | tr "[:upper:]" "[:lower:]")
|
||||
TARGET_OS ?= $(HOST_OS)
|
||||
ifeq (,$(filter $(TARGET_OS),linux darwin qnx android))
|
||||
$(error ERROR - unsupported value $(TARGET_OS) for TARGET_OS!)
|
||||
endif
|
||||
|
||||
# host compiler
|
||||
ifeq ($(TARGET_OS),darwin)
|
||||
ifeq ($(shell expr `xcodebuild -version | grep -i xcode | awk '{print $$2}' | cut -d'.' -f1` \>= 5),1)
|
||||
HOST_COMPILER ?= clang++
|
||||
endif
|
||||
else ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
||||
ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-armv7l)
|
||||
ifeq ($(TARGET_OS),linux)
|
||||
HOST_COMPILER ?= arm-linux-gnueabihf-g++
|
||||
else ifeq ($(TARGET_OS),qnx)
|
||||
ifeq ($(QNX_HOST),)
|
||||
$(error ERROR - QNX_HOST must be passed to the QNX host toolchain)
|
||||
endif
|
||||
ifeq ($(QNX_TARGET),)
|
||||
$(error ERROR - QNX_TARGET must be passed to the QNX target toolchain)
|
||||
endif
|
||||
export QNX_HOST
|
||||
export QNX_TARGET
|
||||
HOST_COMPILER ?= $(QNX_HOST)/usr/bin/arm-unknown-nto-qnx6.6.0eabi-g++
|
||||
else ifeq ($(TARGET_OS),android)
|
||||
HOST_COMPILER ?= arm-linux-androideabi-g++
|
||||
endif
|
||||
else ifeq ($(TARGET_ARCH),aarch64)
|
||||
ifeq ($(TARGET_OS), linux)
|
||||
HOST_COMPILER ?= aarch64-linux-gnu-g++
|
||||
else ifeq ($(TARGET_OS),qnx)
|
||||
ifeq ($(QNX_HOST),)
|
||||
$(error ERROR - QNX_HOST must be passed to the QNX host toolchain)
|
||||
endif
|
||||
ifeq ($(QNX_TARGET),)
|
||||
$(error ERROR - QNX_TARGET must be passed to the QNX target toolchain)
|
||||
endif
|
||||
export QNX_HOST
|
||||
export QNX_TARGET
|
||||
HOST_COMPILER ?= $(QNX_HOST)/usr/bin/q++
|
||||
else ifeq ($(TARGET_OS), android)
|
||||
HOST_COMPILER ?= aarch64-linux-android-clang++
|
||||
endif
|
||||
else ifeq ($(TARGET_ARCH),sbsa)
|
||||
HOST_COMPILER ?= aarch64-linux-gnu-g++
|
||||
else ifeq ($(TARGET_ARCH),ppc64le)
|
||||
HOST_COMPILER ?= powerpc64le-linux-gnu-g++
|
||||
endif
|
||||
endif
|
||||
HOST_COMPILER ?= g++
|
||||
NVCC := $(CUDA_PATH)/bin/nvcc -ccbin $(HOST_COMPILER)
|
||||
|
||||
# internal flags
|
||||
NVCCFLAGS := -m${TARGET_SIZE}
|
||||
CCFLAGS :=
|
||||
LDFLAGS :=
|
||||
|
||||
# build flags
|
||||
ifeq ($(TARGET_OS),darwin)
|
||||
LDFLAGS += -rpath $(CUDA_PATH)/lib
|
||||
CCFLAGS += -arch $(HOST_ARCH)
|
||||
else ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-armv7l-linux)
|
||||
LDFLAGS += --dynamic-linker=/lib/ld-linux-armhf.so.3
|
||||
CCFLAGS += -mfloat-abi=hard
|
||||
else ifeq ($(TARGET_OS),android)
|
||||
LDFLAGS += -pie
|
||||
CCFLAGS += -fpie -fpic -fexceptions
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_ARCH),$(HOST_ARCH))
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux)
|
||||
ifneq ($(TARGET_FS),)
|
||||
GCCVERSIONLTEQ46 := $(shell expr `$(HOST_COMPILER) -dumpversion` \<= 4.6)
|
||||
ifeq ($(GCCVERSIONLTEQ46),1)
|
||||
CCFLAGS += --sysroot=$(TARGET_FS)
|
||||
endif
|
||||
LDFLAGS += --sysroot=$(TARGET_FS)
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/lib
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/arm-linux-gnueabihf
|
||||
endif
|
||||
endif
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux)
|
||||
ifneq ($(TARGET_FS),)
|
||||
GCCVERSIONLTEQ46 := $(shell expr `$(HOST_COMPILER) -dumpversion` \<= 4.6)
|
||||
ifeq ($(GCCVERSIONLTEQ46),1)
|
||||
CCFLAGS += --sysroot=$(TARGET_FS)
|
||||
endif
|
||||
LDFLAGS += --sysroot=$(TARGET_FS)
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/lib -L$(TARGET_FS)/lib
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/lib/aarch64-linux-gnu -L$(TARGET_FS)/lib/aarch64-linux-gnu
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib -L$(TARGET_FS)/usr/lib
|
||||
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/aarch64-linux-gnu -L$(TARGET_FS)/usr/lib/aarch64-linux-gnu
|
||||
LDFLAGS += --unresolved-symbols=ignore-in-shared-libs
|
||||
CCFLAGS += -isystem=$(TARGET_FS)/usr/include -I$(TARGET_FS)/usr/include -I$(TARGET_FS)/usr/include/libdrm
|
||||
CCFLAGS += -isystem=$(TARGET_FS)/usr/include/aarch64-linux-gnu -I$(TARGET_FS)/usr/include/aarch64-linux-gnu
|
||||
endif
|
||||
endif
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx)
|
||||
NVCCFLAGS += --qpp-config 5.4.0,gcc_ntoaarch64le
|
||||
CCFLAGS += -DWIN_INTERFACE_CUSTOM -I/usr/include/aarch64-qnx-gnu
|
||||
LDFLAGS += -lsocket
|
||||
LDFLAGS += -L/usr/lib/aarch64-qnx-gnu
|
||||
CCFLAGS += "-Wl\,-rpath-link\,/usr/lib/aarch64-qnx-gnu"
|
||||
ifdef TARGET_OVERRIDE
|
||||
LDFLAGS += -lslog2
|
||||
endif
|
||||
|
||||
ifneq ($(TARGET_FS),)
|
||||
LDFLAGS += -L$(TARGET_FS)/usr/lib
|
||||
CCFLAGS += "-Wl\,-rpath-link\,$(TARGET_FS)/usr/lib"
|
||||
LDFLAGS += -L$(TARGET_FS)/usr/libnvidia
|
||||
CCFLAGS += "-Wl\,-rpath-link\,$(TARGET_FS)/usr/libnvidia"
|
||||
CCFLAGS += -I$(TARGET_FS)/../include
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef TARGET_OVERRIDE # cuda toolkit targets override
|
||||
NVCCFLAGS += -target-dir $(TARGET_OVERRIDE)
|
||||
endif
|
||||
|
||||
# Install directory of different arch
|
||||
CUDA_INSTALL_TARGET_DIR :=
|
||||
ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/armv7-linux-gnueabihf/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/aarch64-linux/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),sbsa-linux)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/sbsa-linux/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-android)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/armv7-linux-androideabi/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-android)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/aarch64-linux-androideabi/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-qnx)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/ARMv7-linux-QNX/
|
||||
else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/aarch64-qnx/
|
||||
else ifeq ($(TARGET_ARCH),ppc64le)
|
||||
CUDA_INSTALL_TARGET_DIR = targets/ppc64le-linux/
|
||||
endif
|
||||
|
||||
# Debug build flags
|
||||
ifeq ($(dbg),1)
|
||||
NVCCFLAGS += -g -G
|
||||
BUILD_TYPE := debug
|
||||
else
|
||||
BUILD_TYPE := release
|
||||
endif
|
||||
|
||||
ALL_CCFLAGS :=
|
||||
ALL_CCFLAGS += $(NVCCFLAGS)
|
||||
ALL_CCFLAGS += $(EXTRA_NVCCFLAGS)
|
||||
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(CCFLAGS))
|
||||
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(EXTRA_CCFLAGS))
|
||||
|
||||
SAMPLE_ENABLED := 1
|
||||
|
||||
ALL_LDFLAGS :=
|
||||
ALL_LDFLAGS += $(ALL_CCFLAGS)
|
||||
ALL_LDFLAGS += $(addprefix -Xlinker ,$(LDFLAGS))
|
||||
ALL_LDFLAGS += $(addprefix -Xlinker ,$(EXTRA_LDFLAGS))
|
||||
|
||||
# Common includes and paths for CUDA
|
||||
INCLUDES := -I../../Common
|
||||
LIBRARIES :=
|
||||
|
||||
################################################################################
|
||||
|
||||
# Gencode arguments
|
||||
ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),armv7l aarch64))
|
||||
SMS ?= 35 37 50 52 60 61 70 72 75 80 86
|
||||
else
|
||||
SMS ?= 35 37 50 52 60 61 70 75 80 86
|
||||
endif
|
||||
|
||||
ifeq ($(SMS),)
|
||||
$(info >>> WARNING - no SM architectures have been specified - waiving sample <<<)
|
||||
SAMPLE_ENABLED := 0
|
||||
endif
|
||||
|
||||
ifeq ($(GENCODE_FLAGS),)
|
||||
# Generate SASS code for each SM architecture listed in $(SMS)
|
||||
$(foreach sm,$(SMS),$(eval GENCODE_FLAGS += -gencode arch=compute_$(sm),code=sm_$(sm)))
|
||||
|
||||
# Generate PTX code from the highest SM architecture in $(SMS) to guarantee forward-compatibility
|
||||
HIGHEST_SM := $(lastword $(sort $(SMS)))
|
||||
ifneq ($(HIGHEST_SM),)
|
||||
GENCODE_FLAGS += -gencode arch=compute_$(HIGHEST_SM),code=compute_$(HIGHEST_SM)
|
||||
endif
|
||||
endif
|
||||
|
||||
ALL_CCFLAGS += --threads 0 --std=c++11
|
||||
|
||||
ifeq ($(SAMPLE_ENABLED),0)
|
||||
EXEC ?= @echo "[@]"
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
|
||||
# Target rules
|
||||
all: build
|
||||
|
||||
build: dwtHaar1D
|
||||
|
||||
check.deps:
|
||||
ifeq ($(SAMPLE_ENABLED),0)
|
||||
@echo "Sample will be waived due to the above missing dependencies"
|
||||
else
|
||||
@echo "Sample is ready - all dependencies have been met"
|
||||
endif
|
||||
|
||||
dwtHaar1D.o:dwtHaar1D.cu
|
||||
$(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<
|
||||
|
||||
dwtHaar1D: dwtHaar1D.o
|
||||
$(EXEC) $(NVCC) $(ALL_LDFLAGS) $(GENCODE_FLAGS) -o $@ $+ $(LIBRARIES)
|
||||
$(EXEC) mkdir -p ../../bin/$(TARGET_ARCH)/$(TARGET_OS)/$(BUILD_TYPE)
|
||||
$(EXEC) cp $@ ../../bin/$(TARGET_ARCH)/$(TARGET_OS)/$(BUILD_TYPE)
|
||||
|
||||
run: build
|
||||
$(EXEC) ./dwtHaar1D
|
||||
|
||||
clean:
|
||||
rm -f dwtHaar1D dwtHaar1D.o
|
||||
rm -rf ../../bin/$(TARGET_ARCH)/$(TARGET_OS)/$(BUILD_TYPE)/dwtHaar1D
|
||||
|
||||
clobber: clean
|
||||
67
Samples/dwtHaar1D/NsightEclipse.xml
Normal file
67
Samples/dwtHaar1D/NsightEclipse.xml
Normal file
@@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE entry SYSTEM "SamplesInfo.dtd">
|
||||
<entry>
|
||||
<name>dwtHaar1D</name>
|
||||
<description><![CDATA[Discrete Haar wavelet decomposition for 1D signals with a length which is a power of 2.]]></description>
|
||||
<devicecompilation>whole</devicecompilation>
|
||||
<includepaths>
|
||||
<path>./</path>
|
||||
<path>../</path>
|
||||
<path>../../Common</path>
|
||||
</includepaths>
|
||||
<keyconcepts>
|
||||
<concept level="advanced">Image Processing</concept>
|
||||
<concept level="advanced">Video Compression</concept>
|
||||
</keyconcepts>
|
||||
<keywords>
|
||||
</keywords>
|
||||
<libraries>
|
||||
</libraries>
|
||||
<librarypaths>
|
||||
</librarypaths>
|
||||
<nsight_eclipse>true</nsight_eclipse>
|
||||
<primary_file>dwtHaar1D.cu</primary_file>
|
||||
<scopes>
|
||||
<scope>1:CUDA Advanced Topics</scope>
|
||||
<scope>2:Image Processing</scope>
|
||||
<scope>2:Data Compression</scope>
|
||||
<scope>2:Video Codecs</scope>
|
||||
<scope>2:Computer Vision</scope>
|
||||
</scopes>
|
||||
<sm-arch>sm35</sm-arch>
|
||||
<sm-arch>sm37</sm-arch>
|
||||
<sm-arch>sm50</sm-arch>
|
||||
<sm-arch>sm52</sm-arch>
|
||||
<sm-arch>sm60</sm-arch>
|
||||
<sm-arch>sm61</sm-arch>
|
||||
<sm-arch>sm70</sm-arch>
|
||||
<sm-arch>sm72</sm-arch>
|
||||
<sm-arch>sm75</sm-arch>
|
||||
<sm-arch>sm80</sm-arch>
|
||||
<sm-arch>sm86</sm-arch>
|
||||
<supported_envs>
|
||||
<env>
|
||||
<arch>x86_64</arch>
|
||||
<platform>linux</platform>
|
||||
</env>
|
||||
<env>
|
||||
<platform>windows7</platform>
|
||||
</env>
|
||||
<env>
|
||||
<arch>x86_64</arch>
|
||||
<platform>macosx</platform>
|
||||
</env>
|
||||
<env>
|
||||
<arch>arm</arch>
|
||||
</env>
|
||||
<env>
|
||||
<arch>ppc64le</arch>
|
||||
<platform>linux</platform>
|
||||
</env>
|
||||
</supported_envs>
|
||||
<supported_sm_architectures>
|
||||
<include>all</include>
|
||||
</supported_sm_architectures>
|
||||
<title>1D Discrete Haar Wavelet Decomposition</title>
|
||||
<type>exe</type>
|
||||
</entry>
|
||||
67
Samples/dwtHaar1D/README.md
Normal file
67
Samples/dwtHaar1D/README.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# dwtHaar1D - 1D Discrete Haar Wavelet Decomposition
|
||||
|
||||
## Description
|
||||
|
||||
Discrete Haar wavelet decomposition for 1D signals with a length which is a power of 2.
|
||||
|
||||
## Key Concepts
|
||||
|
||||
Image Processing, Video Compression
|
||||
|
||||
## Supported SM Architectures
|
||||
|
||||
[SM 3.5 ](https://developer.nvidia.com/cuda-gpus) [SM 3.7 ](https://developer.nvidia.com/cuda-gpus) [SM 5.0 ](https://developer.nvidia.com/cuda-gpus) [SM 5.2 ](https://developer.nvidia.com/cuda-gpus) [SM 6.0 ](https://developer.nvidia.com/cuda-gpus) [SM 6.1 ](https://developer.nvidia.com/cuda-gpus) [SM 7.0 ](https://developer.nvidia.com/cuda-gpus) [SM 7.2 ](https://developer.nvidia.com/cuda-gpus) [SM 7.5 ](https://developer.nvidia.com/cuda-gpus) [SM 8.0 ](https://developer.nvidia.com/cuda-gpus) [SM 8.6 ](https://developer.nvidia.com/cuda-gpus)
|
||||
|
||||
## Supported OSes
|
||||
|
||||
Linux, Windows
|
||||
|
||||
## Supported CPU Architecture
|
||||
|
||||
x86_64, ppc64le, armv7l
|
||||
|
||||
## CUDA APIs involved
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Download and install the [CUDA Toolkit 11.5](https://developer.nvidia.com/cuda-downloads) for your corresponding platform.
|
||||
|
||||
## Build and Run
|
||||
|
||||
### Windows
|
||||
The Windows samples are built using the Visual Studio IDE. Solution files (.sln) are provided for each supported version of Visual Studio, using the format:
|
||||
```
|
||||
*_vs<version>.sln - for Visual Studio <version>
|
||||
```
|
||||
Each individual sample has its own set of solution files in its directory:
|
||||
|
||||
To build/examine all the samples at once, the complete solution files should be used. To build/examine a single sample, the individual sample solution files should be used.
|
||||
> **Note:** Some samples require that the Microsoft DirectX SDK (June 2010 or newer) be installed and that the VC++ directory paths are properly set up (**Tools > Options...**). Check DirectX Dependencies section for details."
|
||||
|
||||
### Linux
|
||||
The Linux samples are built using makefiles. To use the makefiles, change the current directory to the sample directory you wish to build, and run make:
|
||||
```
|
||||
$ cd <sample_dir>
|
||||
$ make
|
||||
```
|
||||
The samples makefiles can take advantage of certain options:
|
||||
* **TARGET_ARCH=<arch>** - cross-compile targeting a specific architecture. Allowed architectures are x86_64, ppc64le, armv7l.
|
||||
By default, TARGET_ARCH is set to HOST_ARCH. On a x86_64 machine, not setting TARGET_ARCH is the equivalent of setting TARGET_ARCH=x86_64.<br/>
|
||||
`$ make TARGET_ARCH=x86_64` <br/> `$ make TARGET_ARCH=ppc64le` <br/> `$ make TARGET_ARCH=armv7l` <br/>
|
||||
See [here](http://docs.nvidia.com/cuda/cuda-samples/index.html#cross-samples) for more details.
|
||||
* **dbg=1** - build with debug symbols
|
||||
```
|
||||
$ make dbg=1
|
||||
```
|
||||
* **SMS="A B ..."** - override the SM architectures for which the sample will be built, where `"A B ..."` is a space-delimited list of SM architectures. For example, to generate SASS for SM 50 and SM 60, use `SMS="50 60"`.
|
||||
```
|
||||
$ make SMS="50 60"
|
||||
```
|
||||
|
||||
* **HOST_COMPILER=<host_compiler>** - override the default g++ host compiler. See the [Linux Installation Guide](http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#system-requirements) for a list of supported host compilers.
|
||||
```
|
||||
$ make HOST_COMPILER=g++
|
||||
```
|
||||
|
||||
## References (for more details)
|
||||
|
||||
4096
Samples/dwtHaar1D/data/regression.gold.dat
Normal file
4096
Samples/dwtHaar1D/data/regression.gold.dat
Normal file
File diff suppressed because it is too large
Load Diff
16384
Samples/dwtHaar1D/data/regression_2_14.gold.dat
Normal file
16384
Samples/dwtHaar1D/data/regression_2_14.gold.dat
Normal file
File diff suppressed because it is too large
Load Diff
262144
Samples/dwtHaar1D/data/regression_2_18.gold.dat
Normal file
262144
Samples/dwtHaar1D/data/regression_2_18.gold.dat
Normal file
File diff suppressed because it is too large
Load Diff
4096
Samples/dwtHaar1D/data/signal.dat
Normal file
4096
Samples/dwtHaar1D/data/signal.dat
Normal file
File diff suppressed because it is too large
Load Diff
16384
Samples/dwtHaar1D/data/signal_2_14.dat
Normal file
16384
Samples/dwtHaar1D/data/signal_2_14.dat
Normal file
File diff suppressed because it is too large
Load Diff
262144
Samples/dwtHaar1D/data/signal_2_18.dat
Normal file
262144
Samples/dwtHaar1D/data/signal_2_18.dat
Normal file
File diff suppressed because it is too large
Load Diff
389
Samples/dwtHaar1D/dwtHaar1D.cu
Normal file
389
Samples/dwtHaar1D/dwtHaar1D.cu
Normal file
@@ -0,0 +1,389 @@
|
||||
/* Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 1D DWT for Haar wavelet and signals with a length which is a power of 2.
|
||||
* The code reduces bank conflicts and non-coalesced reads / writes as
|
||||
* appropriate but does not fully remove them because the computational
|
||||
* overhead to achieve this would outweighs the benefit (see inline comments
|
||||
* for more details).
|
||||
* Large signals are subdivided into sub-signals with 512 elements and the
|
||||
* wavelet transform for these is computed with one block over 10 decomposition
|
||||
* levels. The resulting signal consisting of the approximation coefficients at
|
||||
* level X is then processed in a subsequent step on the device. This requires
|
||||
* interblock synchronization which is only possible on host side.
|
||||
* Detail coefficients which have been computed are not further referenced
|
||||
* during the decomposition so that they can be stored directly in their final
|
||||
* position in global memory. The transform and its storing scheme preserve
|
||||
* locality in the coefficients so that these writes are coalesced.
|
||||
* Approximation coefficients are stored in shared memory because they are
|
||||
* needed to compute the subsequent decomposition step. The top most
|
||||
* approximation coefficient for a sub-signal processed by one block is stored
|
||||
* in a special global memory location to simplify the processing after the
|
||||
* interblock synchronization.
|
||||
* Most books on wavelets explain the Haar wavelet decomposition. A good freely
|
||||
* available resource is the Wavelet primer by Stollnitz et al.
|
||||
* http://grail.cs.washington.edu/projects/wavelets/article/wavelet1.pdf
|
||||
* http://grail.cs.washington.edu/projects/wavelets/article/wavelet2.pdf
|
||||
* The basic of all Wavelet transforms is to decompose a signal into
|
||||
* approximation (a) and detail (d) coefficients where the detail tends to be
|
||||
* small or zero which allows / simplifies compression. The following "graphs"
|
||||
* demonstrate the transform for a signal
|
||||
* of length eight. The index always describes the decomposition level where
|
||||
* a coefficient arises. The input signal is interpreted as approximation signal
|
||||
* at level 0. The coefficients computed on the device are stored in the same
|
||||
* scheme as in the example. This data structure is particularly well suited for
|
||||
* compression and also preserves the hierarchical structure of the
|
||||
decomposition.
|
||||
|
||||
-------------------------------------------------
|
||||
| a_0 | a_0 | a_0 | a_0 | a_0 | a_0 | a_0 | a_0 |
|
||||
-------------------------------------------------
|
||||
|
||||
-------------------------------------------------
|
||||
| a_1 | a_1 | a_1 | a_1 | d_1 | d_1 | d_1 | d_1 |
|
||||
-------------------------------------------------
|
||||
|
||||
-------------------------------------------------
|
||||
| a_2 | a_2 | d_2 | d_2 | d_1 | d_1 | d_1 | d_1 |
|
||||
-------------------------------------------------
|
||||
|
||||
-------------------------------------------------
|
||||
| a_3 | d_3 | d_2 | d_2 | d_1 | d_1 | d_1 | d_1 |
|
||||
-------------------------------------------------
|
||||
|
||||
* Host code.
|
||||
*/
|
||||
|
||||
#ifdef _WIN32
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
|
||||
// includes, system
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
|
||||
// includes, project
|
||||
#include <helper_functions.h>
|
||||
#include <helper_cuda.h>
|
||||
|
||||
// constants which are used in host and device code
|
||||
#define INV_SQRT_2 0.70710678118654752440f;
|
||||
const unsigned int LOG_NUM_BANKS = 4;
|
||||
const unsigned int NUM_BANKS = 16;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// includes, kernels
|
||||
#include "dwtHaar1D_kernel.cuh"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// declaration, forward
|
||||
void runTest(int argc, char **argv);
|
||||
bool getLevels(unsigned int len, unsigned int *levels);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Program main
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
int main(int argc, char **argv) {
|
||||
// run test
|
||||
runTest(argc, argv);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//! Perform the wavelet decomposition
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void runTest(int argc, char **argv) {
|
||||
bool bResult = false; // flag for final validation of the results
|
||||
|
||||
char *s_fname = NULL, *r_gold_fname = NULL;
|
||||
char r_fname[256];
|
||||
const char usage[] = {
|
||||
"\nUsage:\n"
|
||||
" dwtHaar1D --signal=<signal_file> --result=<result_file> "
|
||||
"--gold=<gold_file>\n\n"
|
||||
" <signal_file> Input file containing the signal\n"
|
||||
" <result_file> Output file storing the result of the wavelet "
|
||||
"decomposition\n"
|
||||
" <gold_file> Input file containing the reference result of the "
|
||||
"wavelet decomposition\n"
|
||||
"\nExample:\n"
|
||||
" ./dwtHaar1D\n"
|
||||
" --signal=signal.dat\n"
|
||||
" --result=result.dat\n"
|
||||
" --gold=regression.gold.dat\n"};
|
||||
|
||||
printf("%s Starting...\n\n", argv[0]);
|
||||
|
||||
// use command-line specified CUDA device, otherwise use device with highest
|
||||
// Gflops/s
|
||||
findCudaDevice(argc, (const char **)argv);
|
||||
|
||||
// file names, either specified as cmd line args or use default
|
||||
if (argc == 4) {
|
||||
char *tmp_sfname, *tmp_rfname, *tmp_goldfname;
|
||||
|
||||
if ((getCmdLineArgumentString(argc, (const char **)argv, "signal",
|
||||
&tmp_sfname) != true) ||
|
||||
(getCmdLineArgumentString(argc, (const char **)argv, "result",
|
||||
&tmp_rfname) != true) ||
|
||||
(getCmdLineArgumentString(argc, (const char **)argv, "gold",
|
||||
&tmp_goldfname) != true)) {
|
||||
fprintf(stderr, "Invalid input syntax.\n%s", usage);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
s_fname = sdkFindFilePath(tmp_sfname, argv[0]);
|
||||
r_gold_fname = sdkFindFilePath(tmp_goldfname, argv[0]);
|
||||
strcpy(r_fname, tmp_rfname);
|
||||
} else {
|
||||
s_fname = sdkFindFilePath("signal.dat", argv[0]);
|
||||
r_gold_fname = sdkFindFilePath("regression.gold.dat", argv[0]);
|
||||
strcpy(r_fname, "result.dat");
|
||||
}
|
||||
|
||||
printf("source file = \"%s\"\n", s_fname);
|
||||
printf("reference file = \"%s\"\n", r_fname);
|
||||
printf("gold file = \"%s\"\n", r_gold_fname);
|
||||
|
||||
// read in signal
|
||||
unsigned int slength = 0;
|
||||
float *signal = NULL;
|
||||
|
||||
if (s_fname == NULL) {
|
||||
fprintf(stderr, "Cannot find the file containing the signal.\n%s", usage);
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (sdkReadFile(s_fname, &signal, &slength, false) == true) {
|
||||
printf("Reading signal from \"%s\"\n", s_fname);
|
||||
} else {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// get the number of decompositions necessary to perform a full decomposition
|
||||
unsigned int dlevels_complete = 0;
|
||||
|
||||
if (true != getLevels(slength, &dlevels_complete)) {
|
||||
// error message
|
||||
fprintf(stderr, "Signal length not supported.\n");
|
||||
// cleanup and abort
|
||||
free(signal);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// device in data
|
||||
float *d_idata = NULL;
|
||||
// device out data
|
||||
float *d_odata = NULL;
|
||||
// device approx_final data
|
||||
float *approx_final = NULL;
|
||||
// The very final approximation coefficient has to be written to the output
|
||||
// data, all others are reused as input data in the next global step and
|
||||
// therefore have to be written to the input data again.
|
||||
// The following flag indicates where to copy approx_final data
|
||||
// - 0 is input, 1 is output
|
||||
int approx_is_input;
|
||||
|
||||
// allocate device mem
|
||||
const unsigned int smem_size = sizeof(float) * slength;
|
||||
checkCudaErrors(cudaMalloc((void **)&d_idata, smem_size));
|
||||
checkCudaErrors(cudaMalloc((void **)&d_odata, smem_size));
|
||||
checkCudaErrors(cudaMalloc((void **)&approx_final, smem_size));
|
||||
// copy input data to device
|
||||
checkCudaErrors(
|
||||
cudaMemcpy(d_idata, signal, smem_size, cudaMemcpyHostToDevice));
|
||||
|
||||
// total number of threads
|
||||
// in the first decomposition step always one thread computes the average and
|
||||
// detail signal for one pair of adjacent values
|
||||
unsigned int num_threads_total_left = slength / 2;
|
||||
// decomposition levels performed in the current / next step
|
||||
unsigned int dlevels_step = dlevels_complete;
|
||||
|
||||
// 1D signal so the arrangement of elements is also 1D
|
||||
dim3 block_size;
|
||||
dim3 grid_size;
|
||||
|
||||
// number of decomposition levels left after one iteration on the device
|
||||
unsigned int dlevels_left = dlevels_complete;
|
||||
|
||||
// if less or equal 1k elements, then the data can be processed in one block,
|
||||
// this avoids the Wait-For-Idle (WFI) on host side which is necessary if the
|
||||
// computation is split across multiple SM's if enough input data
|
||||
if (dlevels_complete <= 10) {
|
||||
// decomposition can be performed at once
|
||||
block_size.x = num_threads_total_left;
|
||||
approx_is_input = 0;
|
||||
} else {
|
||||
// 512 threads per block
|
||||
grid_size.x = (num_threads_total_left / 512);
|
||||
block_size.x = 512;
|
||||
|
||||
// 512 threads corresponds to 10 decomposition steps
|
||||
dlevels_step = 10;
|
||||
dlevels_left -= 10;
|
||||
|
||||
approx_is_input = 1;
|
||||
}
|
||||
|
||||
// Initialize d_odata to 0.0f
|
||||
initValue<<<grid_size, block_size>>>(d_odata, 0.0f);
|
||||
|
||||
// do until full decomposition is accomplished
|
||||
while (0 != num_threads_total_left) {
|
||||
// double the number of threads as bytes
|
||||
unsigned int mem_shared = (2 * block_size.x) * sizeof(float);
|
||||
// extra memory requirements to avoid bank conflicts
|
||||
mem_shared += ((2 * block_size.x) / NUM_BANKS) * sizeof(float);
|
||||
|
||||
// run kernel
|
||||
dwtHaar1D<<<grid_size, block_size, mem_shared>>>(
|
||||
d_idata, d_odata, approx_final, dlevels_step, num_threads_total_left,
|
||||
block_size.x);
|
||||
|
||||
// Copy approx_final to appropriate location
|
||||
if (approx_is_input) {
|
||||
checkCudaErrors(cudaMemcpy(d_idata, approx_final, grid_size.x * 4,
|
||||
cudaMemcpyDeviceToDevice));
|
||||
} else {
|
||||
checkCudaErrors(cudaMemcpy(d_odata, approx_final, grid_size.x * 4,
|
||||
cudaMemcpyDeviceToDevice));
|
||||
}
|
||||
|
||||
// update level variables
|
||||
if (dlevels_left < 10) {
|
||||
// approx_final = d_odata;
|
||||
approx_is_input = 0;
|
||||
}
|
||||
|
||||
// more global steps necessary
|
||||
dlevels_step = (dlevels_left > 10) ? dlevels_left - 10 : dlevels_left;
|
||||
dlevels_left -= 10;
|
||||
|
||||
// after each step only half the threads are used any longer
|
||||
// therefore after 10 steps 2^10 less threads
|
||||
num_threads_total_left = num_threads_total_left >> 10;
|
||||
|
||||
// update block and grid size
|
||||
grid_size.x =
|
||||
(num_threads_total_left / 512) + (0 != (num_threads_total_left % 512))
|
||||
? 1
|
||||
: 0;
|
||||
|
||||
if (grid_size.x <= 1) {
|
||||
block_size.x = num_threads_total_left;
|
||||
}
|
||||
}
|
||||
|
||||
// get the result back from the server
|
||||
// allocate mem for the result
|
||||
float *odata = (float *)malloc(smem_size);
|
||||
checkCudaErrors(
|
||||
cudaMemcpy(odata, d_odata, smem_size, cudaMemcpyDeviceToHost));
|
||||
|
||||
// post processing
|
||||
// write file for regression test
|
||||
if (r_fname == NULL) {
|
||||
fprintf(stderr,
|
||||
"Cannot write the output file storing the result of the wavelet "
|
||||
"decomposition.\n%s",
|
||||
usage);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (sdkWriteFile(r_fname, odata, slength, 0.001f, false) == true) {
|
||||
printf("Writing result to \"%s\"\n", r_fname);
|
||||
} else {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// load the reference solution
|
||||
unsigned int len_reference = 0;
|
||||
float *reference = NULL;
|
||||
|
||||
if (r_gold_fname == NULL) {
|
||||
fprintf(stderr,
|
||||
"Cannot read the file containing the reference result of the "
|
||||
"wavelet decomposition.\n%s",
|
||||
usage);
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (sdkReadFile(r_gold_fname, &reference, &len_reference, false) == true) {
|
||||
printf("Reading reference result from \"%s\"\n", r_gold_fname);
|
||||
} else {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
assert(slength == len_reference);
|
||||
|
||||
// compare the computed solution and the reference
|
||||
bResult = (bool)sdkCompareL2fe(reference, odata, slength, 0.001f);
|
||||
free(reference);
|
||||
|
||||
// free allocated host and device memory
|
||||
checkCudaErrors(cudaFree(d_odata));
|
||||
checkCudaErrors(cudaFree(d_idata));
|
||||
checkCudaErrors(cudaFree(approx_final));
|
||||
|
||||
free(signal);
|
||||
free(odata);
|
||||
free(s_fname);
|
||||
free(r_gold_fname);
|
||||
|
||||
printf(bResult ? "Test success!\n" : "Test failure!\n");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//! Get number of decomposition levels to perform a full decomposition
|
||||
//! Also check if the input signal size is suitable
|
||||
//! @return true if the number of decomposition levels could be determined
|
||||
//! and the signal length is supported by the implementation,
|
||||
//! otherwise false
|
||||
//! @param len length of input signal
|
||||
//! @param levels number of decomposition levels necessary to perform a full
|
||||
//! decomposition
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
bool getLevels(unsigned int len, unsigned int *levels) {
|
||||
bool retval = false;
|
||||
|
||||
// currently signals up to a length of 2^20 supported
|
||||
for (unsigned int i = 0; i < 20; ++i) {
|
||||
if (len == (1 << i)) {
|
||||
*levels = i;
|
||||
retval = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
244
Samples/dwtHaar1D/dwtHaar1D_kernel.cuh
Normal file
244
Samples/dwtHaar1D/dwtHaar1D_kernel.cuh
Normal file
@@ -0,0 +1,244 @@
|
||||
/* Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 1D DWT for Haar wavelet and signals with a length which is a power of 2.
|
||||
* The code reduces bank conflicts and non-coalesced reads / writes as
|
||||
* appropriate but does not fully remove them because the computational
|
||||
* overhead to achieve this would outweighs the benefit (see inline comments
|
||||
* for more details).
|
||||
* Large signals are subdivided into sub-signals with 512 elements and the
|
||||
* wavelet transform for these is computed with one block over 10 decomposition
|
||||
* levels. The resulting signal consisting of the approximation coefficients at
|
||||
* level X is then processed in a subsequent step on the device. This requires
|
||||
* interblock synchronization which is only possible on host side.
|
||||
* Detail coefficients which have been computed are not further referenced
|
||||
* during the decomposition so that they can be stored directly in their final
|
||||
* position in global memory. The transform and its storing scheme preserve
|
||||
* locality in the coefficients so that these writes are coalesced.
|
||||
* Approximation coefficients are stored in shared memory because they are
|
||||
* needed to compute the subsequent decomposition step. The top most
|
||||
* approximation coefficient for a sub-signal processed by one block is stored
|
||||
* in a special global memory location to simplify the processing after the
|
||||
* interblock synchronization.
|
||||
* Most books on wavelets explain the Haar wavelet decomposition. A good freely
|
||||
* available resource is the Wavelet primer by Stollnitz et al.
|
||||
* http://grail.cs.washington.edu/projects/wavelets/article/wavelet1.pdf
|
||||
* http://grail.cs.washington.edu/projects/wavelets/article/wavelet2.pdf
|
||||
* The basic of all Wavelet transforms is to decompose a signal into
|
||||
* approximation (a) and detail (d) coefficients where the detail tends to be
|
||||
* small or zero which allows / simplifies compression. The following "graphs"
|
||||
* demonstrate the transform for a signal
|
||||
* of length eight. The index always describes the decomposition level where
|
||||
* a coefficient arises. The input signal is interpreted as approximation signal
|
||||
* at level 0. The coefficients computed on the device are stored in the same
|
||||
* scheme as in the example. This data structure is particularly well suited for
|
||||
* compression and also preserves the hierarchical structure of the
|
||||
decomposition.
|
||||
|
||||
-------------------------------------------------
|
||||
| a_0 | a_0 | a_0 | a_0 | a_0 | a_0 | a_0 | a_0 |
|
||||
-------------------------------------------------
|
||||
|
||||
-------------------------------------------------
|
||||
| a_1 | a_1 | a_1 | a_1 | d_1 | d_1 | d_1 | d_1 |
|
||||
-------------------------------------------------
|
||||
|
||||
-------------------------------------------------
|
||||
| a_2 | a_2 | d_2 | d_2 | d_1 | d_1 | d_1 | d_1 |
|
||||
-------------------------------------------------
|
||||
|
||||
-------------------------------------------------
|
||||
| a_3 | d_3 | d_2 | d_2 | d_1 | d_1 | d_1 | d_1 |
|
||||
-------------------------------------------------
|
||||
|
||||
* Device Code.
|
||||
*/
|
||||
|
||||
#ifndef _DWTHAAR1D_KERNEL_H_
|
||||
#define _DWTHAAR1D_KERNEL_H_
|
||||
|
||||
#include <cooperative_groups.h>
|
||||
|
||||
namespace cg = cooperative_groups;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//! @param id input data
|
||||
//! @param od output data
|
||||
//! @param value
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
__global__ void initValue(float *od, float value) {
|
||||
// Handle to thread block group
|
||||
cg::thread_block cta = cg::this_thread_block();
|
||||
// position of write into global memory
|
||||
unsigned int index = (blockIdx.x * blockDim.x) + threadIdx.x;
|
||||
|
||||
od[index] = value;
|
||||
|
||||
// sync after each decomposition step
|
||||
cg::sync(cta);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//! Compute partial wavelet decomposition on the GPU using Haar basis
|
||||
//! For each thread block the full decomposition is computed but these results
|
||||
//! have to be combined
|
||||
//! Use one thread to perform the full decomposition
|
||||
//! @param id input data
|
||||
//! @param od output data
|
||||
//! @param approx_final place to store the final approximation coefficient for
|
||||
//! the subsignal
|
||||
//! @param dlevels number of decomposition levels for this transform
|
||||
//! @param slength_step_half half signal length for current decomposition
|
||||
//! level (offset for storing detail coefficients in
|
||||
//! global memory
|
||||
//! @param bdim block dimension
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
__global__ void dwtHaar1D(float *id, float *od, float *approx_final,
|
||||
const unsigned int dlevels,
|
||||
const unsigned int slength_step_half,
|
||||
const int bdim) {
|
||||
// Handle to thread block group
|
||||
cg::thread_block cta = cg::this_thread_block();
|
||||
|
||||
// shared memory for part of the signal
|
||||
extern __shared__ float shared[];
|
||||
|
||||
// thread runtime environment, 1D parametrization
|
||||
const int gdim = gridDim.x;
|
||||
// const int bdim = blockDim.x;
|
||||
const int bid = blockIdx.x;
|
||||
const int tid = threadIdx.x;
|
||||
|
||||
// global thread id (w.r.t. to total data set)
|
||||
const int tid_global = (bid * bdim) + tid;
|
||||
unsigned int idata = (bid * (2 * bdim)) + tid;
|
||||
|
||||
// read data from global memory
|
||||
shared[tid] = id[idata];
|
||||
shared[tid + bdim] = id[idata + bdim];
|
||||
cg::sync(cta);
|
||||
|
||||
// this operation has a two way bank conflicts for all threads, this are two
|
||||
// additional cycles for each warp -- all alternatives to avoid this bank
|
||||
// conflict are more expensive than the one cycle introduced by serialization
|
||||
float data0 = shared[2 * tid];
|
||||
float data1 = shared[(2 * tid) + 1];
|
||||
cg::sync(cta);
|
||||
|
||||
// detail coefficient, not further referenced so directly store in
|
||||
// global memory
|
||||
od[tid_global + slength_step_half] = (data0 - data1) * INV_SQRT_2;
|
||||
|
||||
// offset to avoid bank conflicts
|
||||
// see the scan example for a more detailed description
|
||||
unsigned int atid = tid + (tid >> LOG_NUM_BANKS);
|
||||
|
||||
// approximation coefficient
|
||||
// store in shared memory for further decomposition steps in this global step
|
||||
shared[atid] = (data0 + data1) * INV_SQRT_2;
|
||||
|
||||
// all threads have to write approximation coefficient to shared memory before
|
||||
// next steps can take place
|
||||
cg::sync(cta);
|
||||
|
||||
// early out if possible
|
||||
// the compiler removes this part from the source because dlevels is
|
||||
// a constant shader input
|
||||
// note: syncthreads in bodies of branches can lead to dead-locks unless
|
||||
// the condition evaluates the same way for ALL threads of a block, as in
|
||||
// this case
|
||||
if (dlevels > 1) {
|
||||
// offset to second element in shared element which has to be used for the
|
||||
// decomposition, effectively 2^(i - 1)
|
||||
unsigned int offset_neighbor = 1;
|
||||
// number of active threads per decomposition level
|
||||
// identical to the offset for the detail coefficients
|
||||
unsigned int num_threads = bdim >> 1;
|
||||
|
||||
// index for the first element of the pair to process
|
||||
// the representation is still compact (and therefore still tid * 2)
|
||||
// because the first step operated on registers and only the result has been
|
||||
// written to shared memory
|
||||
unsigned int idata0 = tid * 2;
|
||||
|
||||
// offset levels to make the loop more efficient
|
||||
for (unsigned int i = 1; i < dlevels; ++i) {
|
||||
// Non-coalesced writes occur if the number of active threads becomes
|
||||
// less than 16 for a block because the start address for the first
|
||||
// block is not always aligned with 64 byte which is necessary for
|
||||
// coalesced access. However, the problem only occurs at high levels
|
||||
// with only a small number of active threads so that the total number of
|
||||
// non-coalesced access is rather small and does not justify the
|
||||
// computations which are necessary to avoid these uncoalesced writes
|
||||
// (this has been tested and verified)
|
||||
if (tid < num_threads) {
|
||||
// update stride, with each decomposition level the stride grows by a
|
||||
// factor of 2
|
||||
unsigned int idata1 = idata0 + offset_neighbor;
|
||||
|
||||
// position of write into global memory
|
||||
unsigned int g_wpos = (num_threads * gdim) + (bid * num_threads) + tid;
|
||||
|
||||
// compute wavelet decomposition step
|
||||
|
||||
// offset to avoid bank conflicts
|
||||
unsigned int c_idata0 = idata0 + (idata0 >> LOG_NUM_BANKS);
|
||||
unsigned int c_idata1 = idata1 + (idata1 >> LOG_NUM_BANKS);
|
||||
|
||||
// detail coefficient, not further modified so directly store
|
||||
// in global memory
|
||||
od[g_wpos] = (shared[c_idata0] - shared[c_idata1]) * INV_SQRT_2;
|
||||
|
||||
// approximation coefficient
|
||||
// note that the representation in shared memory becomes rather sparse
|
||||
// (with a lot of holes inbetween) but the storing scheme in global
|
||||
// memory guarantees that the common representation (approx, detail_0,
|
||||
// detail_1, ...)
|
||||
// is achieved
|
||||
shared[c_idata0] = (shared[c_idata0] + shared[c_idata1]) * INV_SQRT_2;
|
||||
|
||||
// update storage offset for details
|
||||
num_threads = num_threads >> 1; // div 2
|
||||
offset_neighbor <<= 1; // mul 2
|
||||
idata0 = idata0 << 1; // mul 2
|
||||
}
|
||||
|
||||
// sync after each decomposition step
|
||||
cg::sync(cta);
|
||||
}
|
||||
|
||||
// write the top most level element for the next decomposition steps
|
||||
// which are performed after an interlock synchronization on host side
|
||||
if (0 == tid) {
|
||||
approx_final[bid] = shared[0];
|
||||
}
|
||||
|
||||
} // end early out if possible
|
||||
}
|
||||
|
||||
#endif // #ifndef _DWTHAAR1D_KERNEL_H_
|
||||
20
Samples/dwtHaar1D/dwtHaar1D_vs2017.sln
Normal file
20
Samples/dwtHaar1D/dwtHaar1D_vs2017.sln
Normal file
@@ -0,0 +1,20 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2017
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dwtHaar1D", "dwtHaar1D_vs2017.vcxproj", "{997E0757-EA74-4A4E-A0FC-47D8C8831A15}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{997E0757-EA74-4A4E-A0FC-47D8C8831A15}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{997E0757-EA74-4A4E-A0FC-47D8C8831A15}.Debug|x64.Build.0 = Debug|x64
|
||||
{997E0757-EA74-4A4E-A0FC-47D8C8831A15}.Release|x64.ActiveCfg = Release|x64
|
||||
{997E0757-EA74-4A4E-A0FC-47D8C8831A15}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
113
Samples/dwtHaar1D/dwtHaar1D_vs2017.vcxproj
Normal file
113
Samples/dwtHaar1D/dwtHaar1D_vs2017.vcxproj
Normal file
@@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<CUDAPropsPath Condition="'$(CUDAPropsPath)'==''">$(VCTargetsPath)\BuildCustomizations</CUDAPropsPath>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{997E0757-EA74-4A4E-A0FC-47D8C8831A15}</ProjectGuid>
|
||||
<RootNamespace>dwtHaar1D_vs2017</RootNamespace>
|
||||
<ProjectName>dwtHaar1D</ProjectName>
|
||||
<CudaToolkitCustomDir />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(WindowsTargetPlatformVersion)'==''">
|
||||
<LatestTargetPlatformVersion>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</LatestTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
|
||||
<TargetPlatformVersion>$(WindowsTargetPlatformVersion)</TargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup>
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'">
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
<Import Project="$(CUDAPropsPath)\CUDA 11.5.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<IntDir>$(Platform)/$(Configuration)/</IntDir>
|
||||
<IncludePath>$(IncludePath)</IncludePath>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules />
|
||||
<CodeAnalysisRuleAssemblies />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Platform)'=='x64'">
|
||||
<OutDir>../../bin/win64/$(Configuration)/</OutDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>WIN32;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>./;$(CudaToolkitDir)/include;../../Common;</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<AdditionalDependencies>cudart_static.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(CudaToolkitLibDir);</AdditionalLibraryDirectories>
|
||||
<OutputFile>$(OutDir)/dwtHaar1D.exe</OutputFile>
|
||||
</Link>
|
||||
<CudaCompile>
|
||||
<CodeGeneration>compute_35,sm_35;compute_37,sm_37;compute_50,sm_50;compute_52,sm_52;compute_60,sm_60;compute_61,sm_61;compute_70,sm_70;compute_75,sm_75;compute_80,sm_80;compute_86,sm_86;</CodeGeneration>
|
||||
<AdditionalOptions>-Xcompiler "/wd 4819" %(AdditionalOptions)</AdditionalOptions>
|
||||
<Include>./;../../Common</Include>
|
||||
<Defines>WIN32</Defines>
|
||||
<AdditionalOptions>--threads 0</AdditionalOptions>
|
||||
</CudaCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
<CudaCompile>
|
||||
<Runtime>MTd</Runtime>
|
||||
<TargetMachinePlatform>64</TargetMachinePlatform>
|
||||
</CudaCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
<CudaCompile>
|
||||
<Runtime>MT</Runtime>
|
||||
<TargetMachinePlatform>64</TargetMachinePlatform>
|
||||
</CudaCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<CudaCompile Include="dwtHaar1D.cu" />
|
||||
<None Include="dwtHaar1D_kernel.cuh" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
<Import Project="$(CUDAPropsPath)\CUDA 11.5.targets" />
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
20
Samples/dwtHaar1D/dwtHaar1D_vs2019.sln
Normal file
20
Samples/dwtHaar1D/dwtHaar1D_vs2019.sln
Normal file
@@ -0,0 +1,20 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2019
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dwtHaar1D", "dwtHaar1D_vs2019.vcxproj", "{997E0757-EA74-4A4E-A0FC-47D8C8831A15}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{997E0757-EA74-4A4E-A0FC-47D8C8831A15}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{997E0757-EA74-4A4E-A0FC-47D8C8831A15}.Debug|x64.Build.0 = Debug|x64
|
||||
{997E0757-EA74-4A4E-A0FC-47D8C8831A15}.Release|x64.ActiveCfg = Release|x64
|
||||
{997E0757-EA74-4A4E-A0FC-47D8C8831A15}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
109
Samples/dwtHaar1D/dwtHaar1D_vs2019.vcxproj
Normal file
109
Samples/dwtHaar1D/dwtHaar1D_vs2019.vcxproj
Normal file
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<CUDAPropsPath Condition="'$(CUDAPropsPath)'==''">$(VCTargetsPath)\BuildCustomizations</CUDAPropsPath>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{997E0757-EA74-4A4E-A0FC-47D8C8831A15}</ProjectGuid>
|
||||
<RootNamespace>dwtHaar1D_vs2019</RootNamespace>
|
||||
<ProjectName>dwtHaar1D</ProjectName>
|
||||
<CudaToolkitCustomDir />
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup>
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'">
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
<Import Project="$(CUDAPropsPath)\CUDA 11.5.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<IntDir>$(Platform)/$(Configuration)/</IntDir>
|
||||
<IncludePath>$(IncludePath)</IncludePath>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules />
|
||||
<CodeAnalysisRuleAssemblies />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Platform)'=='x64'">
|
||||
<OutDir>../../bin/win64/$(Configuration)/</OutDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>WIN32;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>./;$(CudaToolkitDir)/include;../../Common;</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<AdditionalDependencies>cudart_static.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(CudaToolkitLibDir);</AdditionalLibraryDirectories>
|
||||
<OutputFile>$(OutDir)/dwtHaar1D.exe</OutputFile>
|
||||
</Link>
|
||||
<CudaCompile>
|
||||
<CodeGeneration>compute_35,sm_35;compute_37,sm_37;compute_50,sm_50;compute_52,sm_52;compute_60,sm_60;compute_61,sm_61;compute_70,sm_70;compute_75,sm_75;compute_80,sm_80;compute_86,sm_86;</CodeGeneration>
|
||||
<AdditionalOptions>-Xcompiler "/wd 4819" %(AdditionalOptions)</AdditionalOptions>
|
||||
<Include>./;../../Common</Include>
|
||||
<Defines>WIN32</Defines>
|
||||
<AdditionalOptions>--threads 0</AdditionalOptions>
|
||||
</CudaCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
<CudaCompile>
|
||||
<Runtime>MTd</Runtime>
|
||||
<TargetMachinePlatform>64</TargetMachinePlatform>
|
||||
</CudaCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
|
||||
</Link>
|
||||
<CudaCompile>
|
||||
<Runtime>MT</Runtime>
|
||||
<TargetMachinePlatform>64</TargetMachinePlatform>
|
||||
</CudaCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<CudaCompile Include="dwtHaar1D.cu" />
|
||||
<None Include="dwtHaar1D_kernel.cuh" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
<Import Project="$(CUDAPropsPath)\CUDA 11.5.targets" />
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
Reference in New Issue
Block a user