Tag: cuda

这个数组比较问题的最佳算法是什么?

解决以下问题的速度算法最有效的是什么? 给定6个arrays,D1,D2,D3,D4,D5和D6,每个包含6个数字,如: D1[0] = number D2[0] = number …… D6[0] = number D1[1] = another number D2[1] = another number …. ….. …. …… …. D1[5] = yet another number …. …… …. 给定第二个数组ST1,包含1个数字: ST1[0] = 6 给定第三个数组ans,包含6个数字: ans[0] = 3, ans[1] = 4, ans[2] = 5, ……ans[5] = 8 使用数组D1,D2,D3,D4,D5和D6的索引,从0到存储在ST1 [0]中的数字减1,在本例6中,从0到6-1,将ans数组与每个D数组进行比较。 如果在相同索引处的任何D中找不到一个或多个ans数,则结果应为0,如果在相同索引处的某个D中找到所有ans数,则结果应为1。 也就是说,如果某些ans [i]不等于任何D […]

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

我需要在内核函数中动态分配一些数组。 我怎么能这样做? 我的代码是这样的: __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分钟。

在我自己的代码中不能使用CHOLMOD和CUDA加速

我试图在SuiteSparse 4.4.4使用CHOLMOD和CUDA加速。 我根据用户指南编译它,我可以在Demo文件夹下成功运行gpu.sh ,这表明GPU正在完成部分工作。 但是,当我尝试使用CHOLMOD运行自己的代码时,我发现GPU调用的数量始终为0.我将Common->useGPU设置为1,环境变量CHOLMOD_USE_GPU也设置为1.我的Makefile就像下列。 库路径是正确的。 对我有什么建议吗? 实际上我应该提到我只是运行一个最简单的测试用例来解决一个线性系统。 我尝试了UF Sparse Matrix Collection的几个矩阵,但是nvprof显示没有CUDA应用程序被分析。 我试过的一些矩阵: bmw7st_1: http : //www.cise.ufl.edu/research/sparse/matrices/GHS_psdef/bmw7st_1.html nd6k: http : //www.cise.ufl.edu/research/sparse/matrices/ND/nd6k.html nd24k: http : //www.cise.ufl.edu/research/sparse/matrices/ND/nd24k.html 码: #include #include #include #include #include #include “cholmod.h” int main (void) { struct timeval t1, t2; double elapsedTime; const char* matFile = “../bmw7st_1.mtx”; FILE* fp = fopen(matFile, “r”); assert(fp != […]

进程间通信CUDA

我试图理解CUDA中的进程间通信。 我希望能够理解这个概念并尝试将其应用于我正在进行的项目中。 我有一个图像采集系统,提供N个输入图像。 首先处理每个原始输入图像,然后将其存储在名为“Result”的单个变量中。 有四个函数可以处理图像,Aprocess,Bprocess,Cprocess和Dprocess。 每次系统获取新图像时,都会调用上述四个函数进行处理。 最终图像“结果”存储在Dprocess中。 我想要做的是:创建一个新的进程’process2’,我可以在每次获得图像时将“最终”图像存储在“结果”中,并将其放入名为“图像”的缓冲区中。 我想为10张图片做这件事。 ‘process2’应该等待将新图像传递给它并且不终止,因为第一个进程必须继续调用这四个函数并获得最终处理的图像。 到目前为止我遇到的问题: cudaIpcGetMemHandle,cudaIpcOpenMemHandle和cudaIpcCloseMemHandle 问题:如何使用上述function名称来实现IPC?

使用CUDA生成排列

我正在阅读有关CUDA的内容,我试图实现一个简单的代码来创建array {a,b,c,d}每个可能的排列,但我不知道如何实现CUDA方式(因为所有的例子我读取的formsa[blockIdx.x] = b[blockIdx.x] + c[blockIdx.x] )。 任何帮助将不胜感激。

Fortran接口调用返回指针的C函数

我有一个C函数, double* foofunc() { /* Function Body */ } 我不知道如何在Fortran声明一个接口来调用这个C函数。 此外,如果指针应该指向GPU device memory ,我怎么能在Fortran界面中定义它? 我是否需要使用DEVICE属性。 请使用Fortran支持的function,直到2003年。 有什么建议?

无法使用cuda进入__global__函数

我在Nsight上编写了一个编译并可以执行的代码但是第一次启动无法完成。 奇怪的是,当我在调试模式下运行时,它运行得很好,但速度太慢了。 在进入访问GPU的函数之前,这是代码的一部分(我认为有一个我无法找到的错误): void parallelAction (int * dataReturned, char * data, unsigned char * descBase, int range, int cardBase, int streamIdx) { size_t inputBytes = range*128*sizeof(unsigned char); size_t baseBytes = cardBase*128*sizeof(unsigned char); size_t outputBytes = range*sizeof(int); unsigned char * data_d; unsigned char * descBase_d; int * cardBase_d; int * dataReturned_d; cudaMalloc((void **) &data_d, inputBytes); cudaMalloc((void […]

CUDA:添加两个数字给出了错误的答案

这是该计划 #include #include #include #include __global__ void Addition(int *a,int *b,int *c) { *c = *a + *b; } int main() { int a,b,c; int *dev_a,*dev_b,*dev_c; int size = sizeof(int); cudaMalloc((void**)&dev_a, size); cudaMalloc((void**)&dev_b, size); cudaMalloc((void**)&dev_c, size); a=5,b=6; cudaMemcpy(dev_a, &a,sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(dev_b, &b,sizeof(int), cudaMemcpyHostToDevice); Addition<<>>(dev_a,dev_b,dev_c); cudaMemcpy(&c, dev_c,size, cudaMemcpyDeviceToHost); cudaFree(&dev_a); cudaFree(&dev_b); cudaFree(&dev_c); printf(“%d\n”, c); return 0; } 这是我如何编译它 […]

cuda中的count3是非常慢的

我在CUDA中编写了一个小程序,它计算C数组中有多少3个并打印出来。 #include #include #include #include __global__ void incrementArrayOnDevice(int *a, int N, int *count) { int id = blockIdx.x * blockDim.x + threadIdx.x; //__shared__ int s_a[512]; // one for each thread //s_a[threadIdx.x] = a[id]; if( id < N ) { //if( s_a[threadIdx.x] == 3 ) if( a[id] == 3 ) { atomicAdd(count, 1); } } } […]

CUDA写入常量内存错误值

我有以下代码从主机变量复制到CUDA中的__constant__变量 int main(int argc, char **argv){ int exit_code; if (argc < 4) { std::cout << "Usage: \n " << argv[0] << " ” << std::endl; return 1; } Color *h_input; int h_rows, h_cols; timer1.Start(); exit_code = readText2RGB(argv[1], &h_input, &h_rows, &h_cols); timer1.Stop(); std::cout << "Reading: " << timer1.Elapsed() << std::endl; if (exit_code != SUCCESS){ std::cout << […]