cuda程式的字尾為.cu,編譯時使用nvcc,其使用方法與gcc相似。例如nvcc test.cu -o test
nvcc的官方文件
1。首先遇到錯誤
fatal error: cutil.h: no such file or directory
kmp.cu(62): error: identifier "cutcreatetimer" is undefined
kmp.cu(63): error: identifier "cutstarttimer" is undefined
kmp.cu(73): error: identifier "cutstoptimer" is undefined
kmp.cu(74): error: identifier "cutgettimervalue" is undefined
kmp.cu(75): error: identifier "cutdeletetimer" is undefined
5 errors detected in
the compilation of
"/tmp/tmpxft_00001b6b_00000000-9_kmp.cpp1.ii".
因此可以基本判定,cutcreatetimer、cutstarttimer、cutstoptimer、cutgettimervalue、cutdeletetimer這幾個函式應該是在cutil.h中支援的。經過查詢,這些的確是cutil.h支援的。而這些函式的功能是記錄程式的執行時間,因此可以尋找cuda中其他記錄時間的方法。
查詢發現event可以做到,使用方法可以參考官方api:
programing guide -> 3.2.5.6 events
我的使用方法如下
cudaevent_t start, stop;
cudaeventcreate(&start);
cudaeventcreate(&stop);
dim3 block(16,16);
dim3 grid(t_len/256+1,1);
cudaeventrecord(start, 0);
kmp_kernel<>>(dd,d_len,t_len,d_text,d_num);
cudamemcpy(num,d_num,sizeof(int),cudamemcpydevicetohost);
cudaeventrecord(stop, 0);
//synchronize
cudaeventsynchronize(start); //optional
cudaeventsynchronize(stop); //wait for the event to be executed!
//calculate time
float dt_ms;
cudaeventelapsedtime(&dt_ms, start, stop);
printf("gpu processing time: %f (ms)\n", dt_ms);
cudaeventdestroy(start);
cudaeventdestroy(stop);
以上參考:
未定義的錯誤解決了
2。然後又遇到編譯錯誤
/tmp/tmpxft_00001c27_00000000-29_kmp_kernel.o: in function `__device_stub__z10kmp_kernelpciis_pi(char*, int, int, char*, int*)':
tmpxft_00001c27_00000000-9_kmp_kernel.cudafe1.cpp:(.text+0x63): multiple definition of `__device_stub__z10kmp_kernelpciis_pi(char*, int, int, char*, int*)'
/tmp/tmpxft_00001c27_00000000-21_kmp.o:tmpxft_00001c27_00000000-4_kmp.cudafe1.cpp:(.text+0x267): first defined here
/tmp/tmpxft_00001c27_00000000-29_kmp_kernel.o: in function `kmp_kernel(char*, int, int, char*, int*)':
tmpxft_00001c27_00000000-9_kmp_kernel.cudafe1.cpp:(.text+0x13c): multiple definition of `kmp_kernel(char*, int, int, char*, int*)'
/tmp/tmpxft_00001c27_00000000-21_kmp.o:tmpxft_00001c27_00000000-4_kmp.cudafe1.cpp:(.text+0x340): first defined here
collect2: error: ld returned 1 exit status
這是因為kmp_kernel被重複定義了
我有三個檔案kmp.cu、kmp_kernel.cu、test_file.h,並且kmp.cu中include了後兩個檔案,編譯命令是
nvcc kmp.cu kmp_kernel.cu -o test
於是報錯。
include了在編譯時就不需要加上該檔名了
在編譯時加上檔名就不需要再include了
參考:3。 使用cpu執行字串匹配程式與gpu字串匹配進行對比
cpu版本的單執行緒實現程式如下:
#include
#include
#include
char text = "寫上一大堆文字當做查詢庫"; //字串庫
int main()else
if(j>=d_num)
}clock_gettime(clock_monotonic, &tpend);
timedif = 1000*(tpend.tv_sec-tpstart.tv_sec) + (tpend.tv_nsec - tpstart.tv_nsec)/1000000;
printf("the resule is: %d\n", n);
printf("time: %ldms\n", timedif);
return
0;}
將以上部分新增到主程式即可。 字串匹配
題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...
字串匹配
time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1,第二行代表string2,string1和string2中保證不出現...
字串匹配
面試題 給一串很長的字串,要求找到符合要求的字串,例如目的串 123 1 3 2 12 3 這些都要找出來 思路一 利用兩層迴圈,逐個查詢目的串中的字元,比如先查詢字元 1 是否在長字串中,再查詢 2 是否在長字串中,直到目的串遇到 0 是 include include include int m...