数据并行性是指将计算任务围绕数据进行重组，使多个独立的计算可并行执行以提升整体效率的特性。比如将彩色图像转灰度图时，每个像素的转换计算相互独立，可由不同线程同时完成，能充分利用海量数据的并行处理潜力。
CUDA C程序执行起始于主机（CPU）的串行代码，当调用核函数（并行设备代码）时，会在设备（GPU）上生成大量线程组成的网格来执行核函数逻辑；所有核函数对应的线程网格执行完毕后，程序会回到主机端继续执行串行代码，部分场景下还可实现CPU与GPU执行的重叠以提升整体效率。
核函数是CUDA C中标记有__global__关键字的特殊函数，它规定了设备端并行执行的代码逻辑，所有线程都会执行相同的核函数代码，是实现异构并行计算中设备端并行任务的核心载体，只能由主机代码启动执行（支持动态并行的架构除外）。
CUDA核函数相关的声明关键字主要有三个，__global__标识的是可在主机端调用、在设备端执行的核函数，是实现大规模并行计算的核心函数；__device__标识的是仅能在设备端执行且只能被核函数或其他设备函数调用的函数；__host__标识的是仅在主机端执行且仅能被主机函数调用的函数，无特殊关键字的函数默认是__host__函数。
cudaMalloc是CUDA提供的用于在设备全局内存中分配存储空间的API函数，它的第一个参数需传入指向设备内存指针的地址且要强制转换为void**类型，用于接收分配的设备内存地址；第二个参数是要分配的内存字节数，其设计逻辑与C语言malloc函数相近，便于C程序员快速上手设备内存管理。
cudaMemcpy是CUDA中用于在主机内存和设备内存之间传输数据的API函数，它共有四个参数，分别是目标内存指针、源内存指针、要传输的字节数以及数据传输的方向标识（如主机到设备、设备到主机等），通过该函数可实现主机与设备间的数据交互，为核函数执行提供数据支持。
blockDim是CUDA核函数可访问的内置只读变量，它是一个包含x、y、z三个无符号整数字段的结构体，用于表示每个线程块中各维度的线程数量，其值由核函数启动时的执行配置参数决定，帮助线程确定自身在块内的相对位置。
threadIdx是CUDA核函数内的内置只读变量，同样包含x、y、z三个字段，用于标识线程在所属线程块内的唯一坐标，线程可通过该变量区分自身与块内其他线程，进而确定自己要处理的数据区域，是实现线程数据分工的关键变量。
blockIdx是CUDA核函数可访问的内置只读变量，包含x、y、z三个字段，用于标识线程所在的线程块在整个网格中的唯一坐标，同一线程块内的所有线程拥有相同的blockIdx值，结合threadIdx可实现线程在整个网格中的全局定位。
CUDA核函数启动时的执行配置参数需写在<<<>>> 符号内，主要分为两部分，第一部分用于指定网格中线程块的维度（数量），第二部分用于指定每个线程块内的线程维度（数量），通过这两个参数可灵活控制设备端并行执行的线程规模和组织形式，适配不同的数据处理需求。
因为核函数启动的线程数量通常是线程块大小的整数倍，而待处理数据的规模不一定能被线程块大小整除，为了避免超出数据范围的无效计算，需要在核函数中通过条件判断（如检查线程对应的全局索引是否小于数据总长度）过滤掉多余的线程操作，保证计算结果的正确性。
CUDA的设备全局内存是GPU专属的存储空间，由GPU硬件直接管理和访问，其访问延迟和带宽特性与GPU架构适配；而主机内存是CPU可直接访问的系统内存，二者物理上相互独立，数据无法直接跨区域访问，需通过cudaMemcpy等API函数完成数据传输。
CUDA核函数执行时会生成由大量线程构成的网格，网格采用两级层级结构，顶层是由一个或多个线程块组成的一维、二维或三维数组，底层每个线程块又是由一个或多个线程组成的一维、二维或三维数组，所有线程块尺寸一致，线程会按照该层级结构完成数据的并行处理。
CUDA采用的SPMD即单程序多数据并行编程模式，指所有线程都会执行同一核函数代码，但会基于自身的blockIdx和threadIdx等内置变量，对不同的数据片段进行处理，以此实现大规模数据的并行计算，是GPU海量并行能力的核心实现模式。
cudaFree是CUDA提供的用于释放设备全局内存空间的API函数，其参数为指向要释放的设备内存的指针，调用该函数可将之前通过cudaMalloc分配的设备内存归还给系统，避免设备内存泄漏，保障程序长期运行的稳定性。
CUDA中每个线程块的总线程数有明确上限（通常不超过1024），同时可灵活将线程块组织为一维、二维或三维结构，只要三个维度的线程数量乘积不超过总线程数上限即可，且维度选择通常会匹配数据的维度特性，以方便线程与数据的映射。
可将CUDA网格和线程块都设置为二维结构，线程通过blockIdx.x、blockDim.x和threadIdx.x计算出自身对应的二维数据水平方向索引，通过blockIdx.y、blockDim.y和threadIdx.y计算出垂直方向索引，再结合数据的行列长度做边界检查，即可实现线程与二维数据的精准映射。
__syncthreads()是CUDA中的屏障同步函数，当线程块内的某个线程调用该函数时，会在此处暂停执行，直到该线程块内所有线程都到达这个同步点，之后才能继续执行后续代码，它是实现线程块内线程间协作和数据同步的关键手段。
使用__syncthreads()时，必须保证线程块内所有线程都有机会执行到该同步点，不能出现在部分线程执行、部分线程不执行的分支逻辑中，否则会导致未执行到同步点的线程永远等待，已执行到的线程也无法继续推进，引发程序死锁或功能异常。
CUDA的透明可扩展性指同一CUDA程序无需修改代码，就能在不同硬件规格的GPU设备上运行，且能根据设备的执行资源数量自动适配执行速度，在低配置GPU上低速运行、高配置GPU上高速运行，实现了程序跨设备的灵活适配。
CUDA中线程块会以整体为单位被分配到流式多处理器（SM）上执行，一个SM可同时分配多个线程块，具体数量受SM的资源限制，如寄存器数量、共享内存大小等，只有当SM能为线程块提供足够的执行资源时，该线程块才能在其上启动执行。
可通过CUDA提供的cudaGetDeviceCount函数获取系统中可用的CUDA设备数量，再通过cudaGetDeviceProperties函数，传入设备属性结构体指针和设备编号，即可获取对应设备的详细属性，包括SM数量、最大线程块尺寸、寄存器数量等关键信息。
maxThreadsPerBlock是CUDA设备属性中的一个字段，用于表示该设备上每个线程块所能容纳的最大线程数量，不同架构的设备该数值可能不同，它是开发者设置线程块尺寸时需要遵守的重要限制条件。
warp即线程束，是CUDA设备中线程调度的基本单位，通常一个warp包含32个连续的线程，这些线程会按照SIMD（单指令多数据）模式执行，即同一时刻所有线程执行相同的指令，不同线程仅处理不同的数据。
CUDA中SM会将分配到的线程块划分为多个warp，SM的硬件执行单元会优先选择无指令依赖、可立即执行的warp进行调度；当某个warp因等待内存访问或指令执行延迟而无法推进时，SM会切换到其他就绪的warp执行，以此隐藏延迟，提升硬件资源利用率。
CUDA的延迟容忍机制是指当某个warp因等待长延迟操作（如全局内存访问、长周期算术运算）而暂停时，SM会调度其他就绪的warp在硬件执行单元上执行，将原本的等待时间转化为有效计算时间，从而提升整体的执行吞吐量，充分利用硬件资源。
CUDA中流式多处理器（SM）包含多个流处理器（SP）用于执行算术运算指令，还配备了指令获取与分发单元、共享内存、寄存器文件等核心组件，同时支持多个线程块和warp的调度与执行，是GPU并行计算的核心硬件单元。
为SM分配大量线程是为了提供足够多的可调度warp，当部分warp因等待长延迟操作而无法执行时，SM能快速切换到其他就绪warp，通过延迟容忍机制充分利用硬件执行单元，避免硬件资源闲置，保障GPU的高执行吞吐量。
CUDA中线程块的执行顺序是不确定的，不同线程块之间没有固定的执行先后关系，也无法通过代码控制其执行顺序，这种设计保障了程序的透明可扩展性，使得程序能在不同资源规模的GPU上灵活适配。
在图像模糊核函数中，对于靠近图像边界的像素，其对应的模糊邻域会超出图像有效范围，此时需要通过条件判断检查邻域内像素的坐标是否在图像的宽高范围内，仅对有效范围内的像素进行加权求和，对超出范围的像素则忽略，以此保证边界像素计算结果的正确性。
gridDim是CUDA核函数内的内置只读变量，包含x、y、z三个字段，用于表示整个线程网格中各维度的线程块数量，其值由核函数启动时的执行配置参数确定，线程可通过该变量知晓网格的整体规模，辅助完成全局数据的定位。
CUDA线程块尺寸选择需考虑多方面因素，包括设备支持的最大线程块线程数、SM的资源限制（如寄存器和共享内存容量）、数据的维度特性，同时要尽量保证线程块尺寸是warp大小的整数倍，以提升硬件执行的效率。
CUDA的零开销线程调度指SM在切换不同warp执行时，不会产生额外的硬件开销，通过硬件层面的高效调度机制，在warp之间快速切换执行上下文，从而在隐藏延迟的同时，不增加程序的执行负担，保障GPU的高执行效率。
CUDA中多维度线程块和网格的优势在于能更好地匹配多维度数据的结构，比如处理二维图像时，采用二维线程块和网格可让线程的坐标与图像的行列坐标直接对应，简化线程与数据的映射逻辑，提升代码的可读性和开发效率。
CUDA中线程同步仅能在块内实现，是因为不同线程块可能会被分配到不同的SM上执行，而不同SM之间的同步机制实现复杂且会大幅降低程序的可扩展性；块内同步则可依托SM的硬件资源高效完成，同时保障了程序的透明可扩展性。
GPU的计算能力极强，而全局内存的访问延迟高、带宽有限，若内存访问效率低下，会导致大量计算单元因等待数据而闲置，程序性能会受限于内存带宽而非计算能力，因此提升内存访问效率是释放GPU计算潜力、保障程序高性能的关键。
计算-全局内存访问比指程序中浮点计算操作的数量与全局内存访问操作数量的比值，该比值越高，说明程序对计算资源的利用率越高，越不容易受限于全局内存带宽；比值过低时，程序会呈现内存受限的特性，难以发挥GPU的计算优势。
CUDA中寄存器是线程私有的高速片上内存，访问延迟极低、带宽极高，核函数中的自动标量变量默认会分配到寄存器中，但其容量有限，每个线程可使用的寄存器数量受硬件限制，过量使用会导致SM能同时调度的线程数减少。
CUDA中共享内存是线程块内线程共享的片上内存，访问速度远快于全局内存，其生命周期与线程块一致，线程块内的所有线程都可读写共享内存，常用于存储线程块内线程需要共同访问的数据，以减少全局内存访问次数。
CUDA中的常量内存是用于存储只读全局数据的内存区域，其数据可被所有线程访问，且硬件会对常量内存的访问进行缓存优化，当多个线程访问相同的常量数据时，能大幅降低全局内存的访问压力，提升数据读取效率，适合存储核函数执行所需的固定输入参数。
CUDA全局内存的优点是容量大，可存储大规模的输入输出数据，且其数据可被所有线程和主机端访问；缺点是访问延迟高、带宽有限，未优化的全局内存访问会成为程序性能的瓶颈，需要通过各种优化手段提升其访问效率。
数据局部性指程序在执行过程中，倾向于重复访问近期使用过的数据或相邻数据的特性，包括时间局部性（同一数据被多次访问）和空间局部性（相邻数据被连续访问），利用数据局部性可通过片上内存缓存数据，减少全局内存访问，提升程序性能。
CUDA中的分块技术是将大规模数据划分为多个小尺寸的“数据块”（tile），让每个线程块仅处理一个数据块，线程块会先将对应数据块从全局内存加载到共享内存，再基于共享内存完成计算，以此提升数据访问的局部性，减少全局内存访问次数。
分块技术提升性能的核心原因是利用了数据局部性，将需要重复访问的数据缓存到高速的共享内存中，替代对高延迟、低带宽的全局内存的频繁访问；同时分块后的数据访问模式更易实现全局内存的合并访问，进一步提升内存访问效率。
矩阵乘法中使用分块技术，可将输入矩阵划分为多个子矩阵块，线程块先将子矩阵块加载到共享内存，后续计算可复用共享内存中的数据，大幅减少对全局内存的访问次数；同时合理的分块能实现全局内存的合并访问，提升内存带宽利用率，进而显著提升矩阵乘法的执行效率。
CUDA核函数中的自动数组变量通常不会分配到寄存器中，而是会被分配到全局内存，这会导致其访问延迟大幅增加，且每个线程都会拥有该数组的私有副本，因此在核函数中应尽量避免使用自动数组变量，可通过共享内存等方式替代。
CUDA中共享内存的作用域为单个线程块，即只有同一线程块内的线程才能访问该块对应的共享内存；其生命周期与线程块的执行周期一致，线程块启动时共享内存被分配，线程块执行完毕后共享内存被释放，数据无法跨线程块共享。
CUDA中常量内存的作用域覆盖整个应用的所有核函数和所有线程，即所有网格、所有线程块的线程都可访问常量内存数据；其生命周期贯穿整个应用的执行过程，数据会一直保留直到应用结束，可用于存储多个核函数都需要的固定配置参数。
虽然寄存器访问速度极快，但CUDA中每个SM的寄存器总量有限，若核函数中每个线程使用过多寄存器，会导致SM能同时调度的线程块数量减少，进而减少可调度的warp数量，降低延迟容忍能力，最终可能导致程序性能下降。
分块矩阵乘法中，当矩阵的尺寸无法被分块的尺寸整除时，部分数据块会超出矩阵的有效范围，此时需要通过边界检查判断要访问的矩阵元素是否在合法的行列范围内，仅对有效范围内的元素进行加载和计算，以此保证矩阵乘法结果的正确性。
CUDA中全局内存的访问延迟通常是片上寄存器和共享内存的数百倍，其带宽也远低于片上内存，寄存器和共享内存的聚合访问带宽比全局内存高至少两个数量级，因此减少全局内存访问、多用片上内存是提升程序性能的关键。
边角转换是CUDA中利用共享内存优化内存访问模式的技术，当算法需要按行访问数据但该模式无法实现全局内存合并访问时，可先将数据按合并访问的模式加载到共享内存，再在共享内存中按行访问数据，以此兼顾内存访问效率和算法逻辑。
CUDA中每个SM的共享内存容量有限，若分块尺寸过大，单个线程块所需的共享内存会超出硬件限制，导致SM无法同时分配多个线程块；同时共享内存不足也会限制分块技术的应用效果，无法充分利用数据局部性提升性能。
CUDA中寄存器、共享内存等片上内存资源总量有限，若核函数中每个线程或线程块占用的内存资源过多，会导致SM能同时调度的线程数和线程块数减少，可用于延迟容忍的warp数量也随之降低，硬件资源利用率下降，最终限制了程序的整体并行能力。
可通过在核函数中使用extern __shared__关键字声明无尺寸的共享内存数组，然后在核函数启动时，将共享内存的实际尺寸作为第三个执行配置参数传入，以此实现共享内存用量的动态调整，适配不同的硬件资源和算法需求。
CUDA中的全局内存合并访问指warp内的线程访问连续的全局内存地址，此时硬件会将这些分散的访问请求合并为一个或少量的内存请求，大幅提升全局内存的访问带宽利用率；若访问地址不连续，则会产生大量独立请求，降低访问效率。
在CUDA行优先存储的矩阵中，当线程按列方向访问矩阵元素时，warp内线程的访问地址是连续的，可实现全局内存的合并访问；而按行方向访问时，线程访问地址间隔较大，无法实现合并访问，因此可通过调整访问模式或使用共享内存优化来提升访问效率。
CUDA全局内存的DRAM系统会采用通道和银行的并行组织形式，通道是连接处理器和内存控制器的总线，多个通道可并行传输数据；每个通道下又会划分多个内存银行，银行可并行响应访问请求，二者共同构成了内存的并行访问架构。
多个内存通道可并行传输数据，提升数据传输的整体带宽；每个通道下的多个内存银行可并行响应不同的访问请求，将内存访问的延迟进行重叠，提升内存访问的吞吐量，二者结合可充分发挥DRAM的并行访问能力，满足GPU海量线程的内存访问需求。
因为内存通道和银行的并行访问能力需要大量的并发访问请求才能充分激活，若并行线程数量不足，内存访问请求会集中在少数通道或银行，导致部分硬件资源闲置，无法充分利用内存的并行访问带宽，进而限制程序的整体性能。
CUDA中的控制流发散指同一warp内的线程因执行不同的分支逻辑（如if-else、循环条件不同）而产生的执行路径分歧，此时硬件会为不同分支的线程分批次执行，增加了指令执行的总周期，降低了warp的执行效率。
控制流发散会导致同一warp内的线程无法同步执行，硬件需为不同分支的线程分别执行指令，增加了指令执行的总次数和总周期，降低了warp的执行吞吐量；严重的控制流发散会大幅削弱GPU的并行计算优势，导致程序性能下降。
可通过调整算法逻辑，让warp内的线程尽量执行相同的分支路径；对于边界条件导致的控制流发散，可通过提前过滤无效线程或调整数据尺寸，减少发散的warp数量；同时可利用共享内存等机制，将发散逻辑转化为统一的计算逻辑。
CUDA中的动态资源分配指SM会根据核函数的资源需求，动态将寄存器、共享内存等资源分配给不同的线程块，线程块所需资源少则SM可同时分配更多线程块，所需资源多则分配的线程块数量减少，以此实现资源的灵活调度和高效利用。
CUDA中每个SM的寄存器总量固定，若核函数中每个线程占用的寄存器数量过多，SM能同时分配的线程块数量会减少，导致SM内的活跃线程数和warp数降低，延迟容忍能力下降，硬件资源利用率不足，最终降低了程序的整体并行执行能力。
CUDA中的“性能悬崖”指当核函数的资源使用量（如寄存器、共享内存）超过某个临界值时，SM能同时调度的线程块数量会突然大幅减少，导致活跃warp数骤降，程序的执行性能出现断崖式下跌，是开发者在性能调优时需要重点规避的现象。
CUDA中每个SM的共享内存容量有限，若线程块所需的共享内存过多，SM能同时分配的线程块数量会减少，活跃线程数和warp数也随之降低；但合理使用共享内存可减少全局内存访问，提升程序整体性能，因此需平衡共享内存用量与并行性的关系。
CUDA中的线程粒度指单个线程所承担的计算任务量，线程粒度小则单个线程任务少，需要的线程总数多；线程粒度大则单个线程任务多，需要的线程总数少，合适的线程粒度需结合硬件资源和算法特性来确定。
调整线程粒度可减少线程间的冗余计算，比如让单个线程处理多个相邻的输出元素，可减少全局内存的重复访问和指令的冗余执行；同时合适的线程粒度能平衡线程数量与硬件资源的匹配度，提升硬件资源利用率和程序整体性能。
矩阵乘法中可让单个线程计算多个相邻的输出矩阵元素，比如原本一个线程计算一个元素，调整为一个线程计算同一行或同一列的多个元素，这样可减少输入矩阵数据的冗余加载，降低全局内存访问次数，同时减少指令执行的总数量。
CUDA中同一warp内的线程会严格遵循SIMD执行模式，即同一时刻所有线程执行相同的指令，只是操作的数据不同；当warp内线程出现控制流发散时，会分批次执行不同分支，直到所有分支执行完毕，再统一进入后续指令。
因为warp内的控制流发散会导致线程分批次执行不同分支，增加了指令执行的总周期，降低了warp的执行效率；大量的控制流发散会使GPU的并行计算优势无法充分发挥，程序的整体性能会受到显著影响。
归约算法中随着迭代的进行，参与计算的线程数量会逐渐减少，部分线程会因不满足计算条件而进入空闲状态，导致同一warp内的线程出现执行路径分歧，进而产生控制流发散，影响归约算法的执行效率。
可通过调整归约的迭代逻辑，让参与计算的线程尽量集中在连续的warp中，比如从后往前进行归约计算，让前半部分warp的线程参与计算、后半部分线程闲置，减少warp内的分支分歧；同时可通过循环展开等方式，进一步降低控制流发散的影响。
CUDA中的Occupancy指SM上实际活跃的线程数与SM最大可支持线程数的比值，它反映了SM硬件资源的利用程度，Occupancy越高，说明SM内的活跃warp数越多，延迟容忍能力越强，硬件资源利用率也越高。
影响CUDA Occupancy的因素包括每个线程占用的寄存器数量、每个线程块占用的共享内存大小、设备支持的最大线程块数量、每个线程块的线程数等，这些因素共同决定了SM能同时调度的线程块数和线程数，进而影响Occupancy。
可通过NVIDIA提供的CUDA Occupancy Calculator工具，输入核函数的线程块尺寸、每个线程的寄存器用量、每个线程块的共享内存用量等信息，工具会根据目标设备的硬件参数，计算出该核函数在设备上的Occupancy数值，辅助开发者进行性能调优。
CUDA中共享内存会被划分为多个独立的内存银行，当多个线程同时访问同一内存银行的不同地址时，会产生内存银行冲突，导致访问请求被串行化处理，降低共享内存的访问带宽；若线程访问不同银行的地址，则可实现并行访问。
可通过调整数据的存储布局，比如在数据数组中添加填充元素，让线程的访问地址映射到不同的内存银行；也可调整线程的访问模式，让同一warp内的线程访问不同银行的地址，以此避免或减少内存银行冲突，提升共享内存访问效率。
早期CUDA设备对全局内存的访问有严格的对齐要求，要求访问的地址必须是16字节或32字节的整数倍；现代CUDA设备虽放松了对齐要求，但对齐的访问模式仍能获得更高的访问效率，因此在编程时应尽量保证全局内存访问的地址对齐。
IEEE 754浮点数格式由符号位、指数位和尾数位三部分组成，符号位用于表示数的正负，指数位采用偏移编码方式表示数的量级，尾数位用于表示数的精度部分，通过这三部分的组合可表示不同范围和精度的浮点数。
浮点数的规格化表示是指将尾数部分调整为1.xxxxx的形式（1为隐含位，不占用尾数位空间），通过这种表示方式可使每个浮点数的表示形式唯一，同时能最大化尾数位的有效位数，提升浮点数的表示精度。
浮点数的偏移编码是指数位的编码方式，即给指数的真实值加上一个偏移量（通常为2^{n-1}-1，n为指数位的位数）得到指数的编码值，这种编码方式可将有符号的指数值转换为无符号整数，方便硬件进行大小比较。
浮点数的非规格化数是指当指数位全为0时的特殊表示形式，此时尾数不再隐含1，而是以0.xxxxx的形式存在，用于表示非常接近0的极小数值，填补了规格化数在0附近的表示间隙，提升了小数的表示精度。
浮点数的精度主要与尾数位的位数相关，尾数位的位数越多，浮点数能表示的有效数字就越多，精度也就越高；单精度浮点数尾数位为23位，双精度浮点数尾数位为52位，因此双精度浮点数的精度远高于单精度。
ULP即最后一位的单位，指相邻两个可表示浮点数之间的差值，它是衡量浮点数表示精度和计算误差的重要指标，ULP值越小，说明浮点数的表示精度越高，计算结果的误差也越小。
浮点数运算的准确度指浮点数运算结果与真实数学结果的接近程度，通常用运算结果的最大ULP误差来衡量，若运算的最大ULP误差不超过0.5，则说明该运算具有较高的准确度，能满足大部分数值计算的需求。
浮点数运算中的舍入误差源于浮点数的有限精度表示，当运算结果的尾数位数超过浮点数尾数位的最大长度时，需要对超出部分进行舍入处理，这会导致运算结果与真实值之间产生偏差，进而形成舍入误差。
因为浮点数的加法不满足严格的结合律，不同的加法顺序会产生不同的舍入误差，并行归约会改变传统串行归约的加法顺序，导致最终的累加结果与串行结果存在偏差，这种偏差的大小与数据的分布和运算顺序密切相关。
可通过对数据进行预排序，让数值相近的数据先进行累加，减少大数吞小数的现象；也可采用补偿求和算法（如Kahan求和算法），通过记录累加过程中的误差来修正最终结果；同时可选择更高精度的浮点数类型（如双精度）进行计算。
NaN即非数值，是IEEE 754格式中的特殊值，当指数位全为1且尾数位不全为0时表示NaN，用于表示无效的浮点运算结果（如0/0、∞-∞）；无穷大是指数位全为1且尾数位全为0时的特殊值，分为正无穷和负无穷，用于表示超出浮点数表示范围的数值（如大数除以0）。
信号NaN和安静NaN是NaN的两种类型，信号NaN的尾数位最高位为0，当运算中出现信号NaN时会触发硬件异常，常用于调试未初始化的数据；安静NaN的尾数位最高位为1，运算中出现安静NaN时不会触发异常，仅会传播NaN值，常用于表示无效数据。
数值算法的稳定性指算法在执行过程中，对输入数据的微小扰动或计算过程中的舍入误差的抵抗能力，稳定的算法会使这些误差在计算过程中不会被放大，最终结果仍能保持较高的准确度；不稳定的算法则会放大误差，导致结果严重偏离真实值。
传统高斯消元法在消元过程中若主元（当前列的最大元素）过小，用其作为除数会导致后续计算的舍入误差被大幅放大，进而影响最终解的准确度；当主元为0时，传统高斯消元法甚至无法继续执行，因此会出现数值不稳定性。
高斯消元法的选主元技术是指在每一步消元前，选择当前列中绝对值最大的元素作为主元，并通过行交换将其换到主对角线位置，再进行消元计算，这种技术可避免因主元过小或为0导致的数值不稳定性，提升算法的数值稳定性。
浮点数的表示范围主要由指数位的位数决定，指数位的位数越多，浮点数能表示的量级范围就越大，可表示的极大数和极小数的范围也就越广；单精度浮点数指数位为8位，双精度为11位，因此双精度浮点数的表示范围远大于单精度。
浮点数的下溢是指计算结果的绝对值小于浮点数能表示的最小规格化数，此时会自动转换为非规格化数或0；浮点数的上溢是指计算结果的绝对值大于浮点数能表示的最大数，此时会转换为无穷大，这两种情况都会导致计算结果的精度损失或失效。
一方面是因为浮点数运算不满足严格的结合律和交换律，并行算法改变了运算的顺序，导致舍入误差的累积方式与串行算法不同；另一方面是并行算法可能采用了不同的计算策略，这些策略会引入新的数值误差，最终导致结果存在差异。
单精度浮点数占用4字节空间，指数位8位、尾数位23位，可表示的数值范围约为{10}^{-38}到{10}^{38}，有效数字约6-7位；双精度浮点数占用8字节空间，指数位11位、尾数位52位，可表示的数值范围约为{10}^{-308}到{10}^{308}，有效数字约15-16位，双精度在范围和精度上均远超单精度。
数值计算中的大数吞小数现象是指当一个极大的浮点数与一个极小的浮点数相加时，由于浮点数的尾数位精度有限，极小的数会被极大的数“吞噬”，相加结果等于极大的数，导致小数的贡献完全丢失，这种现象会严重影响累加类计算的精度。
