Tag: cuda

使用CUDA中的减少来查找数组中的最小值(但跳过某些元素)

我有一大堆浮点数,我想找出数组的最小值(忽略-1 s,无论在哪里)及其索引,使用CUDA中的减少。 我已经编写了以下代码来执行此操作,在我看来应该可以工作: __global__ void get_min_cost(float *d_Cost,int n,int *last_block_number,int *number_in_last_block,int *d_index){ int tid = threadIdx.x; int myid = blockDim.x * blockIdx.x + threadIdx.x; int s; if(result == (*last_block_number)-1){ s = (*number_in_last_block)/2; }else{ s = 1024/2; } for(;s>0;s/=2){ if(myid+s>=n) continue; if(tid<s){ if(d_Cost[myid+s] == -1){ continue; }else if(d_Cost[myid] == -1 && d_Cost[myid+s] != -1){ d_Cost[myid] = d_Cost[myid+s]; […]

CUDA:使用网格划分循环减少共享内存

关于在CUDA内核中共享内存中网格跨越循环和优化缩减算法的使用,我有以下问题。 想象一下,你有1D数组,其元素数多于网格中的线程数(BLOCK_SIZE * GRID_SIZE)。 在这种情况下,您将编写此类内核: #define BLOCK_SIZE (8) #define GRID_SIZE (8) #define N (2000) // … __global__ void gridStridedLoop_kernel(double *global_1D_array) { int idx = threadIdx.x + blockIdx.x * blockDim.x; int i; // N is a total number of elements in the global_1D_array array for (i = idx; i < N; i += blockDim.x * gridDim.x) […]

GPU卡在2秒后重置

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

CUDA外部纹理声明

我想声明我的纹理一次,并在我的所有内核和文件中使用它。 因此,我在标题中将其声明为extern并在所有其他文件中包含标题(遵循SO 如何使用extern在源文件之间共享变量? ) 我有一个包含我的纹理的标题cudaHeader.cuh文件: extern texture texImage; 在我的file1.cu ,我分配了我的CUDA数组并将其绑定到纹理: cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc( ); cudaStatus=cudaMallocArray( &cu_array_image, &channelDesc, width, height ); if (cudaStatus != cudaSuccess) { fprintf(stderr, “cudaMallocArray failed! cu_array_image couldn’t be created.\n”); return cudaStatus; } cudaStatus=cudaMemcpyToArray( cu_array_image, 0, 0, image, size_image, cudaMemcpyHostToDevice); if (cudaStatus != cudaSuccess) { fprintf(stderr, “cudaMemcpyToArray failed! Copy from the host […]

是否有相当于perror()的CUDA?

是否有CUDA函数用于打印调用者提供的错误消息,以及描述当前cudaStatus(或调用者提供的cudaStatus)的错误消息,a-la- perror() ?

在CUDA中并行化for循环(1D Naive Convolution)

有人可以帮我转换嵌套的for循环到CUDA内核吗? 这是我试图转换为CUDA内核的函数: // Convolution on Host void conv(int* A, int* B, int* out) { for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) out[i + j] += A[i] * B[j]; } 我已经非常努力地并行化这段代码。 这是我的尝试: __global__ void conv_Kernel(int* A, int* B, int* out) { int i = blockIdx.x; […]

在__device / global__ CUDA内核中动态分配内存

根据CUDA编程指南 ,第122页,只要我们使用计算体系结构2.x,就可以在设备/全局函数内动态分配内存。 我的问题是,当我尝试这个时,我得到命令行消息: 命令“some command”-gencode = arch = compute_10,code = \“sm_10,compute_10 \”-gencode = arch = compute_20,code = \“sm_20,compute_20 \”等…… 接下来是一个错误,表示您无法从设备/全局函数调用主机函数(malloc)。 上面的消息显示它正在尝试在compute 1.x下编译。 我正在使用VS2010并在“CUDA C / C ++”属性页中将“代码生成”设置为“compute_20,sm_20”,因此我不确定为什么它仍在尝试在compute 1.x下编译。 我肯定使用支持2.x的卡。 有任何想法吗?

如何将struct数组传递给GPU?

我有这个结构: struct Node { int *ptr; int k; }*d_ptr; 我如何声明一个Node数组并将其传递给GPU? 问题是我必须先为ptr分配内存然后再分配节点! 我有这个到现在为止: int N=100; int NumbOfNodes=5; cudaMalloc((void **) &d_NodeArr, sizeof(Node)*NumbOfNodes); for(int i=0;i<NumbOfNodes;i++) cudaMalloc((void **) d_NodeArr[i].Degree, sizeof(int)*N); 如果我在这样的单个数组中分配所有内容会更快: int N=100; int NumbOfNodes=5; int SIZE=(100*5)+5;//the +5 is for the k cudaMalloc((void **) &d_ptr,sizeof(int)*SIZE);

检测没有CUDA的NVIDIA GPU

我想提取一组有关NVIDIA GPU的信息,而不需要链接到CUDA库。 唯一需要的信息是计算能力和GPU的名称,这可能比这更有用但不是必需的。 代码应该用C(或C ++)编写。 这些信息将在配置时(当CUDA工具包不可用时)和运行时(当执行的二进制文件未使用CUDA支持编译时)使用,以向用户建议系统中存在受支持的GPU。 据我所知,这可以通过驱动程序API实现,但我不太熟悉这需要的技术细节。 所以我的问题是: 至少满足最低要求的具体步骤是什么(见上文); 有没有这样的开源代码? 请注意,我的第一步是为Linux提供一些代码,但最终我需要与平台无关的代码。 考虑到CUDA的平台可用性,对于完整的解决方案,这将涉及用于Linux,Mac OS和Windows的x86 / AMD64的代码(至少目前,该列表可以很快通过ARM扩展)。 编辑 我的意思是“它可以通过驱动程序API”是一个应该能够动态加载libcuda.so并通过驱动程序API查询设备属性。 不过,我不确定细节。

C中的Malloc内存损坏

我使用malloc时遇到问题。 我有一个名为jacobi_gpu的函数,它被多次调用: int main(int argc, char* argv[]){ /* … */ int totalrot=0; while(nrot>0){ iter++; nrot=jacobi_gpu(a,q, tol, dimmat); totalrot+=nrot; printf(“iter =%3d nrot=%3d\n”,iter, nrot); } /* … */ } 参数a,q,tol和dimmat被正确初始化。 A和Q是2平方矩阵,dimmat是它们的维数。 这是我的代码: int jacobi_gpu(double A[], double Q[], double tol, long int dim){ int nrot, p, q, k, tid; double c, s; double *mc, *vc; printf(“jacobi begins \n”); […]