过去一周在公司在写cuda代码,主要是做数据包处理,现把当中遇到的一些技术问题和解决办法记录总结一下,以作备忘,若能对其他朋友有帮助的更是极好:)
/********************************************/
cuda环境变量设置:
在使用deb文件安装完CUDA以后,发现man nvcc找不到,原来是PATH环境变量没有加进去,
在~/.profile最后两行加入
export PATH=/usr/local/cuda-5.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-5.5/lib:$LD_LIBRARY_PATH
【待验证】
顺便复习一下linux添加环境变量还有别的方法,主要是作用域不同
1. /etc/profile: 在登陆时,为每个用户设置,当用户第一次登陆的时候文件被执行。
2. /etc/environment,在登陆时,在读取用户自己的profile前生效
3. ~/.profile: 登陆时生效,每个用户专用。
4. /etc/bashrc: 为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。
5. ~/.bashrc : 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
/******************************************************************/
cuda 返回invalid device ordinal错误问题:
运行deviceQuery的时候返回该错误,错误代码为10。网上稍微查了一下,说是另外有个驱动程序(nouveau)在占用GPU,因此可以通过禁止X server加载该驱动。
解决方法:
Create a file in /etc/modprobe.d called blacklist-nouveau.conf
Add the following two lines:
blacklist nouveau
options nouveau modeset=0
Then reboot the pc.
Add the following two lines:
blacklist nouveau
options nouveau modeset=0
Then reboot the pc.
/****************************************************************/
cuda分配mapped pinned memory(无需cudaMemcpy):
- 使用cudaHostAlloc的cudaHostAllocMapped模式,可以把主机内存地址map到CUDA 地址空间,
- 然后在主机代码中调用cudaHostGetDevicePointer可以得到device端访问该内存的指针,
- 可以把得到的device pointer传递到Kernel中,在device代码中直接解析。
/*****************************************************************/
cuda-gdb调试模式设置:
需要nvcc编译时刻加上 -g -G选项,-g是device code -G是host code留下 symbol
使用cuda makefile模板,里边有对环境变量ifeq($(dbg),1)来判断是编译成可debug版本还是release版本,所以如果需要调试,需要
# Debug build flags
ifeq ($(dbg),1)
NVCCFLAGS += -g -G
TARGET := debug
else
TARGET := release
endif
ifeq ($(dbg),1)
NVCCFLAGS += -g -G
TARGET := debug
else
TARGET := release
endif
因此,在make之前先手动export dbg=1。
/*****************************************************************/
多显卡系统通过槽位来指定显卡输出:
opennetbox上面8个pci-e插槽,插槽位应该是有先后之分,买了两显卡lspci看到两个VGA compatible controller,在系统启动的时候应该是插槽位低的被选中作为VGA输出。
/************************************************************/
网络字节序&主机字节序问题:
做IP地址提取查表的时候遇到的问题,从数据包中提取得到的32为IPv4地址,存放在四个连续的字节当中。
|192|168|0|1|
但是如果直接将指针类型转换为int*去进行解析,得到的将是0x0100a8c0,正好反过来了,所以需要对四个字节进行逆序重组,进行网络字节序和主机字节序的转换。
/************************************************************/
C++中原生bool类型存储空间为1个字节:
C++中 bool类型, sizeof(bool)等于1个字节,实际存储的时候也占用一个字节,false的时候值为0,true的时候值非零,但不一定是1。
对于bool类型数组,每一个元素占用空间未1个字节!!