1. 程式人生 > >取模 乘法和除法運算在CPU和GPU上的效率

取模 乘法和除法運算在CPU和GPU上的效率

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

問題:

    將整數n分解為i和j,滿足下面關係:

n  =  j * idim + i

    其中idim為常量。

    以下為三種演算法實現:
    1) i = n % idim,j = (n - i) / idim

    2) j = n * ridim,i = n - j * idim,其中ridim = 1.0f / idim,為浮點數。

    3) i = n % idim,j = (n - i) * ridim,其中ridim = 1.0f / idim,為浮點數。

 

CPU上的實現程式碼如下:

// 演算法1for(int ii, i = 0; i < size; i++){    ii = N[i] % IDIM;    I[i] = ii;    J[i] = (N[i] - ii) / IDIM;}// 演算法2:R1 = 1.0f/IDIM
for(int i=0,j=0;i<size;i++){    j = floor(N[i]*R1);    I[i] = N[i] - j*IDIM;    J[i] = j;}// 演算法3:R1 = 1.0f / IDIMfor(int i = 0, ii = 0; i < size; i++){    ii = N[i] % IDIM;    I[i] = ii;    J[i] = (N[i] - ii) * R1;}

GPU上的實現程式碼如下:

// 演算法1__global__ void kernel1(int *N, int *I, int *J, int IDIM, int JDIM){    int tid = blockIdx.x * blockDim.x + threadIdx.x;    if(tid < IDIM * JDIM)    {        int n = N[tid];        int i = n % IDIM;        I[tid] = i;        J[tid] = (n - i) / IDIM;    }}// 演算法2:R1 = 1.0f/IDIM__global__ void kernel2(int *N, int *I, int *J, int IDIM, int JDIM){    int tid = blockIdx.x * blockDim.x + threadIdx.x;    int n, j;    if(tid < IDIM * JDIM)    {        n = N[tid];        j = floor(n*R1);        I[tid] = n - j * IDIM;        J[tid] = j;    }}// 演算法3:R1 = 1.0f / IDIM__global__ void kernel3(int *N, int *I, int *J, int IDIM, int JDIM, float R1){    int tid = blockIdx.x * blockDim.x + threadIdx.x;    if(tid < IDIM * JDIM)    {        int n = N[tid];        int i = n % IDIM;        I[tid] = i;        J[tid] = (n - i) * R1;    }}

計算效率如下:

N = 1000000, IDIM = 1000, JDIM = 1000

Core2 Q6600:

    演算法1:  17 ms

    演算法2:  34 ms

    演算法3:  16 ms

GTX280:

    演算法1:   0.36 ms

    演算法2:   0.14 ms

    演算法3:   0.23 ms

CUDA Visual Profiler的檢測結果顯示: 演算法1的指令數高達98xxx,而演算法2指令數僅為29xxx,演算法3的指令數為65xxx。整數除法再一次應驗了手冊上的那句話:

Integer division and modulo operation are particularly costly and should be avoided...

但是好像取模運算並沒有想象中的那麼慢。

 

結論:

對於CPU,最好採用取模運算,整數除法和單精度乘法的效率差不多。

對於GPU,採用浮點運算最快,其次是取模運算,整數除法最慢。


http://www.cnblogs.com/codezhang/archive/2009/06/19/1506532.html 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述