B站2.2 CUDA线程模型_哔哩哔哩_bilibili3.3. The CUDA Driver API — CUDA Programming GuideCUDA Runtime API :: CUDA Toolkit DocumentationCUDA编程模型线程模型不同block数据不共享内存架构nvcc编译流程https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#nvcc-command-options内核函数定义HelloWorldHelloWorldKernel.cu#include stdio.h __global__ void helloFromGPU() { printf(Hello World From GPU\n); } int main(int argc, char **argv) { printf(Hello World from CPU\n); helloFromGPU1, 10(); cudaDeviceReset(); return 0; }(py310) roota658a13300af:/workspace# nvcc HelloWorldKernel.cu --output-file HelloWorldKernel (py310) roota658a13300af:/workspace# ls -alh total 490M drwxr-xr-x 1 root root 4.0K Jul 25 14:59 . drwxr-xr-x 1 root root 4.0K Jul 25 12:57 .. drwxr-xr-x 2 root root 4.0K Jul 25 14:56 .ipynb_checkpoints -rwxr-xr-x 1 root root 975K Jul 25 14:59 HelloWorldKernel -rw-r--r-- 1 root root 234 Jul 25 14:59 HelloWorldKernel.cu -rw-r--r-- 1 root root 245M Jul 25 13:15 flash_attn-2.8.3.post1cu12torch2.4cxx11abiFALSE-cp310-cp310-linux_x86_64.whl -rw-r--r-- 1 root root 245M Jul 25 13:08 flash_attn-2.8.3.post1cu12torch2.4cxx11abiTRUE-cp310-cp310-linux_x86_64.whl drwxr-xr-x 5 root root 4.0K Jul 25 13:25 nano-vllm -rw-r--r-- 1 root root 411K Jul 25 13:01 nano-vllm-main.zip (py310) roota658a13300af:/workspace# ./HelloWorldKernel Hello World from CPU Hello World From GPU Hello World From GPU Hello World From GPU Hello World From GPU Hello World From GPU Hello World From GPU Hello World From GPU Hello World From GPU Hello World From GPU Hello World From GPU (py310) roota658a13300af:/workspace#GetThreadIdxKernel.cu#include stdio.h __global__ void helloFromGPU() { printf(blockDim:x%d, y%d, z%d, gridDim:x%d, y%d, z%d Current ThreadIdx: x%d, y%d, z%d\n, blockDim.x, blockDim.y, blockDim.z, gridDim.x, gridDim.y, gridDim.z, threadIdx.x, threadIdx.y, threadIdx.z); } int main(int argc, char **argv) { printf(Hello World from CPU\n); dim3 grid; grid.x 2; grid.y 2; dim3 block; block.x 2; block.y 2; helloFromGPUgrid, block(); cudaDeviceReset(); return 0; }(py310) roota658a13300af:/workspace# nvcc GetThreadIdxKernel.cu -o GetThreadIdxKernel (py310) roota658a13300af:/workspace# ./GetThreadIdxKernel Hello World from CPU blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x0, y0, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x1, y0, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x0, y1, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x1, y1, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x0, y0, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x1, y0, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x0, y1, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x1, y1, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x0, y0, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x1, y0, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x0, y1, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x1, y1, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x0, y0, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x1, y0, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x0, y1, z0 blockDim:x2, y2, z1, gridDim:x2, y2, z1 Current ThreadIdx: x1, y1, z0错误代码common.h#include sys/time.h #include cuda_runtime.h #include stdio.h cudaError_t ErrorCheck(cudaError_t status, const char *filename, int lineNumber) { if(status ! cudaSuccess) { printf(CUDA API error:\r\ncode%d, name%s, description%s\r\nfile%s, line%d\r\n, status, cudaGetErrorName(status), cudaGetErrorString(status), filename, lineNumber); return status; } return status; } #define ERROR_CHECK(status) \ ErrorCheck(status, __FILE__, __LINE__);ErrorHandlerKernel.cu#include common.h #include stdio.h int main(int argc, char *argv[]) { float *gpuMemory NULL; ERROR_CHECK(cudaMalloc(gpuMemory, sizeof(float))); ERROR_CHECK(cudaFree(gpuMemory)); ERROR_CHECK(cudaFree(gpuMemory)); ERROR_CHECK(cudaDeviceReset()); }(py310) roota658a13300af:/workspace# nvcc ErrorHandlerKernel.cu -o ErrorHandlerKernel (py310) roota658a13300af:/workspace# ./ErrorHandlerKernel CUDA API error: code1, namecudaErrorInvalidValue, descriptioninvalid argument fileErrorHandlerKernel.cu, line8API获取GPU信息https://docs.nvidia.com/cuda/cuda-runtime-api/structcudaDeviceProp.html#structcudaDevicePropGetRuntimeGPUInfoKernel.cu#include common.h #include cuda_runtime.h #include stdio.h int main(int argc, char **argv) { printf(%s Starting...\n, argv[0]); int deviceCount 0; cudaGetDeviceCount(deviceCount); if(deviceCount 0) { printf(There are no available device(s) that support CUDA\n); return 1; } else { printf(Detected %d CUDA Capable device(s)\n, deviceCount); } int dev 0, driverVersion 0, runtimeVersion 0; cudaSetDevice(dev); cudaDeviceProp deviceProp; cudaGetDeviceProperties(deviceProp, dev); printf(Device %d: \%s\\n, dev, deviceProp.name); cudaDriverGetVersion(driverVersion); cudaRuntimeGetVersion(runtimeVersion); printf( CUDA Driver Version / Runtime Version %d.%d / %d.%d\n, driverVersion / 1000, (driverVersion % 100)/10, runtimeVersion / 1000, (runtimeVersion % 100) / 10); printf( CUDA Capability Major/Minor version number: %d.%d\n, deviceProp.major, deviceProp.minor); printf( Total amount of global memory: %.2f GBytes (%llu bytes)\n, (float)deviceProp.totalGlobalMem / pow(1024.0,3), (unsigned long long)deviceProp.totalGlobalMem); printf( GPU Clock rate: %.0f MHZ (%0.2f GHz)\n, deviceProp.clockRate * 1e-3f, deviceProp.clockRate * 1e-6f); printf( Memory Clock rate: %.0f MHz\n, deviceProp.memoryClockRate *1e-3f); printf( Memory Bus Width: %d-bit\n, deviceProp.memoryBusWidth); if(deviceProp.l2CacheSize) { printf( L2 Cache Size: %d bytes\n, deviceProp.l2CacheSize); } printf( Max Texture Dimension Size (x,y,z) 1D(%d), 2D(%d,%d), 3D(%d,%d,%d)\n, deviceProp.maxTexture1D, deviceProp.maxTexture2D[0], deviceProp.maxTexture2D[1], deviceProp.maxTexture3D[0], deviceProp.maxTexture3D[1], deviceProp.maxTexture3D[2]); printf( Total amount of constant memory: %lu bytes\n, deviceProp.totalConstMem); printf( Total amount of shared memory per block: %lu bytes\n, deviceProp.sharedMemPerBlock); printf( Total number of registers available per block:%d\n, deviceProp.regsPerBlock); printf( Warp size: %d\n, deviceProp.warpSize); printf( Maximum number of MultiProcessor: %d\n, deviceProp.multiProcessorCount); printf( Maximum number of threads per multiprocessor: %d\n, deviceProp.maxThreadsPerMultiProcessor); printf( Maximum number of threads per block: %d\n, deviceProp.maxThreadsPerBlock); printf( Maximum sizes of each dimension of a block: %d x %d x %d\n, deviceProp.maxThreadsDim[0], deviceProp.maxThreadsDim[1], deviceProp.maxThreadsDim[2]); printf( Maximum sizes of each dimension of a grid: %d x %d x %d\n, deviceProp.maxGridSize[0], deviceProp.maxGridSize[1], deviceProp.maxGridSize[2]); return 0; }(py310) roota658a13300af:/workspace# nvcc GetRuntimeGPUInfoKernel.cu -o GetRuntimeGPUInfoKernel (py310) roota658a13300af:/workspace# ./GetRuntimeGPUInfoKernel ./GetRuntimeGPUInfoKernel Starting... Detected 1 CUDA Capable device(s) Device 0: NVIDIA GeForce RTX 3080 Ti CUDA Driver Version / Runtime Version 13.2 / 12.4 CUDA Capability Major/Minor version number: 8.6 Total amount of global memory: 11.63 GBytes (12491292672 bytes) GPU Clock rate: 1665 MHZ (1.66 GHz) Memory Clock rate: 9501 MHz Memory Bus Width: 384-bit L2 Cache Size: 6291456 bytes Max Texture Dimension Size (x,y,z) 1D(131072), 2D(131072,65536), 3D(16384,16384,16384) Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block:65536 Warp size: 32 Maximum number of MultiProcessor: 80 Maximum number of threads per multiprocessor: 1536 Maximum number of threads per block: 1024 Maximum sizes of each dimension of a block: 1024 x 1024 x 64 Maximum sizes of each dimension of a grid: 2147483647 x 65535 x 65535GPU架构流处理器Fermi架构Fermi架构线程束不能整除32浪费ptx兼容性设置ptx架构版本二进制兼容性设置不兼容CUDA运行时库 cuda编程核心API