CUDA全局变量(__device__)的初始化与使用:cudaMemoryToSymbol、cudaMemoryFromSymbol、cudaGetSymbolAddress
在cuda中在设备(device)中声明一个全局变量用__device__关键字修饰:
__device__ float devData;
初始化为:
float value = 3.14f;
cudaMemcpyToSymbol(devData, &value, sizeof(float));
在使用结束后,将其转回host:
cudaMemcpyFromSymbol(&value, devData, sizeof(float))
给出整体的代码(原代码来源《CUDA C语言编程中文版》 源码网址)
#include "../common/common.h"
#include <cuda_runtime.h>
#include <stdio.h>/** An example of using a statically declared global variable (devData) to store* a floating-point value on the device.*/__device__ float devData;__global__ void checkGlobalVariable()
{// display the original valueprintf("Device: the value of the global variable is %f\n", devData);// alter the valuedevData += 2.0f;
}int main(void)
{// initialize the global variablefloat value = 3.14f;CHECK(cudaMemcpyToSymbol(devData, &value, sizeof(float)));printf("Host: copied %f to the global variable\n", value);// invoke the kernelcheckGlobalVariable<<<1, 1>>>();// copy the global variable back to the hostCHECK(cudaMemcpyFromSymbol(&value, devData, sizeof(float)));printf("Host: the value changed by the kernel to %f\n", value);CHECK(cudaDeviceReset());return EXIT_SUCCESS;
}
编译与运行:
-bash-4.1$ nvcc -o a globalVariable.cu
-bash-4.1$ ./a
Host: copied 3.140000 to the global variable
Device: the value of the global variable is 3.140000
Host: the value changed by the kernel to 5.140000
-bash-4.1$
当然,也可以通过获取与提供设备符号相关的全局内存的物理地址来对全局变量进行使用。在上程序代码中加上如下内容:
float *dp = NULL;cudaGetSymbolAddress((void**)&dp,devData);cudaMemcpy(dp,&value,sizeof(float),cudaMemcpyHostToDevice);// invoke the kernelcheckGlobalVariable<<<1, 1>>>();// copy the global variable back to the hostCHECK(cudaMemcpyFromSymbol(&value, devData, sizeof(float)));printf("Host: the value changed by the kernel to %f\n", value);
其输出结果为:
-bash-4.1$ nvcc -o a globalVariable.cu
-bash-4.1$ ./a
Host: copied 3.140000 to the global variable
Device: the value of the global variable is 3.140000
Host: the value changed by the kernel to 5.140000
Device: the value of the global variable is 5.140000
Host: the value changed by the kernel to 7.140000
-bash-4.1$
存在一种仅需简单指针引用,就可以让主机和设备代码直接访问,这就是 CUDA固定内存。
CUDA全局变量(__device__)的初始化与使用:cudaMemoryToSymbol、cudaMemoryFromSymbol、cudaGetSymbolAddress相关推荐
- java全局变量初始化_为什么 Java 中全局变量不一定初始化,局部变量必须初始化?...
前几天,有个大佬考了我一个问题:为什么类的成员变量不需要指定值就可以自动赋予初始值,而方法内的局部变量就必须指定初始值呢? 说实话,这个问题确实难倒我了,之后我在网上一顿操作,终于把这个问题弄得稍微明 ...
- 全局变量用常量初始化----C和C++的不同
有两个程序: int i=10; int j=i+4; main(){} /***********************/ int i=10; main() {static int j=i;} /* ...
- 学习笔记:全局变量定义“无须”初始化,局部变量必须初始化
举例: public class Test {int a,b=10; //全局变量public static void main(String[] args) {// int c,d=10; //局部 ...
- 全局变量和局部变量初始化问题
总结 这里需要分清一个事实,是变量系统都会默认给初始化,只不过全局变量默认初始化为0,而局部变量被初始化为随机数,这个随机数用不了,后面会验证. 现在,我们要讨论的是程序猿或者程序媛需不需要给全局变量 ...
- Java全局变量和局部变量初始化问题
变量的初始化问题 我们先来看一个例子,最近在知乎看到的帖子. public class TestDemo {int a; //类的成员变量public static void main(String[ ...
- c++ 全局变量初始化的一点总结
注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档. 什么时候初始化 根据 C++ 标准,全局变量的初始化要在 main 函数 ...
- 全局对象_C++全局变量初始化
c++ 全局变量初始化的一点总结 对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的:如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化.由于内置变量无须资源释放操作,仅需 ...
- 关于对于c语言全局变量初始化问题
1: 强弱符号学说: 在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里: int x =0; 跟 int x; 的效果看起来是一样的.但其实这里面的差别很大,强烈建议大家所有的全局 ...
- leetcode全局变量初始化问题,报错 AddressSanitizer: heap-buffer-overflow on address
结论:leetcode中,全局变量需在函数中做初始化.因为:leetcode"提交"的代码,全局变量定义时做的初始化,可能并没有成功. 简单举例: // 报错 int a = 0; ...
最新文章
- 在决策树类相关算法中,一个接点的基尼系数通常是大于还是小于他的父节点?是总是大于还是总是小于?
- struts2的多个文件上传思路,小例子 ,仅供参考
- FPGA之道(27)VHDL的操作符号
- 关于Two pointers的个人理解
- PowerDesigner模型设计
- linux ffmpeg加速和合并视频命令
- 搞商业智能需要“智慧”
- latex中括号大小控制 [转]
- linux socket 加锁,Linux使用openssl对socket加密【1】
- android空格对齐
- 男生学计算机怎么样,男生学计算机专业好不好?
- 和大家一起分享几组Android游戏源码
- loadrunner安装缺少vc2005
- 北京新版城市总体规划解读
- 中国人误传了数千年的七句话(不可不看!) 转帖
- Originpro绘制y轴偏移堆积图无法设置偏移量
- 如何快速上线、部署javaweb项目
- React最佳实践系列 —— Dva快速入门
- w ndows10支持微信吗,windows10系统怎样安装微信客户端
- Content Size Fitter组件的使用