學習記錄 用CUDA完成泛洪演算法

2021-10-05 17:11:49 字數 2367 閱讀 6643

cuda主函式

void floodfillwithgpu( uchar * mat_data, int rows, int cols, int startx, int starty,int randr,int randg,int randb) 

cudastatus = cudamalloc((void**)&gpu_mat_state, rows * cols );

if (cudastatus != cudasuccess)

cudastatus = cudamemcpy(gpu_mat_data,mat_data,

rows * cols * 3,

cudamemcpyhosttodevice);

if (cudastatus != cudasuccess)

kernel << < 1, threadsperblock >> > (gpu_mat_data, gpu_mat_state, startx, starty, rows, cols, randr, randg, randb);

cudastatus = cudamemcpy(mat_data, gpu_mat_data,

rows * cols * 3,

cudamemcpydevicetohost);

if (cudastatus != cudasuccess)

err:

cudafree(gpu_mat_data);

cudafree(gpu_mat_state);

}

核函式

__global__ void kernel(unsigned char* mat_p, unsigned char* state_p, int startx, int starty , int rows, int cols, int randr, int randg, int randb) 

else

offset += blockdim.x;

}if (threadidx.x == 0)

__syncthreads();

while (need_continue)

state_p[offset ] = 2;

if (offset % cols == 0)

else if (offset / cols == rows -1 )

else

}else if (offset % cols == cols - 1)

else if (offset / cols == rows - 1)

else

}else if (offset / cols == 0)

else if (offset / cols == rows - 1)

else

}offset += blockdim.x;

}__syncthreads();

if (threadidx.x == 0)

else

}__syncthreads();}}

上色函式

__device__ void deal( int new_offset, unsigned char* mat_p, unsigned char* state_p,int r,int g,int b, int randr, int randg, int randb) }}

因為並行處理的存在,所以在處理塊狀區域時使用cuda比傳統cpu演算法快上不少。但對於細長條形的區域,此cuda法將比傳統cpu演算法慢上不少。當處理的區域為塊狀區域時(如下圖)

種子點取紫色區域中心時,此cuda演算法需15ms左右,傳統cpu演算法需110ms左右

種子點取藍色區域紅色『+』位置時,此cuda演算法需50ms左右,傳統cpu演算法需100ms左右

而當填充這種細長條形區域時,此cuda演算法需1s左右,而傳統cpu演算法僅需110ms左右

而當填充上圖橙紅色區域時(上圖橙紅色區域為迷宮的『路』,是完全連通的),對於這種既細長又有一定的寬度的圖形,種子點選取為左上角圓形迷宮外藍色『+』處。此時此cuda演算法需1150ms左右,傳統cpu演算法需1200ms左右。

Python學習記錄 用turtle庫繪製箭靶

思想 繪製乙個包含9個圓心的靶盤,要求最內層的圓為紅色,最外三層為黃色,其餘層為金色,所有線條為黑色 繪製箭靶 import turtle turtle.setup 設定視窗 turtle.pencolor black 設定筆的顏色為黑色 list yellow gold red 定義乙個列表,存放...

C 學習記錄(26)泛型(1)

首先介紹泛型的概念,先學習泛型的抽象術語,因為學習泛型的概念對高效使用它是至關重要的。日常生活中經常用到一些文件模板,它的格式已經寫好,我們只需要填入姓名 日期等資訊即可使用。泛型是c 乙個非常重要的特性,通過這個技術,我們可以定義像文件模板一樣的類模板。static void main strin...

C 學習記錄(27)泛型(2)

system.collections.generics命名空間 list和 dictionary兩種型別。1.list list泛型集合型別更加快捷 更易於使用 這樣,就不必像上一章那樣,從collectionbase中派生乙個類,然後實現需要的方法。listmycollection new lis...