Вы находитесь на странице: 1из 10

CUDA

From Wikipedia, the free encyclopedia Jump to: navigation, search CUDA Developer(s) Nvidia Corporation Stable release 4.2 / April 23, 2012; 51 days ago Windows XP and later, Operating system Mac OS X, Linux Platform Supported GPUs Type GPGPU License Freeware www.nvidia.com/object/cuda Website home new.html Compute Unified Device Architecture (CUDA) is a parallel computing architecture developed by Nvidia for graphics processing.[1] CUDA is the computing engine in Nvidia graphics processing units (GPUs) that is accessible to software developers through variants of industry standard programming languages. Programmers use 'C for CUDA' (C with Nvidia extensions and certain restrictions), compiled through a PathScale Open64 C compiler,[2] to code algorithms for execution on the GPU. CUDA architecture shares a range of computational interfaces with two competitors: the Khronos Group's OpenCL[3] and Microsoft's DirectCompute.[4] Third party wrappers are also available for Python, Perl, Fortran, Java, Ruby, Lua, Haskell, MATLAB, IDL, and native support in Mathematica. CUDA programming in the web browser is freely available for individual noncommercial purposes in NCLab. CUDA gives developers access to the virtual instruction set and memory of the parallel computational elements in CUDA GPUs. Using CUDA, the latest Nvidia GPUs become accessible for computation like CPUs. Unlike CPUs however, GPUs have a parallel throughput architecture that emphasizes executing many concurrent threads slowly, rather than executing a single thread very quickly. This approach of solving general purpose problems on GPUs is known as GPGPU. In the computer game industry, in addition to graphics rendering, GPUs are used in game physics calculations (physical effects like debris, smoke, fire, fluids); examples include PhysX and Bullet. CUDA has also been used to accelerate non-graphical applications in computational biology, cryptography and other fields by an order of magnitude or more.[5][6][7][8] An example of this is the BOINC distributed computing client.[9] CUDA provides both a low level API and a higher level API. The initial CUDA SDK was made public on 15 February 2007, for Microsoft Windows and Linux. Mac OS X support was later added in version 2.0,[10] which supersedes the beta released February 14, 2008.[11] CUDA works with all Nvidia GPUs from the G8x series onwards, including GeForce, Quadro and the Tesla line. CUDA is compatible with most standard operating systems. Nvidia states that programs developed for the G8x series will also work without modification on all future Nvidia video cards, due to binary compatibility.

Example of CUDA processing flow 1. Copy data from main mem to GPU mem 2. CPU instructs the process to GPU 3. GPU execute parallel in each core 4. Copy the result from GPU mem to main mem

Contents

1 Background 2 Advantages 3 Limitations 4 Supported GPUs 5 Version features and specifications 6 Example 7 Language bindings 8 Current CUDA architectures 9 Current and future usages of CUDA architecture 10 See also 11 References 12 External links

Background
See also: GPU The GPU, as a specialized processor, addresses the demands of real-time high-resolution 3D graphics compute-intensive tasks. As of 2012 GPUs have evolved into highly parallel multi core systems allowing very efficient manipulation of large blocks of data. This design is more effective

than general-purpose CPUs for algorithms where processing of large blocks of data is done in parallel, such as:

push-relabel maximum flow algorithm fast sort algorithms of large lists two-dimensional fast wavelet transform

For instance, the parallel nature of molecular dynamics simulations is suitable for CUDA implementation.[citation needed]

Advantages
CUDA has several advantages over traditional general-purpose computation on GPUs (GPGPU) using graphics APIs:

Scattered reads code can read from arbitrary addresses in memory Shared memory CUDA exposes a fast shared memory region (up to 48KB per MultiProcessor) that can be shared amongst threads. This can be used as a user-managed cache, enabling higher bandwidth than is possible using texture lookups.[12] Faster downloads and readbacks to and from the GPU Full support for integer and bitwise operations, including integer texture lookups

Limitations

Texture rendering is not supported (CUDA 3.2 and up addresses this by introducing "surface writes" to cuda Arrays, the underlying opaque data structure). Copying between host and device memory may incur a performance hit due to system bus bandwidth and latency (this can be partly alleviated with asynchronous memory transfers, handled by the GPU's DMA engine) Threads should be running in groups of at least 32 for best performance, with total number of threads numbering in the thousands. Branches in the program code do not impact performance significantly, provided that each of 32 threads takes the same execution path; the SIMD execution model becomes a significant limitation for any inherently divergent task (e.g. traversing a space partitioning data structure during ray tracing). Unlike OpenCL, CUDA-enabled GPUs are only available from Nvidia[13] Valid C/C++ may sometimes be flagged and prevent compilation due to optimization techniques the compiler is required to employ to use limited resources. CUDA (with compute capability 1.x) uses a recursion-free, function-pointer-free subset of the C language, plus some simple extensions. However, a single process must run spread across multiple disjoint memory spaces, unlike other C language runtime environments. CUDA (with compute capability 2.x) allows a subset of C++ class functionality, for example member functions may not be virtual (this restriction will be removed in some future release). [See CUDA C Programming Guide 3.1 - Appendix D.6] Double precision (CUDA compute capability 1.3 and above)[14] deviate from the IEEE 754 standard: round-to-nearest-even is the only supported rounding mode for reciprocal,

division, and square root. In single precision, denormals and signalling NaNs are not supported; only two IEEE rounding modes are supported (chop and round-to-nearest even), and those are specified on a per-instruction basis rather than in a control word; and the precision of division/square root is slightly lower than single precision.

Supported GPUs
Compute capability table (version of CUDA supported) by GPU and card. Also available directly from Nvidia
Compute capability (version) 1.0 1.1 1.2 1.3 2.0 2.1 3.0 3.5 GPUs Cards

G80, G92, G92b, GeForce 8800GTX/Ultra, 9400GT, 9600GT, 9800GT, Tesla C/D/S870, FX4/5600, G94, G94b 360M, GT 420 G86, G84, G98, G96, GeForce 8400GS/GT, 8600GT/GTS, 8800GT/GTS, 9600 GSO, 9800GTX/GX2, G96b, G94, G94b, GTS 250, GT 120/30/40, FX 4/570, 3/580, 17/18/3700, 4700x2, 1xxM, 32/370M, G92, G92b 3/5/770M, 16/17/27/28/36/37/3800M, NVS420/50 GT218, GT216, GeForce 210, GT 220/40, FX380 LP, 1800M, 370/380M, NVS 2/3100M GT215 GeForce GTX 260, GTX 275, GTX 280, GTX 285, GTX 295, Tesla C/M1060, GT200, GT200b S1070, Quadro CX, FX 3/4/5800 GeForce (GF100) GTX 465, GTX 470, GTX 480, Tesla C2050, C2070, GF100, GF110 S/M2050/70, Quadro Plex 7000, GeForce (GF110) GTX570, GTX580, GTX590 GF104, GF114, GeForce GT 430, GT 440, GTS 450, GTX 460, GTX 550 Ti, GTX 560, GTX 560 GF116, GF108, Ti, 500M, Quadro 600, 2000, 4000, 5000, 6000 GF106 GK104, GK106, GeForce GTX 690, GTX 680, GTX 670, GeForce GTX 660M, GeForce GT 650M, GK107 GeForce GT 640M GK110

A table of devices officially supporting CUDA (Note that many applications require at least 256 MB of dedicated VRAM, and some recommend at least 96 cuda cores).[13] see full list here: http://developer.nvidia.com/cuda-gpus Nvidia GeForce GeForce GTX 690 GeForce GTX 680 GeForce GTX 670 GeForce GTX 590 GeForce GTX 580 GeForce GTX 570 GeForce GTX 560 Ti GeForce GTX 560 GeForce GTX 550 Ti Nvidia GeForce Mobile GeForce GTX 660M GeForce GT 650M GeForce GT 640M GeForce GTX 580M GeForce GTX 570M GeForce GTX 560M GeForce GT 555M GeForce GT 550M GeForce GT 540M Nvidia Quadro Quadro 6000 Quadro 5000 Quadro 4000 Quadro 2000 Quadro 600 Quadro FX 5800 Quadro FX 5600 Quadro FX 4800 Quadro FX 4700 X2

GeForce GT 520 GeForce GTX 480 GeForce GTX 470 GeForce GTX 465 GeForce GTX 460 GeForce GTX 460 SE GeForce GTS 450 GeForce GT 440 GeForce GT 430 GeForce GT 420 GeForce GTX 295 GeForce GTX 285 GeForce GTX 280 GeForce GTX 275 GeForce GTX 260 GeForce GTS 250 GeForce GTS 240 GeForce GT 240 GeForce GT 220 GeForce 210/G210 GeForce GT 140 GeForce 9800 GX2 GeForce 9800 GTX+ GeForce 9800 GTX GeForce 9800 GT GeForce 9600 GSO GeForce 9600 GT GeForce 9500 GT GeForce 9400 GT GeForce 9400 mGPU GeForce 9300 mGPU GeForce 9100 mGPU GeForce 8800 Ultra GeForce 8800 GTX GeForce 8800 GTS GeForce 8800 GT GeForce 8800 GS GeForce 8600 GTS GeForce 8600 GT GeForce 8600 mGT GeForce 8500 GT

GeForce GT 525M GeForce GT 520M GeForce GTX 480M GeForce GTX 470M GeForce GTX 460M GeForce GT 445M GeForce GT 435M GeForce GT 425M GeForce GT 420M GeForce GT 415M GeForce GTX 285M GeForce GTX 280M GeForce GTX 260M GeForce GTS 360M GeForce GTS 350M GeForce GTS 260M GeForce GTS 250M GeForce GT 335M GeForce GT 330M GeForce GT 325M GeForce GT 320M GeForce 310M GeForce GT 240M GeForce GT 230M GeForce GT 220M GeForce G210M GeForce GTS 160M GeForce GTS 150M GeForce GT 130M GeForce GT 120M GeForce G110M GeForce G105M GeForce G103M GeForce G102M GeForce G100 GeForce 9800M GTX GeForce 9800M GTS GeForce 9800M GT GeForce 9800M GS GeForce 9700M GTS GeForce 9700M GT

Quadro FX 4600 Quadro FX 3800 Quadro FX 3700 Quadro FX 1800 Quadro FX 1700 Quadro FX 580 Quadro FX 570 Quadro FX 380 Quadro FX 370 Quadro NVS 450 Quadro NVS 420 Quadro NVS 295 Quadro NVS 290 Quadro Plex 1000 Model IV Quadro Plex 1000 Model S4 Nvidia Quadro Mobile Quadro 5010M Quadro 5000M Quadro 4000M Quadro 3000M Quadro 2000M Quadro 1000M Quadro FX 3800M Quadro FX 3700M Quadro FX 3600M Quadro FX 2800M Quadro FX 2700M Quadro FX 1800M Quadro FX 1700M Quadro FX 1600M Quadro FX 880M Quadro FX 770M Quadro FX 570M Quadro FX 380M Quadro FX 370M Quadro FX 360M Quadro NVS 320M Quadro NVS 160M Quadro NVS 150M Quadro NVS 140M Quadro NVS 135M

GeForce 8400 GS GeForce 8300 mGPU GeForce 8200 mGPU GeForce 8100 mGPU

GeForce 9650M GT GeForce 9650M GS GeForce 9600M GT GeForce 9600M GS GeForce 9500M GS GeForce 9500M G GeForce 9400M G GeForce 9300M GS GeForce 9300M G GeForce 9200M GS GeForce 9100M G GeForce 8800M GTX GeForce 8800M GTS GeForce 8700M GT GeForce 8600M GT GeForce 8600M GS GeForce 8400M GT GeForce 8400M GS GeForce 8400M G GeForce 8200M G

Quadro NVS 130M Nvidia Tesla Tesla K20 Tesla K10 Tesla C2050/2070 Tesla M2050/M2070 Tesla S2050 Tesla S1070 Tesla M1060 Tesla C1060 Tesla C870 Tesla D870 Tesla S870

Version features and specifications


Compute capability (version) Feature support (unlisted features are supported for all compute capabilities) 1.0 1.1 1.2 1.3 2.x 3.0 3.5 Integer atomic functions operating on 32-bit words in global memory No Yes atomicExch() operating on 32-bit floating point values in global memory Integer atomic functions operating on 32-bit words in shared memory atomicExch() operating on 32-bit floating point values in shared memory No Yes Integer atomic functions operating on 64-bit words in global memory Warp vote functions Double-precision floating-point operations No Yes Atomic functions operating on 64-bit No Yes integer values in shared memory Floating-point atomic addition operating on 32-bit words in global and shared memory _ballot() _threadfence_system() _syncthreads_count(), _syncthreads_and(),

_syncthreads_or() Surface functions 3D grid of thread block Technical specifications Maximum dimensionality of grid of thread blocks Maximum x-, y-, or z-dimension of a grid of thread blocks Maximum dimensionality of thread block Maximum x- or y-dimension of a block Maximum z-dimension of a block Maximum number of threads per block Warp size Maximum number of resident blocks per multiprocessor Maximum number of resident warps per multiprocessor Maximum number of resident threads per multiprocessor Number of 32-bit registers per multiprocessor Maximum amount of shared memory per multiprocessor Number of shared memory banks Amount of local memory per thread Constant memory size Cache working set per multiprocessor for constant memory Cache working set per multiprocessor for texture memory Maximum width for 1D texture reference bound to a CUDA array Maximum width for 1D texture reference bound to linear memory Maximum width and number of layers for a 1D layered texture reference Maximum width and height for 2D texture reference bound to a CUDA array Maximum width and height for 2D texture reference bound to a linear memory Maximum width and height for 2D texture reference bound to a CUDA array supporting texture gather Maximum width, height, and number of layers for a 2D layered texture reference Maximum width, height and depth for a 3D texture reference bound to linear memory or a CUDA array Maximum width (and height) for a cubemap texture reference Maximum width (and height) and number of layers for a cubemap layered texture reference Maximum number of textures that can be bound to a kernel Maximum width for a 1D surface reference bound to a CUDA array Maximum width and height for a 2D surface reference bound to a CUDA array Maximum number of surfaces that can be bound to a kernel Compute capability (version) 1.0 1.1 1.2 1.3 2.x 3.0 3.5 2 3 65535 231-1 3 512 1024 64 512 1024 32 8 16 24 32 48 64 768 1024 1536 2048 8K 16 K 32 K 64 K 16 KB 48 KB 16 32 16 KB 512 KB 64 KB 8 KB Device dependent, between 6 KB and 8 KB 8192 227 8192 x 512 65536 x 32768 65000 x 65000 N/A 8192 x 8192 x 512 16384 x 2048 65536 x 65535 65000 x 65000 16384 x 16384 16384 x 16384 x 2048 4096 x 4096 x 4096 16384 16384 x 2046 256 65536 Not supported 8 65536 x 32768 16 65536

2048 x 2048 x 2048 N/A N/A 128

Maximum number of instructions per kernel Architecture specifications

2 million

512 million

Number of cores for integer and floating-point arithmetic functions operations Number of special function units for single-precision floating-point transcendental functions Number of texture filtering units for every texture address unit or render output unit (ROP) Number of warp schedulers Number of instructions issued at once by scheduler

Compute capability (version) 1.0 1.1 1.2 1.3 2.0 2.1 3.0 3.5 8[15] 32 48 192 2 2 1 1 4 4 8 8 32 32

2 2 4 1 2[16] 2

For more information please visit this site: http://www.geeks3d.com/20100606/gpu-computingnvidia-cuda-compute-capability-comparative-table/ and also read Nvidia CUDA programming guide.[17]

Example
This example code in C++ loads a texture from an image into an array on the GPU:
texture<float, 2, cudaReadModeElementType> tex; void foo() { cudaArray* cu_array; // Allocate array cudaChannelFormatDesc description = cudaCreateChannelDesc<float>(); cudaMallocArray(&cu_array, &description, width, height); // Copy image data to array cudaMemcpyToArray(cu_array, image, width*height*sizeof(float), cudaMemcpyHostToDevice); // Set texture parameters (default) tex.addressMode[0] = cudaAddressModeClamp; tex.addressMode[1] = cudaAddressModeClamp; tex.filterMode = cudaFilterModePoint; tex.normalized = false; // do not normalize coordinates // Bind the array to the texture cudaBindTextureToArray(tex, cu_array); // Run kernel dim3 blockDim(16, 16, 1); dim3 gridDim((width + blockDim.x - 1)/ blockDim.x, (height + blockDim.y 1) / blockDim.y, 1); kernel<<< gridDim, blockDim, 0 >>>(d_data, height, width); // Unbind the array from the texture cudaUnbindTexture(tex); } //end foo()

__global__ void kernel(float* odata, int height, int width) { unsigned int x = blockIdx.x*blockDim.x + threadIdx.x; unsigned int y = blockIdx.y*blockDim.y + threadIdx.y; if (x < width && y < height) { float c = tex2D(tex, x, y); odata[y*width+x] = c; } }

Below is an example given in Python that computes the product of two arrays on the GPU. The unofficial Python language bindings can be obtained from PyCUDA.[18]
import import import import pycuda.compiler as comp pycuda.driver as drv numpy pycuda.autoinit

mod = comp.SourceModule(""" __global__ void multiply_them(float *dest, float *a, float *b) { const int i = threadIdx.x; dest[i] = a[i] * b[i]; } """) multiply_them = mod.get_function("multiply_them") a = numpy.random.randn(400).astype(numpy.float32) b = numpy.random.randn(400).astype(numpy.float32) dest = numpy.zeros_like(a) multiply_them( drv.Out(dest), drv.In(a), drv.In(b), block=(400,1,1)) print dest-a*b

Additional Python bindings to simplify matrix multiplication operations can be found in the program pycublas.[19]
import numpy from pycublas import CUBLASMatrix A = CUBLASMatrix( numpy.mat([[1,2,3],[4,5,6]],numpy.float32) ) B = CUBLASMatrix( numpy.mat([[2,3],[4,5],[6,7]],numpy.float32) ) C = A*B print C.np_mat()

Language bindings

Fortran - FORTRAN CUDA, PGI CUDA Fortran Compiler Haskell - Data.Array.Accelerate IDL - GPULib

Java - jCUDA, JCuda, JCublas, JCufft Lua - KappaCUDA Mathematica - CUDALink MATLAB - Parallel Computing Toolbox, Distributed Computing Server,[20] and 3rd party packages like Jacket. .NET - CUDA.NET; CUDAfy.NET .NET kernel and host code, CURAND, CUBLAS, CUFFT Perl - KappaCUDA, CUDA::Minimal Python - PyCUDA, KappaCUDA Ruby - KappaCUDA

Current CUDA architectures


The current generation CUDA architecture (codename: Fermi) which is standard on Nvidia's released (GeForce 400 Series [GF100] (GPU) 2010-03-27)[21] GPU is designed from the ground up to natively support more programming languages such as C++. It has significantly increased the peak double-precision floating-point performance compared to Nvidia's prior-generation Tesla GPU. It also introduced several new features[22] including:

up to 1024 CUDA cores and 6.0 billion transistors on the GTX 590 Nvidia Parallel DataCache technology Nvidia GigaThread engine ECC memory support Native support for Visual Studio

Current and future usages of CUDA architecture


Accelerated rendering of 3D graphics Accelerated interconversion of video file formats Accelerated encryption, decryption and compression Distributed Calculations, such as predicting the native conformation of proteins Medical analysis simulations, for example virtual reality based on CT and MRI scan images. Physical simulations, in particular in fluid dynamics. Real Time Cloth Simulation OptiTex.com - Real Time Cloth Simulation The Search for Extra-Terrestrial Intelligence (SETI@Home) program[23][24]

Вам также может понравиться