Tag: cuda

无法为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<count;i++){ *(h_A+i) […]

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 histogram_kernel = “”” __global__ void kernel_getHist(unsigned int* array,unsigned int size, unsigned int* […]

是否可以将批量FFT与CUDA的cuFFT库和cufftPlanMany重叠?

我正在尝试并行化声学指纹库(称为Chromaprint)的FFT变换。 它的工作原理是“将原始音频分成许多重叠的帧并对它们应用傅里叶变换”。 Chromaprint使用4096的帧大小,重叠2/3。 例如,第一帧由元素[0 … 4095]组成,然后第二帧类似于[1366 … 5462]。 使用cufftPlanMany,我知道您可以指定批量为4096的批次,这将执行[0 … 4095],[4096 … 8192]等批次。是否有某种方法可以使批处理变换重叠,或者应该我考虑另一种不使用批量执行的方法?

做什么不在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 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 < arraySize) c[tid] = a[tid] + b[tid]; } int main() { FILE […]

cuda将用户定义的结构传递给内核失败

这是我的问题。 我的kernel.h有以下结构。 struct __Q_VECTOR__{ double* Data; int Dimension; int Cluster; }; typedef struct __Q_VECTOR__ VQ_VECTOR; 在kernel.cu我有以下代码 int main(void){ int L = 3, //.Data length N = 100; VQ_VECTOR *A, *device_VQ_VECTOR; cudaError_t cudaStatus; A = (VQ_VECTOR*)malloc(N*sizeof(VQ_VECTOR)); for(int i=0; i<N; i++){ VQ_VECTOR a; a.Data = (double*)malloc(L*sizeof(double));; a.Cluster = 1; a.Dimension = L; for(int j=0; j<L; j++) a.Data[j]=i*j; […]

并发内核启动示例 – 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 […]

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 < n){ c[i] = a[i] + b[i]; } } int main() { int *a, *b, *c; int *d_a, *d_b, *d_c; cudaError_t cudaStatus; cudaStatus = cudaSetDevice(0); if […]

如何使用嵌套for循环添加两个2d(音调)数组?

我是cuda的新手。 我想将两个2d数组加到第三个数组中。 我使用以下代码: cudaMallocPitch((void**)&device_a, &pitch, 2*sizeof(int),2); cudaMallocPitch((void**)&device_b, &pitch, 2*sizeof(int),2); cudaMallocPitch((void**)&device_c, &pitch, 2*sizeof(int),2); 现在我的问题是,我不想在我的内核代码中使用这些数组作为扁平的二维数组我希望di使用两个for循环并将结果放在第三个数组中 __global__ void add(int *dev_a ,int *dev_b,int* dec_c) { for i=0;i<2;i++) { for j=0;j<2;j++) { dev_c[i][j]=dev_a[i][j]+dev_b[i][j]; } } } 我怎么能在CUDA做到这一点? 请告诉我如何以这种方式使用二维arrays? 使用2d-array的内核调用应该是什么? 如果可能,请使用代码示例进行说明。