CUDAC双变量加法-创新互联

#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 函数中,前两行定义主机和设备的变量。第三行使用cudaMalloc 函数在设备上分配d_c变量的内存。cudaMalloc 函数类似于C中的malloc 函数。在 main 函数中调用 gpuAdd,其中1和4 是两个输人变量,d_c是一个作为输出指针变量的设备显存指针。如果 gpuAdd 的结果需要在主机上使用,那么它必须从设备的内存复制到主机的内存中,这是由 cudaMemcpy函数完成的。然后,使用 printf 函数打印这个结果。倒数第二行使用cudaFree 函数释放设备上使用的内存。从程序中释放设备上使用的所有内存是非常重要的,否则,你可能在某个时候耗尽内存。
双变量加法程序有两个函数:main 和gpuAdd。如你所见,gpuAdd 是通过使用__global__关键字定义的,因此它用于在设备上执行,而 main 函数将在主机上执行。这个程序将设备上的两个变量相加,并在命令行上打印输出。

创新互联公司专注于根河企业网站建设,成都响应式网站建设公司,商城网站建设。根河网站建设公司,为根河等地区提供建站服务。全流程按需制作,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务

现在我们将看到如何通过引用传递参数来编写相同的程序。为此,我们必须首先修改内核函数来添加两个变量。不是使用整数变量d_a和d_b作为内核的输入,而是将指向设备d_a和d_b上这些变量的指针作为输入。相加后的答案会存储在第三个整数指针d_c所指向的内存位置。作为这个设备函数引用传递的指针应该用cudaMalloc函数分配内存。

#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;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章标题:CUDAC双变量加法-创新互联
转载来源:http://myzitong.com/article/dhicoo.html