#include#include#include#include//Definition of kernel function to add two variables
__global__ void gpuAdd(int d_a, int d_b, int *d_c)
{*d_c = d_a + d_b;
}
//main function
int main()
{//Defining host variable to store answer
int h_c;
//Defining device pointer
int *d_c;
//Allocating memory for device pointer
cudaMalloc((void**)&d_c, sizeof(int));
//Kernel call by passing 1 and 4 as inputs and storing answer in d_c
//<<<1,1>>>means 1 block is executed with 1 thread per block
gpuAdd<<<1, 1 >>>(1, 4, d_c);
//Copy result from device memory to host memory
cudaMemcpy(&h_c, d_c, sizeof(int), cudaMemcpyDeviceToHost);
printf("1 + 4 = %d\n", h_c);
//Free up memory
cudaFree(d_c);
return 0;
}
在 main 函數(shù)中,前兩行定義主機(jī)和設(shè)備的變量。第三行使用cudaMalloc 函數(shù)在設(shè)備上分配d_c變量的內(nèi)存。cudaMalloc 函數(shù)類似于C中的malloc 函數(shù)。在 main 函數(shù)中調(diào)用 gpuAdd,其中1和4 是兩個(gè)輸人變量,d_c是一個(gè)作為輸出指針變量的設(shè)備顯存指針。如果 gpuAdd 的結(jié)果需要在主機(jī)上使用,那么它必須從設(shè)備的內(nèi)存復(fù)制到主機(jī)的內(nèi)存中,這是由 cudaMemcpy函數(shù)完成的。然后,使用 printf 函數(shù)打印這個(gè)結(jié)果。倒數(shù)第二行使用cudaFree 函數(shù)釋放設(shè)備上使用的內(nèi)存。從程序中釋放設(shè)備上使用的所有內(nèi)存是非常重要的,否則,你可能在某個(gè)時(shí)候耗盡內(nèi)存。
雙變量加法程序有兩個(gè)函數(shù):main 和gpuAdd。如你所見,gpuAdd 是通過使用__global__關(guān)鍵字定義的,因此它用于在設(shè)備上執(zhí)行,而 main 函數(shù)將在主機(jī)上執(zhí)行。這個(gè)程序?qū)⒃O(shè)備上的兩個(gè)變量相加,并在命令行上打印輸出。
現(xiàn)在我們將看到如何通過引用傳遞參數(shù)來編寫相同的程序。為此,我們必須首先修改內(nèi)核函數(shù)來添加兩個(gè)變量。不是使用整數(shù)變量d_a和d_b作為內(nèi)核的輸入,而是將指向設(shè)備d_a和d_b上這些變量的指針作為輸入。相加后的答案會存儲在第三個(gè)整數(shù)指針d_c所指向的內(nèi)存位置。作為這個(gè)設(shè)備函數(shù)引用傳遞的指針應(yīng)該用cudaMalloc函數(shù)分配內(nèi)存。
#include#include#include#include//Kernel function to add two variables, parameters are passed by reference
__global__ void gpuAdd(int *d_a, int *d_b, int *d_c)
{*d_c = *d_a + *d_b;
}
int main()
{//Defining host variables
int h_a,h_b, h_c;
//Defining Device Pointers
int *d_a,*d_b,*d_c;
//Initializing host variables
h_a = 1;
h_b = 4;
//Allocating memory for Device Pointers
cudaMalloc((void**)&d_a, sizeof(int));
cudaMalloc((void**)&d_b, sizeof(int));
cudaMalloc((void**)&d_c, sizeof(int));
//Coping value of host variables in device memory
cudaMemcpy(d_a, &h_a, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, &h_b, sizeof(int), cudaMemcpyHostToDevice);
//Calling kernel with one thread and one block with parameters passed by reference
gpuAdd<<<1, 1 >>>(d_a, d_b, d_c);
//Coping result from device memory to host
cudaMemcpy(&h_c, d_c, sizeof(int), cudaMemcpyDeviceToHost);
printf("Passing Parameter by Reference Output: %d + %d = %d\n", h_a, h_b, h_c);
//Free up memory
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧