Tag: gpgpu

做什么不在CUDA内核中工作

好吧,我对CUDA很新,我有点迷茫,真的迷路了。 我正在尝试使用蒙特卡罗方法计算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 number curandState state; curand_init(SEED,(int)niter, 0, &state); x = curand(&state); y = curand(&state); z = […]

并发内核启动示例 – 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 < length; i+= blockDim.x) b[i] = a[i]; __syncthreads(); do { k […]

使用CUDA-C生成索引

我想在下面生成一组索引: 我有一个cuda块,由20个块组成(blockIdx:从0到19),每个块被细分为4个块(子块Idx:0,1,2和3)。 我试图生成这样的索引模式: threadIdx(tid),SubBlockIdxA(SA),SubBlockIdxB(SB),BlockIdxA(BA),BlockIdxB(BB) Required Obtained tid SBA SBB BA BB SBA SBB BA BB 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 2 0 1 1 1 0 1 1 1 3 1 0 1 2 1 0 1 2 4 0 1 2 […]

clGetProgramBuildInfo不打印构建日志

我在OpenCL中编写了一个代码。 构建内核程序时出错。 错误代码是-11。 我尝试打印BUILD LOG但它没有打印正确的日志,而是生成一些随机变量。 这是那部分 //these are variable declarations cl_device_id* devices; cl_program kernelprgrm; size_t size; //these varaibles have already been assigned properly //main code clGetProgramBuildInfo(kernelprgrm,devices[i], CL_PROGRAM_BUILD_LOG ,0,NULL,&size); char *buildlog=(char*)malloc(size); clGetProgramBuildInfo(kernelprgrm,devices[i], CL_PROGRAM_BUILD_LOG ,size,buildlog,NULL); printf(“\n\nBuildlog: %s\n\n”,buildlog); 它给出了以下输出: – Buildlog: 0 请帮助我获取正确的构建日志。 谢谢

在mex文件matlab中使用magma_dysevd

我尝试在matlab中编写使用magma库,所以我基本上编写了一个mex函数,它使用magma函数合并了c代码,然后将这个mex函数编译成mexa64文件,因此我可以在matlab中使用。 mexfunction或source c代码如下:(称为eig_magma) #include #include #include #include #include #include // includes, project #include “flops.h” #include “magma.h” #include “magma_lapack.h” #include “testings.h” #include #include “mex.h” #define A(i,j) A[i + j*lda] extern “C” void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { #define L_OUT plhs[0] #define A_IN prhs[0] #define S_OUT plhs[1] magma_init(); real_Double_t gpu_perf, gpu_time; double […]

GPU卡在2秒后重置

我正在使用NVIDIA geforce卡,如果我尝试在其上运行一些CUDA程序,则会在2秒后发出错误。 我在这里读到你可以使用HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers的TDRlevel键。 但是,我在注册表中看不到任何此类密钥。 是否需要自己添加? 有其他人遇到过这个问题。 如果是这样,你是如何解决的? 谢谢。

从cuda内核打印

我正在编写一个cuda程序,并尝试使用printf函数在cuda内核中打印一些内容。 但是当我编译程序时,我收到了一个错误 error : calling a host function(“printf”) from a __device__/__global__ function(“agent_movement_top”) is not allowed error MSB3721: The command “”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe” -gencode=arch=compute_10,code=\”sm_10,compute_10\” –use-local-env –cl-version 2008 -ccbin “c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin” -I”C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\common\inc” -I”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include” -G –keep-dir “Debug” -maxrregcount=0 –machine 32 –compile -g -Xcompiler […]

需要随机访问时改善随机存储器访问

我正在做的基本概念 完成联盟结构形成问题/组合拍卖。 给定一组N个代理,其中该代理集的不相交子集产生最佳结果。 例如, Agents = {a,b}及其值 {a} = 2 {b} = 3 {a,b} = 4 在这种情况下, {{a},{b}} = 5的联盟将给出最佳结果,其中它是{a,b}的成对不相交子集。 因此,简而言之,问题在于拆分集合并检查任何拆分总和是否大于原始集合。 (这部分与生成分裂以及如何表示数据一样好。) 我如何表示数据基本上是一个值数组,其中索引是设置配置(一个集合表示为整数)。 对于上面的例子: int val[4] = {0,2,3,4}其中set {a} = 01 = index 1 {b} = 10 = index 2 {a,b} = 11 = index 3 因此该集合充当值数组中的索引。 问题在于,这给出了随机存储器访问,给定了大量需要考虑2^n值的代理。 跳过这里的记忆访问问题 例如,在20个代理的环境中,给定两个元素10000000000000000001的集合,元素10000000000000000001的值是远离00000000000000000001的1048575个索引,其在内存中是4194300个字节,其表示32767个128字节距离的cachlines。 因此,可怕的访问模式。 我试过寻找的解决方案涉及按基数/汉明重量排序索引: 基于汉明重量的索引 确定两个整数之间的字典距离 遭受算术开销,我的计算将掩盖随机访问的惩罚。 […]

__forceinline__对CUDA C __device__函数的影响

关于何时使用内联函数以及何时在常规C编码中避免它,有很多建议。 __forceinline__对CUDA C __device__函数有什么影响? 应该在哪里使用以及在哪里避免?

如何在内核中动态分配数组?

我需要在内核函数中动态分配一些数组。 我怎么能这样做? 我的代码是这样的: __global__ func(float *grid_d,int n, int nn){ int i,j; float x[n],y[nn]; //Do some really cool and heavy computations here that takes hours. } 但那不行。 如果这是在主机代码中我可以使用malloc。 cudaMalloc需要主机上的指针,以及设备上的其他指针。 在内核函数内部,我没有主机指针。 所以我该怎么做? 如果花费太长时间(几秒钟)来分配所有数组(我需要大约n的4和大小为nn的5),这将不是问题。 因为内核可能至少运行20分钟。