管理的Cuda。IllegalAddress; 在执行内核的时候
我正在使用c#项目中的托管库来利用GPU,目前我正在关注此教程opencv. 一切似乎都可以使用我的代码,可以找到,构建内核并执行方法调用,但是我遇到了一个错误: An unhandled exception of type 'ManagedCuda.CudaException' occurred in ManagedCuda.dll Additional information: ErrorIllegalAddress: While executing a kernel, the device encountered a load or store instruction on an invalid memory address. The context cannot be used, so it must be destroyed (and a new one should be created). 我知道,C#试图将设备指针传递给内核时找不到有效的地址,这是我
0 2024-04-16
编程技术问答社区
CUDA驱动API与CUDA运行时间的对比
编写CUDA应用程序时,您可以在驱动程序级别或运行时级别工作,如该图像所示(库是高级数学的袖口和库公共): (来源:我认为两者之间的权衡是低渗API的性能提高,但代码的复杂性增加了.什么是具体的差异,您是否有任何重要的事情可以使用高级API? 我正在使用cuda.net进行与C#互动,并作为驱动程序API的副本构建.这鼓励在C#中编写许多相当复杂的代码,而使用运行时API则更简单.这样做有什么可以赢的吗?我可以看到的一个好处是,将智能错误处理与C#代码的其余部分更容易. 解决方案 CUDA运行时,可以将CUDA内核编译并将其链接到可录.这意味着您不必在应用程序中分发Cubin文件,也不必通过驱动程序API处理加载它们.如您所指出的,通常更容易使用. 相比之下,驱动程序API难以编程,但对如何使用CUDA提供了更多的控制.程序员必须直接处理初始化,模块加载等. 显然可以通过驱动程序API查询更详细的设备信息,而不是通过运行时API查询.例如,只有通过驱动程序
0 2024-04-12
编程技术问答社区
无法为CUDA C程序创建一个有效的Makefile
我有一个由3个cuda文件和2个标题形成的简单脚本: main.cu , kernel.cu func.cu , kernel.h 和 func.h .他们的目标是计算2个向量的总和. // main.cu #include #include #include #include #include "kernel.h" int main(){ /* Error code to check return values for CUDA calls */ cudaError_t err = cudaSuccess; srand(time(NULL)); int count = 100; int A[count], B[count]; int *h_A, *h_B; h_A = A; h_B = B; int i; for(i=0;i
0 2024-04-10
编程技术问答社区
CUDA中的多精度乘法
我正在尝试在CUDA中实现多工乘法.为此,我实施了一个内核,该内核应用256位操作数计算uint32_t类型操作数的乘法,并将结果放入288位数组中.到目前为止,我已经提出了此代码: __device__ __constant__ UN_256fe B_const; __global__ void multiply32x256Kernel(uint32_t A, UN_288bite* result){ uint8_t tid = blockIdx.x * blockDim.x + threadIdx.x; //for managing warps //uint8_t laineid = tid % 32; //allocate partial products into array of uint64_t __shared__ uint64_t partialMuls[8]; uint32_t carry, r; if((tid
0 2024-04-10
编程技术问答社区
PyCuda: 在Cuda内核中通过指针解读数组元素
我正在使用pycuda通过指针将一对阵列传递到CUDA内核.数组是不同内核的输出,因此数据已经在GPU上. 在内核中,我正在尝试访问每个数组中的元素以进行矢量减法.我为数组中的元素获得的值是不正确的(H&P在下面的代码中是错误的). 谁能帮我看看我在做什么错? 我的代码: import pycuda.driver as cuda import pycuda.autoinit from pycuda.compiler import SourceModule import numpy as np import time import cv2 from pycuda.tools import DeviceMemoryPool as DMP from scipy.spatial import distance import os import glob def get_cuda_hist_kernel(): #Make the kernel hi
0 2024-04-10
编程技术问答社区
使用ctypes将c结构传给一个函数
我试图在不添加pycuda依赖性的情况下查询CUDA设备.这是我到目前为止所拥有的: import ctypes cudart = ctypes.cdll.LoadLibrary('libcudart.so') numDevices = ctypes.c_int() cudart.cudaGetDeviceCount(ctypes.byref(numDevices)) print 'There are', numDevices.value, 'devices.' for x in xrange(numDevices.value): properties = None # XXX What goes here? cudart.cudaGetDeviceProperties(ctypes.byref(properties), x) print properties 问题是我无法创建一个空结构来传递给CudagetDeviceProperties().我
2 2024-04-10
编程技术问答社区
Cuda,计算3D物体之间的距离矩阵
i在3D中具有连接的n个对象(原子)的"弦"(分子)(每个原子都有一个坐标).我需要计算分子中每对原子之间的距离(请参见下面的伪代码).库达怎么办?我应该传递到内核函数2 3D数组吗?还是3个带有坐标的数组:x [n],y [n],z [n]?谢谢. 结构原子 { 双x,y,z; } int main() { //N number of atoms in a molecule double DistanceMatrix[N][N]; double d; atom Atoms[N]; for (int i = 0; i
0 2024-04-10
编程技术问答社区
从c中调用cuda的结果是错误的
我收到的错误是: 在此范围中未声明" blockidx" " 在">"令牌之前预期的主要表达 " "之前的预期初级表达 在">"令牌之前预期的主要表达 (" "是指内核调用>>) 另外,在主函数中我接收: 错误:无法将" float*"转换为" float ",以获取参数" 1"为'void kernel_wrapper(float*,float*,int,int) cu文件: #include #include #include #include #include #include #include ..... __global__ void kernel(float* A,float *B, curandState* globalState, int Asize,int B
4 2024-04-10
编程技术问答社区
基本的CUDA C程序在某些情况下会崩溃
我正在编写一个基本的CUDA程序,以更好地了解该语言.我写了一些非常基本的东西,这些东西只添加了两个并行的向量,然后将结果打印到PPM文件中.目前,矢量内的值无关紧要,因为我计划以后对其进行调整以产生某种有趣的图像.问题是图像的分辨率(实际上是结果向量)会导致该程序几乎立即崩溃,如果我使其太大.考虑现在的程序: #include #define cols 500 #define rows 50 #define arraySize rows * cols __global__ void addOnGPU(int *a, int *b, int *c) { // Only use data at this index int tid = threadIdx.x + blockIdx.x * blockDim.x; if (tid
0 2024-04-10
编程技术问答社区
为什么我们不能在主机端访问设备内存?
我问了一个问题使用cudamalloc()分配的内存可以通过主机访问? 尽管现在我很清楚,但是我仍然想知道为什么不可能在主机中访问设备指针.我的理解是,CUDA驱动程序负责GPU DRAM内部的内存分配.因此,可以将此信息(即我在设备中分配的内存的第一个地址)可以传达给主机上运行的操作系统.然后,可以访问此设备指针,即分配的设备内存的第一个地址.我的理解怎么了?请帮助我理解这一点.谢谢你 解决方案 GPU内存生活在PCIE总线的另一侧.现代PC体系结构中主机内存的内存控制器直接连接到CPU. 因此,访问方法有很大不同.当访问GPU上的内存时,必须将交易作为PCIE循环序列.设置PCIE总线以实现此交易的活动并未内置在现代CPU中的普通内存获取周期中. 因此,我们需要软件互动(由cudaMemcpy处理)来完成将PCIE总线上编程周期的软件序列以发送或获取总线另一侧的数据.
0 2024-04-10
编程技术问答社区
当试图写入使用cudaMalloc3D分配的二维数组时,出现非法内存访问'。
我正在尝试使用Cudamalloc3d将扁平的2D数组的内存分配和复制到设备上,以测试Cudamalloc3d的性能.但是,当我尝试从内核中写入数组时,它会遇到"遇到非法内存访问"的例外.如果我只是从数组中阅读,但是当我尝试写入它时,该程序运行良好,会有一个错误.对此的任何帮助将不胜感激.以下是我的代码和用于编译代码的语法. 使用 编译 nvcc -O2 -arch sm_20 test.cu 代码:test.cu #include #include #include #define PI 3.14159265 #define NX 8192 /* includes boundary points on both end */ #define NY 4096 /* includes boundary points on both end */ #define NZ 1 /*
0 2024-04-10
编程技术问答社区
cuda griddim,blockdim和threadIdx
这是一个概念上的问题.在CUDA中,Griddim,BlockDim和ThreadIdx可以为1D,2D或3D.我想知道他们的2D和3D版本如何解释? 在更多详细信息中,CUDA是否将多维GridDim,BlockDim和ThreadIdx视为线性序列,就像C存储多维数组一样?如果没有,我们应该如何解释多维griddim,blockdim和threadiDx? 谢谢. 编辑1. 这个问题不是重复的问题.实际上,我遇到了一个引用的问题.它询问了GPU线程执行的顺序,而不是其布局. 编辑2. 另外,可以在 http:/http:/http:/http:/http:/http://docs.nvidia.com/cuda/cuda-c-programming-guide/#thread-hierarchy .谢谢@talonmies的参考.综上所述,多维Griddim,BlockDim和ThreadIdx是为了方便的目的.它们可以像专栏的主要有序多维阵列一样解释.
4 2024-04-10
编程技术问答社区
并发内核启动实例-CUDA
我正在尝试为一个非常复杂的CUDA内核实现并发内核启动,所以我想我会以一个简单的示例开始.它只是启动了一个减少总和的内核.足够简单.在这里是: #include #include #include #include extern __shared__ char dsmem[]; __device__ double *scratch_space; __device__ double NDreduceSum(double *a, unsigned short length) { const int tid = threadIdx.x; unsigned short k = length; double *b; b = scratch_space; for (int i = tid; i
0 2024-04-10
编程技术问答社区
Cuda中的错误结果
我尝试用cuda c编码一个简单的示例, 我遵循有关此的屏幕截图,但我的结果错误 这是一个例子: #include "cuda_runtime.h" #include "device_launch_parameters.h" #include #include #define SIZE 1024 __global__ void VectorAdd(int *a, int *b, int *c, int n) { int i = threadIdx.x; if (i
0 2024-04-10
编程技术问答社区
Do While don't work inside CUDA Kernel
好吧,我很新来cuda,我有点迷路了,真的迷路了. 我正在尝试使用Monte Carlo方法来计算Pi,最后我只得到一个而不是50. 我不想为调用内核而"做",因为它太慢了.我的问题是,我的代码不会循环,它在内核中仅执行一次. ,而且,我希望所有线程都访问相同的niter和pi,因此当某些线程击中柜台时,所有其他线程都会停止. #define SEED 35791246 __shared__ int niter; __shared__ double pi; __global__ void calcularPi(){ double x; double y; int count; double z; count = 0; niter = 0; //keep looping do{ niter = niter + 1; //Generate random num
0 2024-04-09
编程技术问答社区
如何在CUDA中复制2D数组?
我是库达(Cuda)的新手,仍然试图弄清楚事情,所以这个问题可能很愚蠢,但我似乎无法弄清楚这个问题. 我正在尝试将2D阵列复制到GPU.数组的大小为n*n(平方阵列).我正在尝试使用MallocPitch()&cudaMemcpy2D()复制它.问题是我似乎只是在复制数组的第一行,而没有其他内容.我找不到我到底在做错什么. 我的代码: void function(){ double A[N][N]; //code to fill out the array. double* d_A; size_t pitch; cudaMallocPitch(&d_A, &pitch, N * sizeof(double), N); cudaMemcpy2D(d_A, pitch, A, N * sizeof(double) , N * sizeof(double), N, cudaMemcpyHostToDevice); int
4 2024-04-09
编程技术问答社区
Cuda,计算3D物体之间的距离矩阵
i在3D中具有连接的n个对象(原子)的"弦"(分子)(每个原子都有一个坐标).我需要计算分子中每对原子之间的距离(请参见下面的伪代码).库达怎么办?我应该传递到内核函数2 3D数组吗?还是3个带有坐标的数组:x [n],y [n],z [n]?谢谢. 结构原子 { 双x,y,z; } int main() { //N number of atoms in a molecule double DistanceMatrix[N][N]; double d; atom Atoms[N]; for (int i = 0; i
0 2024-04-09
编程技术问答社区
CURAND和内核,在哪里产生?
我的动机:我正在使用算法来建模种群动力学,我希望使用CUDA来考虑数值模拟中的大量节点.尽管这是我第一次在GPU上运行代码,但结果看起来很有希望. 上下文:我需要考虑随机噪声,这在我要研究的复杂系统的演变中起着至关重要的作用.据我了解,与CPU上的类似操作相比,CUDA中的随机数可能会很麻烦.在文档中,我看到必须存储RNG状态,并将其馈送到需要(生成和)随机数的内核(全局函数).我找到了 问题:生成n个种子值,将它们存储在设备全局内存中的数组中,然后将它们馈入内核有什么优势使用,反对生成2N随机数,将它们存储在设备全局内存中,然后将它们直接馈送到需要使用它们的内核中?我必须在这里缺少真正重要的东西,因为在我看来,它看起来像是在第二种情况下可以节省资源(在示例中从未使用过).似乎在生成数字的分布方面似乎更安全. 我的代码很长,但我试图简短地说明我的需求.在这里是: 我的代码: #include #include
0 2024-04-09
编程技术问答社区
在用nvprof进行分析时没有GPU活动
i运行nvprof.exe在初始化数据,调用三个内核和Free数据的功能上.所有人都应该剖析,我得到这样的结果: ==7956== Profiling application: .\a.exe ==7956== Profiling result: GPU activities: 52.34% 25.375us 1 25.375us 25.375us 25.375us th_single_row_add(float*, float*, float*) 43.57% 21.120us 1 21.120us 21.120us 21.120us th_single_col_add(float*, float*, float*)
2 2024-04-09
编程技术问答社区
GPU卡在2秒后复位
我正在使用NVIDIA GEFORCE卡,如果我尝试在上面运行一些CUDA程序,该卡在2秒后会出现错误.我阅读在这里您可以在TDRlevel键>.但是,我在注册表中没有看到任何这样的键.需要自己添加吗?让其他人遇到这个问题.如果是这样,您是如何解决的?谢谢. 解决方案 我假设您正在使用Windows Vista或更高版本. 您链接到的文章包含一个控制注册表键的列表Microsoft WDDM超时检测和恢复机制.正如Talonmies评论的那样,这不是给出错误的卡,而是Microsoft Windows WDDM WDDM TDR机制,它检测到长期运行的内核并将其杀死以恢复GPU以恢复GPU. 如果您的内核可以在任何时间长的时间内运行,则GPU将占用计算工作并且无法更新显示器,自然而然地,您可以想象大多数人会认为这很糟糕.一些开发人员选择增加延迟,以允许开发更长的运行核,并了解他们的系统可能会在几秒钟内无反应.如果您使用WDDM GPU的调试器(nvidia tesla
0 2024-04-09
编程技术问答社区