我是一个真正的解决方案.请帮忙.这很紧急.
我有一个主机进程产生多个主机(CPU)线程(pthreads).这些线程又调用CUDA内核.这些CUDA内核由外部用户编写.因此可能是进入无限循环的糟糕内核.为了克服这个问题,我已经花了2分钟的时间来杀死相应的CPU线程.
杀死CPU线程还会杀死GPU上运行的内核吗?就我所测试的而言,它没有.
如何杀死当前在GPU中运行的所有线程?
编辑:我使用调用内核的CPU线程的原因是,服务器有两个Tesla GPU.因此,线程将交替地在GPU设备上调度内核.
谢谢,Arvind
我有一个opengl应用程序加载一个dxf并在屏幕上绘制,每次我需要计算法线.有没有办法计算GPU中的法线而不是CPU?如果是这样的话?
我有一个CUDA代码,其工作方式如下:
cpyDataGPU --> CPU
while(nsteps){
cudaKernel1<<<,>>>
function1();
cudaKernel2<<<,>>>
}
cpyDataGPU --> CPU
Run Code Online (Sandbox Code Playgroud)
而function1就像这样:
function1{
cudaKernel3<<<,>>>
cudaKernel4<<<,>>>
cpyNewNeedDataCPU --> GPU // Error line
cudaKernel5<<<,>>>
}
Run Code Online (Sandbox Code Playgroud)
根据cudaMemcpy文档,此函数可以产生4种不同的错误代码:“ cudaSuccess”,“ cudaErrorInvalidValue”,“ cudaErrorInvalidDevicePointer”和“ cudaErrorInvalidMemcpyDirection”。
但是,我收到以下错误:“ cudaErrorLaunchFailure”:“执行内核时设备上发生了异常。常见原因包括取消引用无效的设备指针和访问共享内存。在调用cudaThreadExit()之前,无法使用设备所有现有的设备内存分配都是无效的,如果程序要继续使用CUDA,则必须对其进行重新构造。”
有人对我为什么会收到此错误有任何想法吗?我究竟做错了什么?
在先前的内核调用¿之后复制数据CPU-> GPU是否有意义?问题是,我必须在每个步骤将数据复制到这里,因为它可能在每个“ while”步骤中都会更改。
提前解冻很多!!
我使用的是nsight 2.2,Toolkit 4.2,最新的nvidia驱动程序,我的计算机中使用的是夫妇gpu。构建自定义4.2。我在CUDA的项目属性上设置了“ generate GPU ouput”(生成GPU输出),nsight监视器处于打开状态(一切看起来都很不错)。
我在全局内核函数上设置了几个断点。nsight在函数的声明处停止,但是跳过了几个断点。就像nsight决定要达到断点还是跳过断点一样。有趣的是nsight在for循环处停止,但在简单的赋值操作上不会停止。
另一个问题是我无法设置关注点或将变量添加到监视列表,在这种情况下(请参阅所附的屏幕截图),我无法解析变量“ value”的值:“ posss”或“ testDetctoinRate1” 。另一方面,共享内存或块内存将自动插入本地列表。
我通过以下调用唤起我的内核函数:
checkCUDA<<<1, 32>>>(sumMat->rows,sumMat->cols , (UINT *)pGPUsumMat);
cudaError = cudaGetLastError();
if(cudaError != cudaSuccess)
{
printf("CUDA error: %s\n", cudaGetErrorString(cudaError));
exit(-1);
}
Run Code Online (Sandbox Code Playgroud)
内核调用可以正常工作。
是否可以选择强制nsight在所有断点处停止?如何将线程的寄存器添加到监视列表?
任何帮助将不胜感激,我可以按需发布代码
干杯
最初,我的调试命令行如下:
设置CUDAFE_FLAGS =-sdk_dir“ c:\ Program Files \ Microsoft SDKs \ Windows \ v7.0A \”“ C:\ Program Files \ NVIDIA GPU计算工具包\ CUDA \ v4.2 \ bin \ nvcc.exe”-使用-local-env --cl-version 2010 -ccbin“ C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ bin” …
我正在使用带有CUDA 5的Linux上的tesla k20和计算能力35.使用简单的子内核调用它会产生编译错误: Unresolved extern function cudaLaunchDevice
我的命令行看起来像:
nvcc --compile -G -O0 -g -gencode arch=compute_35 , code=sm_35 -x cu -o fill.cu fill.o
Run Code Online (Sandbox Code Playgroud)
我cudadevrt.a在lib64中看到..我们需要添加它还是需要做些什么来解决它?没有子内核调用一切正常.
我试图在Windows机器上安装R包gputools.根据 安装指示,不支持Windows.然而linux指令都是关于指示r包在哪里找到cuda文件夹,所以我认为这应该可以在windows上实现.
config.mk文件是
# set R_HOME, R_INC, and R_LIB to the the R install dir,
# the R header dir, and the R shared library dir on your system
R_HOME := $(shell R RHOME)
R_INC := $(R_HOME)/include
R_LIB := $(R_HOME)/lib
# replace these three lines with
# CUDA_HOME := <path to your cuda install>
ifndef CUDA_HOME
CUDA_HOME := /usr/local/cuda
endif
# set CUDA_INC to CUDA header dir on your system
CUDA_INC := $(CUDA_HOME)/include
ARCH := $(shell uname -m)
# …Run Code Online (Sandbox Code Playgroud) 具体来说,我的问题是我有需要<curand_kernel.h>运行的CUDA代码.NVRTC默认不包括此项.据推测,当创建程序上下文(即调用nvrtcCreateProgram)时,我必须发送文件名(curand_kernel.h)以及源代码curand_kernel.h?我觉得我不应该这样做.
这很难说; 我没有设法从NVIDIA找到一个需要像这样的标准CUDA文件作为源的人,所以我真的不明白语法是什么.一些问题:curand_kernel.h还包括......我是否必须为每个问题做同样的事情?我甚至不确定NVRTC编译器是否能正常运行curand_kernel.h,因为它有一些不支持的语言功能,不存在吗?
下一步:如果您已经将头文件的源代码发送到nvrtcCreateProgram,我是否还要#include在要执行的代码中使用它/如果我这样做会导致错误吗?
实现此类或类似内容的示例代码的链接将不仅仅是一个直截了当的答案; 我真的没有找到任何.
我正在学习Apple的Metal,试图进行一些GPU计算。
我检查了Apple给出的矩阵乘法示例。有一点我不明白。
// Number of rows in matrices A and C.
@property (nonatomic) uint16_t m;
// Number of columns in matrix A; number of rows in matrix B.
@property (nonatomic) uint16_t n;
// Number of columns in matrices B and C.
@property (nonatomic) uint16_t k;
// Output matrix (padded) C row count
@property (nonatomic, readonly) uint16_t M;
// Output matrix (padded) C column count
@property (nonatomic, readonly) uint16_t K;
// Output matrix C = …Run Code Online (Sandbox Code Playgroud) cuda-memcheck报告了CUDA内核发布模式的这些信息:
========= Error: process didn't terminate successfully
========= Invalid __global__ read of size 4
========= at 0x000002c8 in xx_kernel
========= by thread (0,0,0) in block (0,0)
========= Address 0x10101600014 is out of bounds
=========
========= ERROR SUMMARY: 1 error
Run Code Online (Sandbox Code Playgroud)
此故障仅在发布模式下发生.在cuda-gdb下运行时也不会发生这种情况.
如何获取0x000002c8地址并确定导致错误的代码?我查看了缓存的中间文件(.ptx,.cubin等)并没有看到明确的方法来确定错误的源代码.
这是在带有CUDA 3.2的x86_64 Linux上.
更新:原来这是3.2中的编译器错误.升级到4.0会使memcheck错误消失.此外,我能够使用4.0中的cuobjdump来反汇编CUBIN,但由于它是发布模式并进行了优化,因此将反汇编与源代码相匹配非常困难.