我试图运行下面的代码,但报告错误:
NvvmSupportError:找不到libNVVM.执行conda install
cudatoolkit:找不到库nvvm
我的开发环境是:Ubuntu 17.04,Spyder/Python3.5,我通过conda(numba和cudatoolkit)安装.Nvidia GPU(GTX 1070和GTX 1060).
import numpy as np
from timeit import default_timer as timer
from numba import vectorize
@vectorize(["float32(float32, float32)"], target='cuda')
def VecADD(a,b):
return a+b
n = 32000000
a = np.ones (n, dtype=np.float32)
b = np.ones (n, dtype=np.float32)
c = np.zeros(n, dtype=np.float32)
start = timer()
C = VecADD(a,b)
print (timer() - start)
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?
我可以列出gpu设备唱下面的tensorflow代码:
import tensorflow as tf
from tensorflow.python.client import device_lib
print device_lib.list_local_devices()
Run Code Online (Sandbox Code Playgroud)
结果是:
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 17897160860519880862, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 9751861134541508701
physical_device_desc: "device: XLA_GPU device", name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 5368380567397471193
physical_device_desc: "device: XLA_CPU device", name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 21366299034
locality {
bus_id: 1
links {
link {
device_id: 1
type: "StreamExecutor"
strength: 1
}
}
}
incarnation: 7110958745101815531
physical_device_desc: "device: …Run Code Online (Sandbox Code Playgroud) 在当今的大多数nVIDIA GPU上,共享内存的大小(OpenCL术语中的"本地内存")仅为16 KiB.
我有一个应用程序,我需要创建一个具有10,000个整数的数组.所以我需要适应10,000个整数的内存量= 10,000*4b = 40kb.
我一直在玩一个访问7个全局内存缓冲区的OpenCL内核,对值做一些事情并将结果存储回第8个全局内存缓冲区.正如我所观察到的,随着输入大小的增加,L1缓存未命中率(=未命中(未命中+命中))变化很大.我找不到这种变化的来源.此处的输入大小表示全局工作项的数量(2的幂和工作组大小的倍数).工作组大小的数量仍为256.
这些是结果.这些显示了L1缓存未命中率.从4096个工作项(16个工作组)开始.
0.677125
0.55946875
0.345994792
0.054078125
0.436167969
0.431871745
0.938546224
0.959258789
0.952941406
0.955016479
Run Code Online (Sandbox Code Playgroud)
分析器说它每个线程使用18个寄存器.这是代码(函数TTsum()应该只做一堆依赖的超越操作,所以它与缓存无关)我猜:
float TTsum(float x1, float x2, float x3, float x4, float x5, float x6, float x7)
{
float temp = 0;
for (int j = 0; j < 2; j++)
temp = temp + x1 + (float)x2 + x3 + x4 + x5 + x6 + x7;
temp = sqrt(temp);
temp = exp(temp);
temp = temp / x1;
temp = temp / (float)x2;
for (int j = 0; …Run Code Online (Sandbox Code Playgroud) 我的应用程序需要双精度计算.根据我在谷歌上发现的,我应该添加一个标志"-arch sm_13"或"-arch sm_20".
Q1:"-arch sm_13"和"-arch sm_20"有什么区别?
Q2:"-arch sm_13"和"-arch sm_20"之间的性能是否存在差异?
我的GPU:GTX 570.
谢谢.
我知道这个问题只是部分与编程有关,因为我想得到的答案最初来自这两个问题:
为什么CPU核心数量如此之低(与GPU相比)?为什么我们不使用GPU而不是CPU,仅GPU或CPU?(我知道GPU是专用的,而CPU更多用于多任务等).我也知道存在内存(主机与GPU)限制以及精度和缓存功能.但是,就硬件比较而言,高端到高端的CPU/GPU比较GPU的性能要高得多.
所以我的问题是:我们可以使用GPU而不是CPU用于操作系统,应用程序等
我问这个问题的原因是因为我想知道当前计算机仍然使用2个主处理单元(CPU/GPU)和两个主存储器和缓存系统(CPU/GPU)的原因,即使它不是程序员想.
为了减少我的应用程序从主机到设备的传输时间,我想使用固定内存.NVIDIA的最佳实践指南建议使用以下代码映射缓冲区并写入数据:
cDataIn = (unsigned char*)clEnqueueMapBuffer(cqCommandQue, cmPinnedBufIn, CL_TRUE,CL_MAP_WRITE, 0, memSize, 0, NULL, NULL, NULL);
for(unsigned int i = 0; i < memSize; i++)
{
cDataIn[i] = (unsigned char)(i & 0xff);
}
clEnqueueWriteBuffer(cqCommandQue, cmDevBufIn, CL_FALSE, 0,
szBuffBytes, cDataIn, 0, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
英特尔的优化指南建议使用对clEnqueueMapBuffer和clEnqueueUnmapBuffer的调用,而不是调用clEnqueueReadBuffer或clEnqueueWriteBuffer.
使用固定内存/映射内存的正确方法是什么?是否有必要使用enqueueWriteBuffer写入数据或者enqueueMapBuffer是否足够?
另外,CL_MEM_ALLOC_HOST_PTR和CL_MEM_USE_HOST_PTR之间有什么区别?
我有一个带有2个GPU的工作站,我正在尝试同时运行多个tensorflow作业,所以我可以同时训练多个模型,等等.
例如,我试图通过在script1.py中使用python API将会话分成不同的资源:
with tf.device("/gpu:0"):
# do stuff
Run Code Online (Sandbox Code Playgroud)
在script2.py中:
with tf.device("/gpu:1"):
# do stuff
Run Code Online (Sandbox Code Playgroud)
在script3.py中
with tf.device("/cpu:0"):
# do stuff
Run Code Online (Sandbox Code Playgroud)
如果我自己运行每个脚本,我可以看到它正在使用指定的设备.(此外,这些模型非常适合单个GPU,即使两者都可用,也不会使用另一个.)
但是,如果一个脚本正在运行并且我尝试运行另一个脚本,我总是会收到此错误:
I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 8
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:909] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:103] Found device 0 with properties:
name: GeForce GTX 980
major: 5 minor: 2 memoryClockRate (GHz) 1.2155
pciBusID 0000:01:00.0
Total memory: 4.00GiB …Run Code Online (Sandbox Code Playgroud) Tensorflow倾向于在其GPU上预分配整个可用内存.对于调试,有没有办法说明实际使用了多少内存?
我正在使用 Google Colab 进行深度学习,我知道他们会随机将 GPU 分配给用户。我希望能够查看在任何给定会话中分配给我的 GPU。有没有办法在 Google Colab 笔记本中做到这一点?
请注意,如果有帮助,我正在使用 Tensorflow。