Tag: cuda

使用ctypes将c结构传递给函数

我正在尝试查询CUDA设备而不添加pycuda依赖项。 这是我到目前为止所得到的: 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()。 我想做这样的事情: properties = cudart.cudaDeviceProp 但是这会抛出这个错误: AttributeError: /usr/local/cuda/lib64/libcudart.so: undefined symbol: cudaDeviceProp 这是相关的CUDA文档 。 (编辑) 感谢@mhawke,我得到了这个工作。 对于其他想要这样做的人,我会为您节省自己打字的工作: class CudaDeviceProp(ctypes.Structure): _fields_ = [ (‘name’, ctypes.c_char […]

Cuda,计算3d对象之间的距离矩阵

我在3D中有一个连接N个对象(primefaces)的“字符串”(分子)(每个primefaces都有一个坐标)。 我需要计算分子中每对primefaces之间的距离(参见下面的伪代码)。 如何用CUDA完成? 我应该转到内核函数2 3Darrays吗? 或3个坐标为X [N],Y [N],Z [N]的数组? 谢谢。 struct atom {double 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 < N; i ++) for (int j = 0; j < N; j++) DistanceMatrix[i][j] = (atoms[i].x -atoms[j].x)*(atoms[i].x -atoms[j].x) […]

优化的CUDA矩阵汉明距离

是否有人知道优化的CUDA内核用于计算尺寸为A x N和N x B的两个矩阵之间的GEMM样式汉明距离? 问题几乎与GEMM相同,而是计算每个向量{1 … N}的和(a_n!= b_n),而不是对每个向量元素进行乘法和求和。 我想在编写自己的之前validation,因为这个问题比较常见,但我还没有成功找到它的代码。 修改代码的建议也很好。 编辑: 除了下面的kangshiyin的建议之外,我发现这个优化的SGEMM实现的演绎对于理解CUDA C编程指南中基本共享内存矩阵乘法示例之外的步骤非常有帮助。

CUDA上的2D数组

我想在CUDA动态分配全局2D数组。 我怎样才能做到这一点? 在我的主要部分,我在一个循环中调用我的Kernel 。 但在我调用内核之前,我需要在GPU上分配一些内存。 在内核调用之后,从GPU向CPU发送单个整数以通知问题是否已解决。 如果问题没有解决,我将不会释放旧内存,因为还需要它,我应该为GPU分配新内存并再次调用内核。 显示了一个sudocode: int n=0,i=0; while(n==0) { //allocate 2d memory for MEM[i++] //call kernel(MEM,i) // get n from kernel } __global__ void kernerl(Mem,int i) { Mem[0][5]=1; Mem[1][0]=Mem[0][5]+23;//can use this when MEM[1] is allocated before kernel call } 有什么建议? 谢谢。

作为推力迭代器CUDA的参数

我正在尝试使用CUDA :: Thurst迭代器来实现在GPU上运行的ODE求解器例程,以解决GPU中的一堆方程,转到细节,这里是一小段代码: #include #include #include #include #include #include #include #include #include #include #include #include __host__ __device__ float f(float x, float y) { return cos(y)*sin(x); } struct euler_functor { const float h; euler_functor(float _h) : h(_h) {}; __host__ __device__ float operator()( float(*f)(double,double),const float& x, const float& y) const { y += h * (*f)( x, […]

尝试设置QT creator&Cuda时,“链接器输入文件未使用,因为链接未完成”

我正在尝试使用QT创建者作为IDE开始使用C和Cuda。 不幸的是,我从一开始就遇到了问题而不确定它的来源(如果它逐渐开始,它会更容易识别)。 我基本上已经安装了CUDA(和c)并运行了小型测试程序,但我想使用IDE,所以我使用以下说明安装了QT创建者: http : //cudaspace.wordpress.com/2011/04/07/qt- creator-cuda-linux /但是我在运行示例时遇到错误:’链接器输入文件未使用,因为链接未完成’ 这里是所有的文件(由于我使用的是mac,我的修改和指令是针对linux的。我可以编译基本的hello world类型的东西但不是出于某种原因的例子):my_first_project.pro: TEMPLATE = app LANGUAGE = C++ CONFIG += qt4 SOURCES += main.cpp \ cuda_interface.cu # Cuda sources CUDA_SOURCES += cuda_interface.cu # Project dir and outputs PROJECT_DIR = $$system(pwd) OBJECTS_DIR = $$PROJECT_DIR/Obj DESTDIR = ../bin # Path to cuda SDK install CUDA_SDK = /Users/lostsoul/Dropbox/qt_cuda/C/ # Path […]

cuda – 零拷贝内存,内存映射文件

我正在尝试创建一个包含uint32_t的映射内存文件,然后将其用作零拷贝固定内存,如下面针对CUDA所示。 我在获取设备指针时获得了cudaErrorInvalidValue ,具有已分配空间并从文件映射内存。 我知道错误消息(来自API)意味着: 这表明传递给API调用的一个或多个参数不在可接受的值范围内。 但我正在努力弄清楚为什么我遇到这个问题……有什么想法吗? 提前致谢。 #include #include #include #include #include #include … int main(void) { struct stat buf; … uint32_t *data, *dev_data; cudaDeviceProp cuda_prop; cudaGetDeviceProperties(&cuda_prop, 0); if (!cuda_prop.canMapHostMemory) exit(EXIT_FAILURE); cudaSetDeviceFlags(cudaDeviceMapHost); int data_file = open(data_file_name, O_RDONLY); int stat = fstat(sa_file, &buf); int data_file_size = buf.st_size; err = cudaHostAlloc((void**)&data, data_file_size, cudaHostAllocMapped); if (err == cudaErrorMemoryAllocation) […]

无法链接到libgfortran.a

我在我的系统上安装了gfortran,文件libgfortran.a可以在/usr/lib/gcc/x86_64-linux-gnu/4.6/找到。 使用nm我确保函数_gfortran_compare_string在那里定义: $ nm /usr/lib/gcc/x86_64-linux-gnu/4.6/libgfortran.a | grep _gfortran_compare_string 返回 0000000000000000 T _gfortran_compare_string 0000000000000000 T _gfortran_compare_string_char4 但是,我的CUDA-C程序的链接器会抛出错误: /usr/local/cuda-6.0/bin/nvcc –cudart static -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/home/chung/lapack-3.5.0 -link -o “pQP” ./src/pQP.o -lgfortran -llapacke -llapack -lcublas -lblas -lcurand nvcc warning : The ‘compute_10’ and ‘sm_10′ architectures are deprecated, and may be removed in a future release. /home/chung/lapack-3.5.0/liblapack.a(ilaenv.o): In function `ilaenv_’: ilaenv.f:(.text+0x81): undefined […]

cuPrintf问题

我正在尝试将一个struct数组复制到device.I我正在使用一个GPU atm,我有一个cuPrintf函数的问题,我用它来调试我的代码。 我的结构定义如下: struct Node { char Key[25]; char ConsAlterKey[25]; char MasterKey[3]; int VowelDeletion; char Data[6]; char MasterData[6]; int Children[35]; int ChildCount; }; 为了测试目的,我填充struct数组,如下所示: void FillArray(Node *NodeArray) { for(int i=0;i<TotalNodeCount;i++) { strcpy(NodeArray[i].Key,"Key"); strcpy(NodeArray[i].ConsAlterKey,"ConsAlterKey"); strcpy(NodeArray[i].MasterKey,"Mk"); NodeArray[i].VowelDeletion=0; strcpy(NodeArray[i].Data,"Data"); strcpy(NodeArray[i].MasterData,"Mdata"); NodeArray[i].ChildCount=5; for(int j =0;j<NodeArray[i].ChildCount;j++) { NodeArray[i].Children[j]=i+j; } } } 我的主要function如下: int main() { Node *NodeArray; Node *GpuTree; int […]

CURAND和内核,在哪里生成?

我的动机:我使用算法来模拟种群动态,我希望使用CUDA,以便能够在数值模拟中考虑大量节点。 虽然这是我第一次在GPU上运行代码,但到目前为止结果看起来很有希望。 背景:我需要考虑随机噪声,它在我要研究的复杂系统的演化中起着至关重要的作用。 据我所知,与CPU上的类似操作相比,CUDA中的随机数生成可能非常麻烦。 在文档中,我看到必须存储RNG的状态并继续将其提供给需要(生成和)使用随机数的内核(全局函数)。 我发现这些例子很有启发性,也许还有其他什么你建议我阅读这个? 问题:生成n个种子值的优点是什么,将它们存储在设备全局内存中的数组中,然后将它们提供给内核,内核又生成一些随机数,而不是生成2n个随机数,存储它们在设备全局内存中,然后直接将它们提供给需要使用它们的内核? 我必须在这里遗漏一些真正重要的东西,因为它确实让我觉得在第二种情况下可以节省资源(在示例中从未使用过)。 似乎人们对生成的数字的分布更安全。 我的代码相当长,但我试着做一个我需要的简短例子。 这里是: 我的代码: #include #include #include #include #include __global__ void update (int n, float *A, float *B, float p, float q, float *rand){ int idx = blockIdx.x*blockDim.x + threadIdx.x; int n_max=n*n; int i, j; i=idx/n; //col j=idx-i*n; //row float status; //A, B symmetric //diagonal untouched, only […]