考虑执行禁用位,从高级托管环境(如VB.NET 2008或C#)对本机处理器执行指令的推荐方法是什么.另外有没有人在对图形处理器执行GPU指令时取得了类似的成果?
我想usleep()在CUDA内核中调用类似的东西.基本目标是使所有GPU核心休眠或忙碌数小时 - 这是我想为CUDA应用程序做的一些健全性检查的一部分.我这样做的尝试如下:
#include <unistd.h>
#include <stdio.h>
#include <cuda.h>
#include <sys/time.h>
__global__ void gpu_uSleep(useconds_t wait_time_in_ms)
{
usleep(wait_time_in_ms);
}
int main(void)
{
//input parameters -- arbitrary
// TODO: set these exactly for full occupancy
int m = 16;
int n = 16;
int block1D = 16;
dim3 block(block1D, block1D);
dim3 grid(m/block1D, n/block1D);
useconds_t wait_time_in_ms = 1000;
//execute the kernel
gpu_uSleep<<< grid, block >>>(wait_time_in_ms);
cudaDeviceSynchronize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用NVCC编译时出现以下错误:
error: calling a host function("usleep") from a __device__/__global__
function("gpu_uSleep") is not …Run Code Online (Sandbox Code Playgroud) 在访问共享内存时,Kepler的费用是Fermi的2倍还是4倍?
编程指南说明:"每个存储区每两个时钟周期带宽为32位"(对于2.X),"每个存储区的每个时钟周期带宽为64位"(3.X),因此暗示了4倍?
我有一个应用程序,我希望在多个进程之间共享一个GPU.也就是说,这些进程中的每一个都会创建自己的CUDA或OpenCL上下文,目标是相同的GPU.根据Fermi白皮书[1],应用程序级上下文切换小于25微秒,但是在GPU上启动时启动有效地序列化 - 因此Fermi不能很好地完成这项工作.根据Kepler白皮书[2],有一种叫做Hyper-Q的东西允许来自多个CUDA流,MPI进程或进程内线程的多达32个同时连接.
我的问题:是否有人在Kepler GPU上尝试过此操作并验证其内核是否在从不同进程调度时同时运行?这只是一个CUDA功能,还是可以在Nvidia GPU上与OpenCL一起使用?AMD的GPU是否支持类似的东西?
[2] http://www.nvidia.com/content/PDF/kepler/NVIDIA-Kepler-GK110-Architecture-Whitepaper.pdf
__global__ void helloCUDA(float f)
{
printf("Hello thread %d, f=%f\n", threadIdx.x, f);
}
int main()
{
helloCUDA<<<1, 5>>>(1.2345f);
cudaDeviceSynchronize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么是cudaDeviceSynchronize(); 在很多地方例如这里 在内核调用后不需要它?
我对某事感到困惑.我所知道的是,在现代计算机的普通CPU上可以并发运行的最大线程数范围为8到16个线程.另一方面,使用GPU可以同时运行数千个线程,而调度程序不会中断任何线程来安排另一个线程.在几个帖子中: Java虚拟机 - 最大线程数 https://community.oracle.com/message/10312772 人们说他们在普通CPU上同时运行数千个Java线程.这怎么可能?我怎么知道可以并发运行的最大线程数,以便我的代码根据底层架构自动动态调整它.
我正在尝试安装 Tensorflow GPU 版本,但我被困在这里。我已经通过运行安装了 nvidia-cuda-toolkit
sudo apt install nvidia-cuda-toolkit
Run Code Online (Sandbox Code Playgroud)
它下载得很好。但是我找不到这个 libcudart.so
Please specify which gcc nvcc should use as the host compiler. [Default is /usr/bin/gcc]: /usr/bin/gcc
Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]:
Please specify the location where CUDA toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: /usr/local/cuda
Invalid path to CUDA toolkit. /usr/local/cuda/lib64/libcudart.so cannot be found
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我一直在与使用OpenCL的多核CPU线程进行GPU线程同步.我确实看到了一些CUDA示例,但是,如果有人能够在OpenCL方面给我一些关于同步部分的提示,我会更清楚这个概念.提前感谢您对此事的任何帮助.
我有一个未解决的问题,因为我认为我的 cuda 代码没有在我的 GPU 中运行(这里)。我认为这是因为当我使用 nvidia-smi 时,我在我的进程的类型字段中得到了一个 C,但是我看到当我运行我的代码时我的 GPU-Util 增长,所以现在我不知道它是否在 cpu 中运行或GPU。有人可以向我解释一下 C 或 G 类型是什么意思吗?我发现了这一点:“计算进程显示为“C”,图形进程显示为“G”,同时具有计算和图形上下文的进程显示为“C+G”。但我不明白这是否意味着C代表CPU和G代表GPU,因为我不知道“计算过程”和“图形过程”是什么,或者它们之间有什么区别。
我看过很多针对特定案例特定问题的特定帖子,但没有基本的动机解释。这是什么错误:
RuntimeError: CUDA error: device-side assert triggered
Run Code Online (Sandbox Code Playgroud)
意思?具体来说,正在触发的断言是什么,为什么断言在那里,我们如何向后工作以调试问题?
按原样,此错误消息在诊断任何问题时几乎无用,因为它似乎是在说“某处触及 GPU 的某些代码”有问题。Cuda 的文档在这方面似乎也没有帮助,尽管我可能是错的。 https://docs.nvidia.com/cuda/cuda-gdb/index.html