Tag: cuda

使用C解决矩阵(在CUDA内)

作为一个更大问题的一部分,我需要解决小型线性系统(即NxN,其中N~10),因此使用相关的cuda库在速度方面没有任何意义。 不幸的是,还有一些不清楚的问题是如何在不拉动GSL,EIGEN等大型枪支的情况下解决这些系统问题。 任何人都可以指向直线C中密集矩阵求解器(Ax = B)的方向吗? 对于那些感兴趣的人,这部分代码的生成器的基本结构是: ndarray=some.generator(N,N) for v in range N: B[v]=_F(v)*constant for x in range N: A[v,x]=-_F(v)*ndarray[x,v] 不幸的是,我对高等数学知之甚少,所以任何建议都会受到赞赏。 更新:我一直在努力解决这个问题,并且有一个近乎解决方案,但仍在运行。 任何潜伏的人都欢迎查看我到目前为止在pastebin上的内容 。 我正在使用Crout Decomposition with Pivoting,这似乎是最常用的方法。 这个测试的想法是每个线程都做同样的工作。 无聊我知道,但计划是增加matrixcount变量,放入实际数据,每个线程单独解决小矩阵。 感谢所有正在检查此事的人。 POST-ANSWER UPDATE:完成了CPU和GPU操作的矩阵求解代码,请查看我的懒惰写入

嵌套循环到CUDA

我想将我的c代码移植到CUDA。 主要计算部分包含3个嵌套循环: for (int i=0; i< Nx;i++){ for (int j=0;j<Ncontains[i];j++){ for (int k=0;k< totalVoxels;k++){ ……. } } } 如何将其转换为我的CUDA内核? 有两个for循环我可以做类似的事情: int n= blockIdy.y * blockDim.y + threadIdx.y; int i= blockIdx.x * blockDim.x + threadIdx.x; 但是我怎么能最初开始运行呢?

arrays30 x 30的程序失败

这是CUDA架构上的矩阵乘法程序。 当数组大小为30 x 30时,此代码工作正常,但当大小较大时,输出为0的系列。 我正在使用Linux机器上托管的CUDA的标准ec2实例。 任何人都可以找出原因吗? #include #define SIZE 30 __global__ void matrix_multiply(float *input1,float *input2,float *output,int dimension){ int input1_index = threadIdx.x / dimension * dimension; int input2_index = threadIdx.x % dimension; int i=0; for( i =0; i <dimension; i++){ output[threadIdx.x] += input1[input1_index + i] * input2[input2_index + i * dimension]; } } int main(){ int […]

在CUDA中在主机和设备之间传递变量

我有以下CUDA内核,它执行广度优先搜索。 __global__ void bfs(const Edge* edges, int* vertices, int* current_depth, bool* done){ int e = blockDim.x * blockIdx.x + threadIdx.x; int vfirst = edges[e].first; int dfirst = vertices[vfirst]; int vsecond = edges[e].second; int dsecond = vertices[vsecond]; if((dfirst == *current_depth) && (dsecond == -1)){ vertices[vsecond] = dfirst +1; *current_depth = dfirst+1; *done = false; } if((dsecond […]

编译时需要CUDA硬件吗?

是否需要安装支持CUDA的图形卡(在Linux中)用于使用nvcc编译CUDA程序? 或者可以在任何地方编译程序并仅在此类系统上运行?

如何将四面体树结构复制到CUDA设备内存?

如果我想将以下结构TetrahedronStruct移动到CUDA设备内存,我该怎么办? struct TetrahedronStruct { int index; int region; TriangleFaces Faces[4]; Vertex Vertices[4]; struct TetrahedronStruct *adjTetrahedrons[4]; }; typedef struct { long double Nx, Ny, Nz; long double d; Vertex V[3]; } TriangleFaces; typedef struct { long double x, y, z; } Vertex; 细节: 提供网格细节(节点数,四面体,坐标和区域)。 树的创建是在for循环中完成的。 基本上,每个面都以其坐标和邻接相应地定位和布置在树中。 在CUDA设备中,我需要使用此结构在媒体上叠加,以模拟粒子如何穿过该媒体。 百万粒子中的每一粒都从四面体移动到四面体(每个四面体具有它所在的介质的特性)。

CUDA结果使用非常大的数组返回垃圾,但报告没有错误

我正在创建一个测试程序,它将创建一个大小为n的设备和主机数组,然后启动一个内核,创建n个线程,为设备arrays中的每个位置分配常量值0​​.95f。 完成后,将设备arrays复制到主机arrays,并汇总所有条目并显示最终总计。 下面的程序似乎适用于大约6000万个浮点数的数组大小并且很快返回正确的结果,但是当达到7000万时,程序似乎挂起了一段时间并最终返回总结果的NAN结果。 在6000万次运行后检查主机arrays显示它已正确填充0.95f,但在7000万次运行后检查它显示它填充了NAN。 据我所知,没有一个CUDA调用返回错误。 我使用的是2GB GT640m(Compute 3.0),最大块大小为1024,最大网格尺寸为2147483647。 我相信有更好的方法来实现类似的东西,我想听听建议。 但我也想了解这里出了什么问题,以便我可以从中学习。 #include “cuda_runtime.h” #include “device_launch_parameters.h” #include #include void cudaErrorHandler(cudaError_t status) { // Cuda call returned an error, just print error for now if(status != cudaSuccess) { printf(“Error”); } } __global__ void addKernel(float* _Results, int _TotalCombinations) { // Get thread Id unsigned int Id = (blockDim.x * […]

CUDA当在主机代码中声明常量内存时,如何访问设备内核中的常量内存?

作为记录,这是家庭作业所以尽量少或多少考虑到这一点。 我们使用常量存储器来存储“掩模矩阵”,该掩模矩阵将用于在更大的矩阵上执行卷积。 当我在主机代码中时,我使用cudaMemcpyToSymbol()将掩码复制到常量内存。 我的问题是,一旦将其复制并启动我的设备内核代码,设备如何知道访问常量内存掩码矩阵的位置。 在内核启动时是否需要传入指针。 教授给我们的大部分代码都不应该被改变(没有指向传入掩码的指针)但总有可能他犯了一个错误(虽然这很可能是我对某些东西的理解) 是不是常量的memeory declaratoin应该包含在单独的kernel.cu文件中? 我正在最小化代码,只显示与常量内存有关的事情。 因此,请不要指出是否有什么东西没有初始化等。 有代码,但目前没有关注。 main.cu: #include #include “kernel.cu” __constant__ float M_d[FILTER_SIZE * FILTER_SIZE]; int main(int argc, char* argv[]) { Matrix M_h, N_h, P_h; // M: filter, N: input image, P: output image /* Allocate host memory */ M_h = allocateMatrix(FILTER_SIZE, FILTER_SIZE); N_h = allocateMatrix(imageHeight, imageWidth); P_h = allocateMatrix(imageHeight, […]

将PTX程序直接传递给CUDA驱动程序

CUDA驱动程序API提供从文件系统加载包含PTX代码的文件。 通常会做以下事情: CUmodule module; CUfunction function; const char* module_file = “my_prg.ptx”; const char* kernel_name = “vector_add”; err = cuModuleLoad(&module, module_file); err = cuModuleGetFunction(&function, module, kernel_name); 如果在运行时(运行中)生成PTX文件,则通过文件IO似乎是浪费(因为驱动程序必须再次加载它)。 有没有办法直接将PTX程序传递给CUDA驱动程序(例如作为C字符串)?

矩阵乘法CUDA

我一直在阅读几个网站,甚至使用NVIDA的代码作为指南,但我仍然得到了错误的答案。 main将询问用户的大小,并显示A和B然后显示结果矩阵C.但是,我说A和B都运行2×2矩阵,这是我的示例输出: Matrix A 0.000000 8.000000 2.000000 2.000000 Matrix B 3.000000 1.000000 5.000000 7.000000 Matrix C (Results) 0.000000 9.000000 7.000000 4.000000 但这是不正确的。 它应该是: 40.000 56.000 16.000 16.000 我将它从小数改为整数,以便更容易检查,我发现它是不正确的。 我不明白为什么它会不正确,特别是即使我从他们的代码示例中采取了它。 #ifndef _MATRIXMUL_KERNEL_H_ #define _MATRIXMUL_KERNEL_H_ #include // Thread block size #define BLOCK_SIZE 16 #define TILE_SIZE 16 // CUDA Kernel __global__ void matrixMul( float* C, float* A, float* […]