├── compile_n_run.sh ├── refs └── im2col.png ├── README.md ├── CMakeLists.txt ├── .gitignore ├── LICENSE ├── log ├── perflog_before.csv ├── perflog_final.csv ├── perflog_write_coalescing.csv └── perflog_loop_opt.csv ├── im2col.cu └── Visualise results.ipynb /compile_n_run.sh: -------------------------------------------------------------------------------- 1 | nvcc im2col.cu -o im2col.out && ./im2col.out 2 | -------------------------------------------------------------------------------- /refs/im2col.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/piojanu/CUDA-im2col-conv/HEAD/refs/im2col.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CUDA implementation of convolution with im2col algorithm 2 | CUDA project for uni subject 3 | 4 | ![im2col](refs/im2col.png) 5 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) 2 | set(PROJECT_NAME "CUDA-im2col-conv") 3 | 4 | # Find src files and include dir 5 | file(GLOB CPU_SOURCE_FILES "${CMAKE_SOURCE_DIR}/src/*.c") 6 | file(GLOB GPU_SOURCE_FILES "${CMAKE_SOURCE_DIR}/src/*.cu") 7 | set(INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/include) 8 | 9 | # Create lib with CUDA code 10 | find_package(CUDA REQUIRED) 11 | if(NOT CUDA_FOUND) 12 | message(FATAL_ERROR "CUDA not found! CMake will exit.") 13 | endif() 14 | 15 | cuda_include_directories(${INCLUDE_DIRS}) 16 | cuda_add_library(cudalib ${GPU_SOURCE_FILES}) 17 | target_include_directories(cudalib PUBLIC ${INCLUDE_DIRS}) 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## C 2 | 3 | # Prerequisites 4 | *.d 5 | 6 | # Object files 7 | *.o 8 | *.ko 9 | *.obj 10 | *.elf 11 | 12 | # Linker output 13 | *.ilk 14 | *.map 15 | *.exp 16 | 17 | # Precompiled Headers 18 | *.gch 19 | *.pch 20 | 21 | # Libraries 22 | *.lib 23 | *.a 24 | *.la 25 | *.lo 26 | 27 | # Shared objects (inc. Windows DLLs) 28 | *.dll 29 | *.so 30 | *.so.* 31 | *.dylib 32 | 33 | # Executables 34 | *.exe 35 | *.out 36 | *.app 37 | *.i*86 38 | *.x86_64 39 | *.hex 40 | 41 | # Debug files 42 | *.dSYM/ 43 | *.su 44 | *.idb 45 | *.pdb 46 | 47 | # Kernel Module Compile Results 48 | *.mod* 49 | *.cmd 50 | .tmp_versions/ 51 | modules.order 52 | Module.symvers 53 | Mkfile.old 54 | dkms.conf 55 | 56 | ## CMake 57 | 58 | CMakeCache.txt 59 | CMakeFiles 60 | CMakeScripts 61 | Testing 62 | Makefile 63 | cmake_install.cmake 64 | install_manifest.txt 65 | compile_commands.json 66 | CTestTestfile.cmake 67 | 68 | ## CUDA 69 | 70 | *.i 71 | *.ii 72 | *.gpu 73 | *.ptx 74 | *.cubin 75 | *.fatbin 76 | 77 | ## Python 78 | .ipynb_checkpoints/ 79 | 80 | ## Own 81 | /*.csv 82 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Piotr Januszewski 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /log/perflog_before.csv: -------------------------------------------------------------------------------- 1 | 1,1,12335.5 2 | 1,2,6521.33 3 | 1,4,3578.7 4 | 1,8,1811.8 5 | 1,16,928.817 6 | 1,32,493.007 7 | 1,64,281.06 8 | 1,128,171.425 9 | 1,256,118.305 10 | 1,512,120.154 11 | 1,1024,121.042 12 | 1,2048,112.686 13 | 1,4096,108.361 14 | 1,8192,108.214 15 | 2,1,6560.73 16 | 2,2,3603.4 17 | 2,4,1827.46 18 | 2,8,936.064 19 | 2,16,502.304 20 | 2,32,277.921 21 | 2,64,173.525 22 | 2,128,116.03 23 | 2,256,87.663 24 | 2,512,89.921 25 | 2,1024,86.842 26 | 2,2048,82.098 27 | 2,4096,80.082 28 | 2,8192,79.777 29 | 4,1,3701.98 30 | 4,2,1867.73 31 | 4,4,965.522 32 | 4,8,514.046 33 | 4,16,289.178 34 | 4,32,173.232 35 | 4,64,118.07 36 | 4,128,89.374 37 | 4,256,74.707 38 | 4,512,74.362 39 | 4,1024,71.75 40 | 4,2048,69.598 41 | 4,4096,67.145 42 | 4,8192,66.548 43 | 8,1,2200.58 44 | 8,2,1122.74 45 | 8,4,585.689 46 | 8,8,324.973 47 | 8,16,188.025 48 | 8,32,120.502 49 | 8,64,88.089 50 | 8,128,71.886 51 | 8,256,66.106 52 | 8,512,65.853 53 | 8,1024,64.84 54 | 8,2048,63.527 55 | 8,4096,62.33 56 | 8,8192,62.167 57 | 16,1,1171.25 58 | 16,2,606.87 59 | 16,4,333.99 60 | 16,8,193.129 61 | 16,16,122.567 62 | 16,32,88.134 63 | 16,64,70.963 64 | 16,128,63.573 65 | 16,256,63.514 66 | 16,512,63.801 67 | 16,1024,63.061 68 | 16,2048,62.676 69 | 16,4096,62.12 70 | 16,8192,62.018 71 | 32,1,658.194 72 | 32,2,353.969 73 | 32,4,202.668 74 | 32,8,127.259 75 | 32,16,89.846 76 | 32,32,71.798 77 | 32,64,62.943 78 | 32,128,61.343 79 | 32,256,72.229 80 | 32,512,78.764 81 | 32,1024,85.692 82 | 32,2048,84.395 83 | 32,4096,84.362 84 | 32,8192,84.387 85 | 64,1,361.558 86 | 64,2,204.838 87 | 64,4,127.67 88 | 64,8,89.902 89 | 64,16,71.828 90 | 64,32,63.231 91 | 64,64,61.849 92 | 64,128,68.834 93 | 64,256,96.987 94 | 64,512,93.555 95 | 64,1024,99.424 96 | 64,2048,99.648 97 | 64,4096,100.038 98 | 64,8192,99.836 99 | 128,1,208.545 100 | 128,2,129.423 101 | 128,4,90.392 102 | 128,8,71.593 103 | 128,16,63.001 104 | 128,32,61.937 105 | 128,64,70.22 106 | 128,128,97.454 107 | 128,256,93.509 108 | 128,512,99.498 109 | 128,1024,99.287 110 | 128,2048,99.762 111 | 128,4096,99.768 112 | 128,8192,99.873 113 | 256,1,135.636 114 | 256,2,93.734 115 | 256,4,72.453 116 | 256,8,62.804 117 | 256,16,61.1 118 | 256,32,71.208 119 | 256,64,96.793 120 | 256,128,95.216 121 | 256,256,99.653 122 | 256,512,99.785 123 | 256,1024,99.6 124 | 256,2048,99.89 125 | 256,4096,99.793 126 | 256,8192,99.767 127 | 512,1,121.334 128 | 512,2,85.972 129 | 512,4,69.091 130 | 512,8,61.132 131 | 512,16,68.24 132 | 512,32,98.08 133 | 512,64,95.228 134 | 512,128,100.05 135 | 512,256,99.999 136 | 512,512,99.784 137 | 512,1024,99.975 138 | 512,2048,99.92 139 | 512,4096,100.001 140 | 512,8192,100.041 141 | 1024,1,121.468 142 | 1024,2,87.468 143 | 1024,4,69.833 144 | 1024,8,70.728 145 | 1024,16,92.798 146 | 1024,32,94.592 147 | 1024,64,100.532 148 | 1024,128,99.389 149 | 1024,256,100.53 150 | 1024,512,100.512 151 | 1024,1024,100.228 152 | 1024,2048,100.599 153 | 1024,4096,100.572 154 | 1024,8192,-1 155 | 2048,1,50.468 156 | 2048,2,50.537 157 | 2048,4,50.418 158 | 2048,8,50.429 159 | 2048,16,50.394 160 | 2048,32,50.455 161 | 2048,64,50.45 162 | 2048,128,50.552 163 | 2048,256,50.461 164 | 2048,512,50.522 165 | 2048,1024,50.286 166 | 2048,2048,50.548 167 | 2048,4096,-1 168 | 2048,8192,-1 169 | -------------------------------------------------------------------------------- /log/perflog_final.csv: -------------------------------------------------------------------------------- 1 | 1,1,18760.6 2 | 1,2,9748.33 3 | 1,4,5221.13 4 | 1,8,2985.59 5 | 1,16,1490.37 6 | 1,32,781.293 7 | 1,64,419.882 8 | 1,128,236.332 9 | 1,256,155.505 10 | 1,512,151.724 11 | 1,1024,154.243 12 | 1,2048,141.864 13 | 1,4096,135.765 14 | 1,8192,140.427 15 | 2,1,9822.23 16 | 2,2,5280.27 17 | 2,4,3014.08 18 | 2,8,1556.06 19 | 2,16,794.364 20 | 2,32,418.888 21 | 2,64,236.019 22 | 2,128,147.074 23 | 2,256,102.997 24 | 2,512,102.182 25 | 2,1024,103.043 26 | 2,2048,96.383 27 | 2,4096,95.599 28 | 2,8192,96.721 29 | 4,1,5280.99 30 | 4,2,3026.39 31 | 4,4,1535.26 32 | 4,8,792.703 33 | 4,16,421.224 34 | 4,32,236.061 35 | 4,64,145.334 36 | 4,128,100.395 37 | 4,256,78.57 38 | 4,512,78.292 39 | 4,1024,77.803 40 | 4,2048,75.752 41 | 4,4096,74.877 42 | 4,8192,74.816 43 | 8,1,3024.62 44 | 8,2,1541.38 45 | 8,4,796.194 46 | 8,8,423.651 47 | 8,16,237.76 48 | 8,32,145.101 49 | 8,64,101.267 50 | 8,128,76.595 51 | 8,256,66.337 52 | 8,512,65.811 53 | 8,1024,66.178 54 | 8,2048,64.928 55 | 8,4096,64.112 56 | 8,8192,64.303 57 | 16,1,1545.25 58 | 16,2,799.478 59 | 16,4,425.226 60 | 16,8,238.028 61 | 16,16,144.729 62 | 16,32,98.714 63 | 16,64,75.491 64 | 16,128,63.828 65 | 16,256,58.627 66 | 16,512,58.626 67 | 16,1024,59.015 68 | 16,2048,58.221 69 | 16,4096,58.033 70 | 16,8192,57.938 71 | 32,1,798.57 72 | 32,2,425.426 73 | 32,4,237.811 74 | 32,8,144.537 75 | 32,16,98.435 76 | 32,32,75.096 77 | 32,64,63.341 78 | 32,128,57.776 79 | 32,256,55.07 80 | 32,512,55.288 81 | 32,1024,55.344 82 | 32,2048,55.097 83 | 32,4096,54.905 84 | 32,8192,55.098 85 | 64,1,425.753 86 | 64,2,238.125 87 | 64,4,144.916 88 | 64,8,98.689 89 | 64,16,74.994 90 | 64,32,63.204 91 | 64,64,57.783 92 | 64,128,55.139 93 | 64,256,54.456 94 | 64,512,54.392 95 | 64,1024,54.532 96 | 64,2048,54.044 97 | 64,4096,53.991 98 | 64,8192,53.976 99 | 128,1,239.596 100 | 128,2,145.527 101 | 128,4,98.679 102 | 128,8,74.607 103 | 128,16,63.355 104 | 128,32,57.706 105 | 128,64,55.05 106 | 128,128,53.813 107 | 128,256,54.095 108 | 128,512,54.223 109 | 128,1024,54.174 110 | 128,2048,54.002 111 | 128,4096,54.163 112 | 128,8192,53.953 113 | 256,1,147.662 114 | 256,2,100.686 115 | 256,4,75.762 116 | 256,8,63.359 117 | 256,16,57.772 118 | 256,32,55.658 119 | 256,64,53.97 120 | 256,128,54.173 121 | 256,256,54.548 122 | 256,512,54.058 123 | 256,1024,54.022 124 | 256,2048,53.892 125 | 256,4096,53.929 126 | 256,8192,53.85 127 | 512,1,102.41 128 | 512,2,76.818 129 | 512,4,64.11 130 | 512,8,57.721 131 | 512,16,55.162 132 | 512,32,54.403 133 | 512,64,54.533 134 | 512,128,54.491 135 | 512,256,54.112 136 | 512,512,53.941 137 | 512,1024,54.202 138 | 512,2048,53.857 139 | 512,4096,53.882 140 | 512,8192,53.49 141 | 1024,1,79.017 142 | 1024,2,65.097 143 | 1024,4,58.305 144 | 1024,8,55.016 145 | 1024,16,54.329 146 | 1024,32,54.231 147 | 1024,64,54.511 148 | 1024,128,54.249 149 | 1024,256,54.156 150 | 1024,512,53.894 151 | 1024,1024,54.028 152 | 1024,2048,53.847 153 | 1024,4096,53.716 154 | 1024,8192,-1 155 | 2048,1,50.569 156 | 2048,2,50.568 157 | 2048,4,50.472 158 | 2048,8,50.62 159 | 2048,16,50.425 160 | 2048,32,50.509 161 | 2048,64,50.446 162 | 2048,128,50.472 163 | 2048,256,50.482 164 | 2048,512,50.425 165 | 2048,1024,50.468 166 | 2048,2048,50.453 167 | 2048,4096,-1 168 | 2048,8192,-1 169 | -------------------------------------------------------------------------------- /log/perflog_write_coalescing.csv: -------------------------------------------------------------------------------- 1 | 1,1,12102.8 2 | 1,2,6116.13 3 | 1,4,3082.8 4 | 1,8,1563.37 5 | 1,16,812.534 6 | 1,32,433.483 7 | 1,64,245.882 8 | 1,128,152.816 9 | 1,256,107.24 10 | 1,512,108.955 11 | 1,1024,110.169 12 | 1,2048,103.484 13 | 1,4096,100.103 14 | 1,8192,100.207 15 | 2,1,6170.66 16 | 2,2,3112.78 17 | 2,4,1567.84 18 | 2,8,813.777 19 | 2,16,435.126 20 | 2,32,246.311 21 | 2,64,150.198 22 | 2,128,103.59 23 | 2,256,80.396 24 | 2,512,82.923 25 | 2,1024,81.116 26 | 2,2048,77.607 27 | 2,4096,75.774 28 | 2,8192,75.637 29 | 4,1,3237.59 30 | 4,2,1632.09 31 | 4,4,836.935 32 | 4,8,444.462 33 | 4,16,250.202 34 | 4,32,152.982 35 | 4,64,103.544 36 | 4,128,78.532 37 | 4,256,69.666 38 | 4,512,70.319 39 | 4,1024,69.358 40 | 4,2048,67.76 41 | 4,4096,66.929 42 | 4,8192,66.683 43 | 8,1,1723.67 44 | 8,2,883.819 45 | 8,4,461.663 46 | 8,8,258.365 47 | 8,16,156.645 48 | 8,32,104.974 49 | 8,64,79.113 50 | 8,128,67.909 51 | 8,256,65.485 52 | 8,512,67.707 53 | 8,1024,66.044 54 | 8,2048,65.454 55 | 8,4096,65.116 56 | 8,8192,65.312 57 | 16,1,956.619 58 | 16,2,501.495 59 | 16,4,276.009 60 | 16,8,164.013 61 | 16,16,109.386 62 | 16,32,81.642 63 | 16,64,68.206 64 | 16,128,65.648 65 | 16,256,67.803 66 | 16,512,79.326 67 | 16,1024,81.367 68 | 16,2048,80.626 69 | 16,4096,79.482 70 | 16,8192,79.547 71 | 32,1,582.366 72 | 32,2,315.083 73 | 32,4,182.445 74 | 32,8,116.308 75 | 32,16,85.78 76 | 32,32,71.121 77 | 32,64,66.739 78 | 32,128,67.664 79 | 32,256,146.163 80 | 32,512,152.217 81 | 32,1024,183.698 82 | 32,2048,182.095 83 | 32,4096,182.226 84 | 32,8192,181.882 85 | 64,1,316.287 86 | 64,2,198.208 87 | 64,4,123.947 88 | 64,8,87.374 89 | 64,16,70.854 90 | 64,32,68.068 91 | 64,64,68.667 92 | 64,128,145.12 93 | 64,256,193.937 94 | 64,512,182.934 95 | 64,1024,193.799 96 | 64,2048,194.257 97 | 64,4096,194.004 98 | 64,8192,193.552 99 | 128,1,211.026 100 | 128,2,130.631 101 | 128,4,90.452 102 | 128,8,71.057 103 | 128,16,67.631 104 | 128,32,70.201 105 | 128,64,146.225 106 | 128,128,194.646 107 | 128,256,181.115 108 | 128,512,193.087 109 | 128,1024,194.073 110 | 128,2048,194.102 111 | 128,4096,193.607 112 | 128,8192,193.962 113 | 256,1,185.869 114 | 256,2,118.111 115 | 256,4,84.164 116 | 256,8,67.776 117 | 256,16,69.087 118 | 256,32,149.079 119 | 256,64,190.994 120 | 256,128,184.555 121 | 256,256,194.638 122 | 256,512,194.456 123 | 256,1024,193.971 124 | 256,2048,194.488 125 | 256,4096,194.32 126 | 256,8192,194.541 127 | 512,1,185.692 128 | 512,2,118.092 129 | 512,4,84.422 130 | 512,8,68.728 131 | 512,16,127.55 132 | 512,32,192.398 133 | 512,64,184.655 134 | 512,128,194.034 135 | 512,256,194.263 136 | 512,512,194.655 137 | 512,1024,194.677 138 | 512,2048,193.154 139 | 512,4096,194.677 140 | 512,8192,194.243 141 | 1024,1,186.62 142 | 1024,2,119.321 143 | 1024,4,84.885 144 | 1024,8,152.063 145 | 1024,16,187.355 146 | 1024,32,183.525 147 | 1024,64,195.369 148 | 1024,128,195.171 149 | 1024,256,195.82 150 | 1024,512,193.369 151 | 1024,1024,194.857 152 | 1024,2048,195.121 153 | 1024,4096,195.102 154 | 1024,8192,-1 155 | 2048,1,50.697 156 | 2048,2,50.294 157 | 2048,4,50.171 158 | 2048,8,50.203 159 | 2048,16,49.981 160 | 2048,32,50.113 161 | 2048,64,50.011 162 | 2048,128,50.751 163 | 2048,256,50 164 | 2048,512,50.181 165 | 2048,1024,49.997 166 | 2048,2048,50.247 167 | 2048,4096,-1 168 | 2048,8192,-1 169 | -------------------------------------------------------------------------------- /log/perflog_loop_opt.csv: -------------------------------------------------------------------------------- 1 | 1,1,19777.8 2 | 1,2,10210.1 3 | 1,4,5327.24 4 | 1,8,2707.27 5 | 1,16,1410.82 6 | 1,32,771.147 7 | 1,64,455.442 8 | 1,128,282.433 9 | 1,256,200.02 10 | 1,512,214.428 11 | 1,1024,220.866 12 | 1,2048,207.9 13 | 1,4096,198.098 14 | 1,8192,192.221 15 | 2,1,10275.3 16 | 2,2,5388.86 17 | 2,4,2711.22 18 | 2,8,1394.84 19 | 2,16,785.108 20 | 2,32,478.856 21 | 2,64,284.793 22 | 2,128,195.494 23 | 2,256,151.204 24 | 2,512,163.083 25 | 2,1024,179.349 26 | 2,2048,165.49 27 | 2,4096,162.725 28 | 2,8192,147.019 29 | 4,1,5432.01 30 | 4,2,2727.77 31 | 4,4,1388.69 32 | 4,8,761.545 33 | 4,16,469.875 34 | 4,32,275.023 35 | 4,64,196.264 36 | 4,128,149.329 37 | 4,256,126.235 38 | 4,512,135.413 39 | 4,1024,155.57 40 | 4,2048,139.183 41 | 4,4096,144.774 42 | 4,8192,147.576 43 | 8,1,2780.86 44 | 8,2,1426.92 45 | 8,4,764.726 46 | 8,8,439.434 47 | 8,16,275.293 48 | 8,32,187.966 49 | 8,64,148.949 50 | 8,128,124.672 51 | 8,256,115.682 52 | 8,512,127.123 53 | 8,1024,134.421 54 | 8,2048,130.728 55 | 8,4096,126.93 56 | 8,8192,132.641 57 | 16,1,1466.08 58 | 16,2,791.643 59 | 16,4,453.201 60 | 16,8,273.769 61 | 16,16,191.577 62 | 16,32,146.084 63 | 16,64,124.814 64 | 16,128,113.132 65 | 16,256,131.836 66 | 16,512,134.552 67 | 16,1024,124.039 68 | 16,2048,125.027 69 | 16,4096,118.56 70 | 16,8192,116.698 71 | 32,1,829.912 72 | 32,2,470.907 73 | 32,4,283.173 74 | 32,8,194.241 75 | 32,16,150.073 76 | 32,32,126.03 77 | 32,64,115.31 78 | 32,128,139.629 79 | 32,256,149.761 80 | 32,512,133.661 81 | 32,1024,121.487 82 | 32,2048,113.084 83 | 32,4096,111.309 84 | 32,8192,110.9 85 | 64,1,498.721 86 | 64,2,296.136 87 | 64,4,201.369 88 | 64,8,150.439 89 | 64,16,126.001 90 | 64,32,139.065 91 | 64,64,150.177 92 | 64,128,151.063 93 | 64,256,164.458 94 | 64,512,161.063 95 | 64,1024,152.713 96 | 64,2048,142.873 97 | 64,4096,129.514 98 | 64,8192,121.817 99 | 128,1,317.599 100 | 128,2,206.201 101 | 128,4,153.108 102 | 128,8,126.505 103 | 128,16,117.94 104 | 128,32,138.918 105 | 128,64,140.717 106 | 128,128,162.245 107 | 128,256,154.61 108 | 128,512,150.441 109 | 128,1024,141.16 110 | 128,2048,129.483 111 | 128,4096,120.215 112 | 128,8192,114.382 113 | 256,1,236.313 114 | 256,2,163.558 115 | 256,4,129.967 116 | 256,8,115.25 117 | 256,16,130.696 118 | 256,32,134.523 119 | 256,64,166.329 120 | 256,128,152.1 121 | 256,256,149.326 122 | 256,512,140.878 123 | 256,1024,127.63 124 | 256,2048,119.283 125 | 256,4096,113.892 126 | 256,8192,110.888 127 | 512,1,182.797 128 | 512,2,139.823 129 | 512,4,119.748 130 | 512,8,109.899 131 | 512,16,128.909 132 | 512,32,161.457 133 | 512,64,150.088 134 | 512,128,148.801 135 | 512,256,138.552 136 | 512,512,128.332 137 | 512,1024,117.671 138 | 512,2048,113.067 139 | 512,4096,110.114 140 | 512,8192,109.484 141 | 1024,1,180.882 142 | 1024,2,139.147 143 | 1024,4,119.194 144 | 1024,8,121.629 145 | 1024,16,154.223 146 | 1024,32,148.09 147 | 1024,64,150.241 148 | 1024,128,137.208 149 | 1024,256,126.119 150 | 1024,512,116.484 151 | 1024,1024,111.622 152 | 1024,2048,110.031 153 | 1024,4096,108.593 154 | 1024,8192,-1 155 | 2048,1,93.653 156 | 2048,2,93.376 157 | 2048,4,93.317 158 | 2048,8,93.405 159 | 2048,16,93.397 160 | 2048,32,94.056 161 | 2048,64,93.311 162 | 2048,128,93.259 163 | 2048,256,93.282 164 | 2048,512,93.545 165 | 2048,1024,93.336 166 | 2048,2048,93.149 167 | 2048,4096,-1 168 | 2048,8192,-1 169 | -------------------------------------------------------------------------------- /im2col.cu: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | // Feature maps dimensionality descriptions and assumptions: 8 | // : Height : Width : Channels : Number : 9 | // INPUT / A | H | W | C | ------------------------- | 10 | // KERNELS / F | P = K | Q = K | R = C | D = number of kernels = 1 | 11 | // OUTPUT / B | L = H * (K - 1) | M = W * (K - 1) | N = D = 1 | ------------------------- | 12 | // [!] K must be odd number. 13 | // [!] Data layout for INPUT/OUTPUT: C x H x W. 14 | // [!] Data layout for KERNELS: D x R(=C) x P(=K) x Q(=K) 15 | 16 | // Turn on/off debug mode 17 | // #define DEBUG 18 | // #define FUNCTEST 19 | #define PERFTEST 20 | 21 | #ifdef DEBUG 22 | #define LOG(...) printf(__VA_ARGS__); fflush(stdout); 23 | #else 24 | #define LOG(...) ; 25 | #endif 26 | 27 | const unsigned int H = 256, W = 256, C = 80, K = 3; 28 | 29 | // HOST FUNCTION 30 | // Takes matrix A [float *matA] and transforms it 31 | // into column representation [float *matAc] 32 | void im2colOnHost(float *matA, float *matAc, int radiusF, int countF, int L, int M, int K, int C) 33 | { 34 | // For each spatial position in output... 35 | for (int m = 0; m < M; m++) { 36 | int w = m + radiusF; 37 | for (int l = 0; l < L; l++) { 38 | int h = l + radiusF; 39 | 40 | // Progress.. 41 | LOG("\r[i] Calculation on CPU %3d%%...", ((m * L + l) * 100 / (M * L))); 42 | 43 | // For each kernel weight... 44 | for (int q = 0, oq = -1 * radiusF; oq <= radiusF; q++, oq++) { 45 | for (int p = 0, op = -1 * radiusF; op <= radiusF; p++, op++) { 46 | for (int r = 0; r < C; r++) { 47 | matAc[(r + C * (p + K * q)) + countF * (l + L * m)] = matA[r + C * ((h + op) + H * (w + oq))]; 48 | // LOG("matAc[%3d x %3d] <- matA[%3d x %3d x %3d]\n", (r + C * (p + K* q)), (l + L * m), (h + op), (w + oq), r); 49 | } 50 | } 51 | } 52 | } 53 | } 54 | LOG("\n"); 55 | } 56 | 57 | // DEVICE KERNEL 58 | // Takes matrix A [float *matA] and transforms it 59 | // into column representation [float *matAc] on GPU 60 | __global__ 61 | void im2colOnDevice(unsigned int n, float *matAc, float *matA, int radiusF, int countF, int L, int M, int K, int C) 62 | { 63 | // Using grid-stride loop if too big problem size. 64 | // https://devblogs.nvidia.com/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/ 65 | for (int idx = blockIdx.x * blockDim.x + threadIdx.x; 66 | idx < n; 67 | idx += blockDim.x * gridDim.x) 68 | { 69 | int m = (idx / C) / L; 70 | int l = (idx / C) % L; 71 | int r = idx % C; 72 | 73 | // For each spatial position in output... 74 | if (m < M) { 75 | int w = m + radiusF; 76 | if (l < L) { 77 | int h = l + radiusF; 78 | // For each kernel weight... 79 | for (int q = 0, oq = -1 * radiusF; oq <= radiusF; q++, oq++) { 80 | for (int p = 0, op = -1 * radiusF; op <= radiusF; p++, op++) { 81 | if (r < C) { 82 | matAc[(r + C * (p + K * q)) + countF * (l + L * m)] = matA[r + C * ((h + op) + H * (w + oq))]; 83 | } 84 | } 85 | } 86 | } 87 | } 88 | } 89 | } 90 | 91 | // DEVICE KERNEL 92 | // Takes matrix A [float *matA] and transforms it 93 | // into column representation [float *matAc] on GPU 94 | __global__ 95 | void col2imOnDevice(unsigned int n, float *matA, float *matAc, int radiusF, int countF, int L, int M, int K, int C) 96 | { 97 | // Using grid-stride loop if too big problem size. 98 | // https://devblogs.nvidia.com/cuda-pro-tip-write-flexible-kernels-grid-stride-loops/ 99 | for (int idx = blockIdx.x * blockDim.x + threadIdx.x; 100 | idx < n; 101 | idx += blockDim.x * gridDim.x) 102 | { 103 | int m = (idx / C) / L; 104 | int l = (idx / C) % L; 105 | int r = idx % C; 106 | 107 | // For each spatial position in output... 108 | if (m < M) { 109 | int w = m + radiusF; 110 | if (l < L) { 111 | int h = l + radiusF; 112 | // For each kernel weight... 113 | for (int q = 0, oq = -1 * radiusF; oq <= radiusF; q++, oq++) { 114 | for (int p = 0, op = -1 * radiusF; op <= radiusF; p++, op++) { 115 | if (r < C) { 116 | matA[r + C * ((h + op) + H * (w + oq))] = matAc[(r + C * (p + K * q)) + countF * (l + L * m)]; 117 | } 118 | } 119 | } 120 | } 121 | } 122 | } 123 | } 124 | 125 | void program(unsigned int blockSize, unsigned int gridSize = 0) 126 | { 127 | // CONSTS AND VARIABLES 128 | 129 | // Input/kernel/output counts and sizes 130 | const unsigned int countA = H*W*C; 131 | const size_t sizeA = countA*sizeof(float); 132 | LOG("[i] INPUT PARAMS: %u height, %u width, %u channels, %u elems, %u bytes\n", H, W, C, countA, sizeA); 133 | 134 | const unsigned int radiusF = (K - 1) / 2; 135 | const unsigned int countF = K*K*C; 136 | LOG("[i] FILTER PARAMS: %u radius, %u elems, %u bytes\n", radiusF, countF, countF*sizeof(float)); 137 | 138 | const unsigned int L = H - (K - 1); 139 | const unsigned int M = W - (K - 1); 140 | LOG("[i] OUTPUT PARAMS: %u height, %u width, %u channels\n", L, M, 1); 141 | 142 | const unsigned int countLR = L * M; 143 | const unsigned int countAc = countF * countLR; 144 | const size_t sizeAc = countAc*sizeof(float); 145 | LOG("[i] INPUT IN COL PARAMS: %u elems, %u bytes\n", countAc, sizeAc); 146 | 147 | 148 | // PREPARE DATA 149 | 150 | // Generate input data 151 | float *matA = (float *)malloc(sizeA); 152 | for (int i = 0; i < countA; i++) { 153 | matA[i] = i; 154 | } 155 | LOG(" [!] FINISHED GENERATING INPUT\n"); 156 | 157 | #ifdef FUNCTEST 158 | // Calculate im2col result 159 | float *matAc = (float *)malloc(sizeAc); 160 | im2colOnHost(matA, matAc, radiusF, countF, L, M, K, C); 161 | LOG(" [!] FINISHED CALCULATING im2col RESULT ON CPU\n"); 162 | #endif 163 | 164 | 165 | // Alloc memory and copy data to device 166 | float *devA, *devAc, *retAc; 167 | 168 | cudaMalloc((void**)&devA, sizeA); 169 | cudaMalloc((void**)&devAc, sizeAc); 170 | retAc = (float *)malloc(sizeAc); 171 | 172 | cudaMemcpy(devA, matA, sizeA, cudaMemcpyHostToDevice); 173 | 174 | // Compute default grid size if it wasn't passed 175 | const unsigned int KERNELS_NUM = L * M * C; 176 | if (gridSize == 0) 177 | gridSize = (KERNELS_NUM + blockSize - 1) / blockSize; 178 | 179 | // Run im2col computation on device and copy results 180 | im2colOnDevice<<>>(KERNELS_NUM, devAc, devA, radiusF, countF, L, M, K, C); 181 | LOG(" [!] FINISHED CALCULATING im2col ON DEVICE\n"); 182 | 183 | cudaMemcpy(retAc, devAc, sizeAc, cudaMemcpyDeviceToHost); 184 | 185 | #ifdef FUNCTEST 186 | // Compare results 187 | int success = 1; 188 | for (int i = 0; i < countAc; i++) { 189 | if (retAc[i] != matAc[i]) { 190 | success = 0; 191 | printf("TEST FAILED: im2col device kernel...\n"); 192 | break; 193 | } 194 | } 195 | 196 | if (success) { 197 | printf("TEST PASSED: im2col device kernel!\n"); 198 | } 199 | #endif 200 | 201 | // Allocate memory for return value 202 | float *retA; 203 | retA = (float *)malloc(sizeA); 204 | cudaMemset(devA, 0, sizeA); 205 | 206 | // Run col2im computation on device and copy results 207 | col2imOnDevice<<>>(KERNELS_NUM, devA, devAc, radiusF, countF, L, M, K, C); 208 | LOG(" [!] FINISHED CALCULATING col2im ON DEVICE\n"); 209 | 210 | cudaMemcpy(retA, devA, sizeA, cudaMemcpyDeviceToHost); 211 | 212 | #ifdef FUNCTEST 213 | // Compare results 214 | success = 1; 215 | for (int i = 0; i < countA; i++) { 216 | if (retA[i] != matA[i]) { 217 | success = 0; 218 | printf("TEST FAILED: col2im device kernel...\n"); 219 | break; 220 | } 221 | } 222 | 223 | if (success) { 224 | printf("TEST PASSED: col2im device kernel!\n"); 225 | } 226 | #endif 227 | 228 | // CLEAN UP 229 | cudaFree(devA); 230 | cudaFree(devAc); 231 | 232 | free(matA); 233 | #ifdef FUNCTEST 234 | free(matAc); 235 | #endif 236 | free(retA); 237 | free(retAc); 238 | } 239 | 240 | int main() 241 | { 242 | // Enforce default block and grid sizes 243 | unsigned int blockSize = 256; 244 | unsigned int gridSize = 0; 245 | 246 | // Calculate max needed kernels/threads number 247 | const unsigned int L = H - (K - 1); 248 | const unsigned int M = W - (K - 1); 249 | const unsigned int KERNELS_NUM = L * M * C; 250 | 251 | // Prepare variables for time measurement 252 | struct timeval t1, t2; 253 | double elapsedTime, totalTime = 0; 254 | int totalRuns = 1; 255 | 256 | // First warm-up run 257 | LOG("--------- WARM-UP ---------\n"); 258 | program(256); 259 | LOG("--------- WARM-UP ---------\n\n"); 260 | 261 | #ifdef PERFTEST 262 | // Average over 10 runs 263 | totalRuns = 10; 264 | 265 | // Open file for perf logs 266 | std::fstream fperflog("perflog.csv", std::ios::out); 267 | if (fperflog.good()) 268 | { 269 | // Measure effect of different block sizes 270 | const unsigned int MAX_BLOCK_SIZE = 2048; 271 | for (blockSize = 1; blockSize <= MAX_BLOCK_SIZE; blockSize *= 2) { 272 | const unsigned int MAX_GRID_SIZE = (KERNELS_NUM + blockSize - 1) / blockSize; 273 | LOG(" [!] For %d blocks, max grid size is %d\n", blockSize, MAX_GRID_SIZE); 274 | for (gridSize = 1; gridSize <= 8192; gridSize *= 2) { 275 | if (gridSize <= MAX_GRID_SIZE) { 276 | totalTime = 0; 277 | for (int i = 0; i < totalRuns; i++) 278 | #endif 279 | { 280 | // Start timer 281 | gettimeofday(&t1, NULL); 282 | 283 | // WORK HARD! 284 | program(blockSize, gridSize); 285 | 286 | // Stop timer 287 | gettimeofday(&t2, NULL); 288 | 289 | // Compute the elapsed time in millisec 290 | elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0; // sec to ms 291 | elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0; // us to ms 292 | 293 | totalTime += elapsedTime; 294 | } 295 | LOG(" [!] Whole program took %.3fms averaged over %d runs\n", totalTime / totalRuns, totalRuns); 296 | #ifdef PERFTEST 297 | fperflog << blockSize << "," << gridSize << "," << elapsedTime << std::endl; 298 | } else { 299 | // Meaningless data, there is more grids ten data cat utilize 300 | fperflog << blockSize << "," << gridSize << "," << -1 << std::endl; 301 | } 302 | } 303 | } 304 | 305 | // Close file 306 | fperflog.close(); 307 | } 308 | #endif 309 | 310 | return EXIT_SUCCESS; 311 | } 312 | -------------------------------------------------------------------------------- /Visualise results.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "%matplotlib inline" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": {}, 15 | "source": [ 16 | "# Visualise im2col performance test results\n", 17 | "\n", 18 | "We measure program execution time in function of block and grid size before and after optimisation. Results are visualised using heatmap in matplotlib." 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 88, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "from matplotlib import cm\n", 28 | "import matplotlib.pyplot as plt\n", 29 | "plt.rcParams['figure.figsize'] = 11.7,8.27\n", 30 | "import numpy as np\n", 31 | "import seaborn as sns\n", 32 | "\n", 33 | "PERFLOG_BEFORE_PATH = \"./log/perflog_write_coalescing.csv\"\n", 34 | "PERFLOG_AFTER_PATH = \"./log/perflog_final.csv\"\n", 35 | "GRID_SHAPE = (12, 14)\n", 36 | "\n", 37 | "# Load measurements\n", 38 | "data_before = np.loadtxt(PERFLOG_BEFORE_PATH, delimiter=',')\n", 39 | "data_after = np.loadtxt(PERFLOG_AFTER_PATH, delimiter=',')" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "## Preprocess data" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 89, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "before = data_before[:, 2].reshape(GRID_SHAPE)\n", 56 | "after = data_after[:, 2].reshape(GRID_SHAPE)" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "## Visualise" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 90, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "name": "stderr", 73 | "output_type": "stream", 74 | "text": [ 75 | "/usr/lib64/python3.4/site-packages/matplotlib/figure.py:459: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n", 76 | " \"matplotlib is currently using a non-GUI backend, \"\n" 77 | ] 78 | }, 79 | { 80 | "data": { 81 | "image/png": "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\n", 82 | "text/plain": [ 83 | "
" 84 | ] 85 | }, 86 | "metadata": {}, 87 | "output_type": "display_data" 88 | } 89 | ], 90 | "source": [ 91 | "fig = plt.figure(figsize=plt.figaspect(0.33))\n", 92 | "ax1 = fig.add_subplot(1, 2, 1)\n", 93 | "ax2 = fig.add_subplot(1, 2, 2)\n", 94 | "\n", 95 | "sns.heatmap(before, vmin=0, vmax=250, ax=ax1)\n", 96 | "ax1.set_title('Execution time in ms BEFORE optimisation')\n", 97 | "ax1.set_xlabel('Block Size [2^n]')\n", 98 | "ax1.set_ylabel('Grid Size [2^n]')\n", 99 | "\n", 100 | "sns.heatmap(after, vmin=0, vmax=250, ax=ax2)\n", 101 | "ax2.set_title('Execution time in ms AFTER optimisation')\n", 102 | "ax2.set_xlabel('Block Size [2^n]')\n", 103 | "ax2.set_ylabel('Grid Size [2^n]')\n", 104 | "\n", 105 | "fig.show()" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 91, 111 | "metadata": {}, 112 | "outputs": [ 113 | { 114 | "data": { 115 | "image/png": "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\n", 116 | "text/plain": [ 117 | "
" 118 | ] 119 | }, 120 | "metadata": {}, 121 | "output_type": "display_data" 122 | } 123 | ], 124 | "source": [ 125 | "ax = sns.heatmap(before - after, vmin=-170, vmax=170, center=0, annot=True, fmt=\"3.0f\")\n", 126 | "ax.set_title('Difference in execution time in ms')\n", 127 | "ax.set_xlabel('Block Size [2^n]')\n", 128 | "ax.set_ylabel('Grid Size [2^n]')\n", 129 | "\n", 130 | "plt.show()" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": null, 136 | "metadata": {}, 137 | "outputs": [], 138 | "source": [] 139 | } 140 | ], 141 | "metadata": { 142 | "kernelspec": { 143 | "display_name": "Python 3", 144 | "language": "python", 145 | "name": "python3" 146 | }, 147 | "language_info": { 148 | "codemirror_mode": { 149 | "name": "ipython", 150 | "version": 3 151 | }, 152 | "file_extension": ".py", 153 | "mimetype": "text/x-python", 154 | "name": "python", 155 | "nbconvert_exporter": "python", 156 | "pygments_lexer": "ipython3", 157 | "version": "3.4.6" 158 | } 159 | }, 160 | "nbformat": 4, 161 | "nbformat_minor": 2 162 | } 163 | --------------------------------------------------------------------------------