Cuda 着色器单元计算指数吗

Cuda 着色器单元计算指数吗,cuda,Cuda,表示“GTX Titan-Z”有5760个着色器单元。这里还写着“GTX Titan-Z”有2个GK110 GPU 提到可以在cuda中计算指数 假设我有一个50万(五亿)倍的数组。我想计算数组中每个值的指数。谁知道会发生什么:5760个着色器单元将能够计算exp,或者这个任务只能用两个GK110 GPU完成?性能上的差异是单调的,所以我需要确定,如果我用CUDA重写我的应用程序,那么它的运行速度不会变慢 换句话说,我可以用5760个线程来计算5000000个指数吗?GTX Titan Z是一个

表示“GTX Titan-Z”有5760个着色器单元。这里还写着“GTX Titan-Z”有2个GK110 GPU

提到可以在cuda中计算指数

假设我有一个50万(五亿)倍的数组。我想计算数组中每个值的指数。谁知道会发生什么:5760个着色器单元将能够计算exp,或者这个任务只能用两个GK110 GPU完成?性能上的差异是单调的,所以我需要确定,如果我用CUDA重写我的应用程序,那么它的运行速度不会变慢


换句话说,我可以用5760个线程来计算5000000个指数吗?

GTX Titan Z是一个双GPU设备。卡上的两个GK110 GPU都通过384位内存接口连接到自己的6 GB高速内存。每个内存的理论带宽为336 GB/秒。GTX Titan Z中使用的特定GK110变体由15个名为SMX的执行单元集群组成。每个SMX依次由192个单精度浮点单元、64个双精度浮点单元和各种其他单元组成

GK110中的每个双精度单元可以在每个时钟周期执行一个FMA(融合乘法加法)、一个FMUL或一个FADD。因此,在705 MHz的基准时钟下,每秒可由Titan Z上的每个GK110 GPU执行的DP操作的最大总数为705e6*15*64=676.8e9。假设所有操作都是FMA,则等于1.3536双精度TFLOP。由于该卡使用两个GPU,因此GTX Titan Z的总DP性能为2.7072 TFLOPS

与CPU一样,GPU通过各种整数和浮点单元提供通用计算。GPU还提供特殊的函数单元(在GK110上称为MUFU=multifuNCION单元),可以计算一些常用函数的粗略单精度近似值,如倒数、倒数平方根、正弦、余弦、指数基2和基于对数的2。就求幂而言,标准单精度数学函数
exp2f()
是唯一或多或少直接映射到MUFU指令(
MUFU.EX2
)的函数。根据编译模式,此硬件指令周围有一个薄包装器,因为硬件不支持特殊函数单元中的非规范操作数

CUDA中的所有其他指数运算均通过软件子程序执行。标准的单精度函数
expf()。双精度
exp()
函数是一个基于极大极小多项式近似的纯软件例程。它的完整源代码在CUDA头文件
math\u functions\u dbl\u ptx3.h
中可见(在CUDA 6.5中,DP
exp()
代码从该文件的第1706行开始)。如您所见,计算主要涉及双精度浮点运算,以及整数和一些单精度浮点运算。您还可以通过使用
cuobjdump--dump sass
反汇编调用
exp()
的二进制可执行文件来查看机器代码

就性能而言,在CUDA 6.5中,双精度
exp()
函数在特斯拉K20(1.170 DP TFLOPS)上的吞吐量约为每秒25e9函数调用。由于每次调用DP
exp()
都会消耗一个8字节的源操作数并生成一个8字节的结果,因此这大约相当于400 GB/秒的内存带宽。由于Titan Z上的每个GK110提供的性能比特斯拉K20上的GK110高出约15%,因此吞吐量和带宽需求相应增加。由于所需带宽超过GPU的理论内存带宽,因此仅将DP
exp()
应用于阵列的代码将完全受内存带宽的限制

GPU中功能单元的数量和执行的线程的数量与可处理的数组元素的数量没有关系,但会对此类处理的性能产生影响。程序员可以自由选择数组元素到线程的映射。一次可以处理的数组元素的数量是GPU内存大小的函数。请注意,并非设备上的所有原始内存都可用于用户代码,因为CUDA软件堆栈需要一些内存供自己使用,通常约为100 MB左右。将DP
exp()
应用于数组的示例性映射如以下代码段所示:

__global__ void exp_kernel (const double * __restrict__ src, 
                            double * __restrict__ dst, int len)
{
    int stride = gridDim.x * blockDim.x;
    int tid = blockDim.x * blockIdx.x + threadIdx.x;
    for (int i = tid; i < len; i += stride) {
        dst[i] = exp (src[i]);
    }
}    

#define ARRAY_LENGTH (500000000)
#define THREADS_PER_BLOCK  (256)
int main (void) {
    // ...
    int len = ARRAY_LENGTH;
    dim3 dimBlock(THREADS_PER_BLOCK);
    int threadBlocks = (len + (dimBlock.x - 1)) / dimBlock.x;
    if (threadBlocks > 65520) threadBlocks = 65520;
    dim3 dimGrid(threadBlocks);
    double *d_a = 0, *d_b = 0;

    cudaMalloc((void**)&d_a, sizeof(d_a[0]), len);
    cudaMalloc((void**)&d_b, sizeof(d_b[0]), len);
    // ...
    exp_kernel<<<dimGrid,dimBlock>>>(d_a, d_b, len);
    // ...
}
\uuuuu全局\uuuuuu无效exp\u内核(const double*\uuuu restrict\uuuuuu src,
双*uuu限制uuu dst,整数长度)
{
int stride=gridDim.x*blockDim.x;
int tid=blockDim.x*blockIdx.x+threadIdx.x;
对于(int i=tid;i65520)螺纹块=65520;
dim3 dimGrid(螺纹块);
双*d_a=0,*d_b=0;
cudamaloc((void**)和d_a,sizeof(d_a[0]),len;
Cudamaloc((void**)和d_b,sizeof(d_b[0]),len;
// ...
exp_内核(d_a,d_b,len);
// ...
}

GTX Titan Z是一款双GPU设备。卡上的两个GK110 GPU都通过384位内存接口连接到自己的6 GB高速内存。每个内存的理论带宽为336 GB/秒。GTX Titan Z中使用的特定GK110变体由15个名为SMX的执行单元集群组成。每个SMX依次由192个单精度浮点单元、64个双精度浮点单元和各种其他单元组成

GK110 c中的每个双精度单元