我使用tensorflow安装了virtualenv,并将Python解释器设置更改为virtualenv所在的位置.当我运行程序时,它会给出错误:
ImportError: libcudnn.so.5: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我在.bashrc文件中写了以下行
export CUDA_HOME=/usr/local/cuda-8.0
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH
export PATH=${CUDA_HOME}/bin:${PATH}
Run Code Online (Sandbox Code Playgroud)
另外,我在以下路径中找到了libcudnn.so.5文件:
/usr/local/cuda-8.0/lib64
Run Code Online (Sandbox Code Playgroud)
我在打开PyCharm之前遇到了这个错误,我确实设法安装了正确的cudnn版本.问题是,我可以使用
$ source [virtualenv_path]
Run Code Online (Sandbox Code Playgroud)
激活virtualenv并在终端中运行python,一切正常,没有显示错误.程序也在Pycharm的终端中运行没有错误,但只要我点击运行按钮就会给我上面的错误.环境变量还有问题吗?我如何解决它?
我注意到,当我创建一个字符数组来保存CI中的字符串时,总是需要在结尾添加一个空零作为终结符.例如:
char Month[10];
Month[0] = 'M';
Month[1] = 'a';
Month[2] = 'r';
Month[3] = 'c';
Month[4] = 'h';
Month[5] = '\0';
Run Code Online (Sandbox Code Playgroud)
这里我需要添加Month[5] = '\0'以使char数组显示正确的结果.如果我忽略零值,它将给出结果March_\377.但是在Java中我仍然可以在March不添加null零的情况下获得.我想知道C和Java如何以不同的方式处理这种情况?
我有一个使用协作组来执行某些操作的代码。因此我用以下方法编译我的代码:
/usr/local/cuda/bin/nvcc -arch=sm_61 -gencode=arch=compute_61,code=sm_61, --device-c -g -O2 foo.cu
Run Code Online (Sandbox Code Playgroud)
然后我尝试调用设备链接器:
/usr/local/cuda/bin/nvcc -arch=sm_61 -gencode=arch=compute_61,code=sm_61, -g -dlink foo.o
Run Code Online (Sandbox Code Playgroud)
然后它会产生错误:
ptxas 错误:文件使用太多全局常量数据(0x10100 字节,最大 0x10000)
该问题是由我分配常量内存的方式引起的:
__constant__ float d_cnst_centers[CONST_MEM / sizeof(float)];
Run Code Online (Sandbox Code Playgroud)
其中 CONST_MEM = 65536 字节,这是我从 SM_61 的设备查询中获得的。但是,如果我将常量内存减少到 64536 之类的值,问题就消失了。这几乎就像在编译期间为了某些目的而“保留”常量内存一样。我搜索了 CUDA 文档,但没有找到满意的答案。使用可用的最大常量内存是否安全?为什么会出现这个问题呢?
编辑:这是在 SM_61 上触发错误的代码片段:
#include <algorithm>
#include <vector>
#include <type_traits>
#include <cuda_runtime.h>
#include <cfloat>
#include <iostream>
#include <cooperative_groups.h>
using namespace cooperative_groups;
struct foo_params {
float * points;
float * centers;
int * centersDist;
int * centersIndex;
int numPoints;
};
__constant__ float d_cnst_centers[65536 / sizeof(float)]; …Run Code Online (Sandbox Code Playgroud) 我对scanf和getchar如何处理不同的流感到困惑,以下是示例代码:
while(scanf("%d", &input) != 1)
{
while((ch = getchar()) != '\n')
{
putchar(ch);
}
printf("\nThis is wrong\n");
}
printf("That is right\n");
Run Code Online (Sandbox Code Playgroud)
这是一个简单的程序,用于测试输入是否为整数.内部while循环用于在单击Enter之前显示每个错误的输入值.当我输入一个随机字符串,如:
qwert
Run Code Online (Sandbox Code Playgroud)
putchar将打印出确切的字符串.但是,如果我换了
while(scanf("%d", &input) != 1)
Run Code Online (Sandbox Code Playgroud)
同
while((ch = getchar()) != '\n')
Run Code Online (Sandbox Code Playgroud)
并打印出完全相同的字符串,第一个字母"q"被删除.所以我的问题是外循环中的scanf和getchar如何处理这种情况?