Cuda中当数组数大于线程数的处理方法

参考stackoverflow一篇帖子的处理方法:https://stackoverflow.com/questions/26913683/different-way-to-index-threads-in-cuda-c

代码中cuda_gridsize函数参考yolo。

代码如下:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <ctime>

using namespace std;
#define BLOCK 512

dim3 cuda_gridsize(size_t n){
    size_t k = (n - 1) / BLOCK + 1;
    unsigned int x = k;
    unsigned int y = 1;
    if (x > 65535){
        x = ceil(sqrt(k));
        y = (n - 1) / (x*BLOCK) + 1;
    }
    dim3 d = { x, y, 1 };
    //printf("%ld %ld %ld %ld\n", n, x, y, x*y*BLOCK);
    return d;
}

__global__ void gpuCalc(unsigned char *img,long H,long W)
{
    long threadId_2D = threadIdx.x + threadIdx.y*blockDim.x;
    long blockId_2D = blockIdx.x + blockIdx.y*gridDim.x;
    long i = threadId_2D + (blockDim.x*blockDim.y)*blockId_2D;

    //另一种索引方式
    //long i = (gridDim.x*blockDim.x)*(threadIdx.y + blockDim.y*blockIdx.y) + (threadIdx.x + blockDim.x*blockIdx.x);

    while (i < H*W){
        img[i] = 255 - img[i];
        i += (gridDim.x*blockDim.x)*(gridDim.y*blockDim.y);
    }
}

void addWithCuda(unsigned char *img, long H,long W)
{
    unsigned char *dev_a = 0;

    cudaSetDevice(0);

    cudaMalloc((void**)&dev_a, H*W * sizeof(unsigned char));
    cudaMemcpy(dev_a, img, H*W * sizeof(unsigned char), cudaMemcpyHostToDevice);

    gpuCalc<<<cuda_gridsize(H*W),BLOCK>> >(dev_a, H, W);

    cudaMemcpy(img, dev_a, H*W * sizeof(unsigned char), cudaMemcpyDeviceToHost);
    cudaFree(dev_a);

    cudaGetLastError();
}

void cpuCalc(unsigned char *img,long W, long H)
{
    for (long i = 0; i < H*W; i++)
        img[i] = 255 - img[i];
}

int main()
{
    long W = 20000;
    long H = 20000;

    unsigned char *img = new unsigned char[W*H];
    unsigned char *cmp = new unsigned char[W*H];

    for (long i = 0; i < H*W; i++)
        img[i] = rand() % 100;

    memcpy(cmp, img, H*W);

    cpuCalc(img, W, H);
    printf("cpu calc end\n");

    addWithCuda(img, W,H);
    printf("gpu calc end\n");

    bool flag = true;
    for (long i = 0; i < H*W; i++)
    {
        if (img[i] != cmp[i])
        {
            printf("no pass\n");
            flag = false;
            break;
        }
    }
    if (flag)
        printf("pass");

    delete[] cmp;
    delete[] img;
    getchar();

    return 0;
}

原文地址:https://www.cnblogs.com/tiandsp/p/9460130.html

时间: 2024-11-25 23:44:06

Cuda中当数组数大于线程数的处理方法的相关文章

WINDOWS操作系统中可以允许最大的线程数(线程栈预留1M空间)(56篇Windows博客值得一看)

WINDOWS操作系统中可以允许最大的线程数 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程. 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程. 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制. 比方说你的机器装了64GB物理内存,

Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数

文章转载:http://blog.snsgou.com/post-793.html 1.查看物理CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l1 2.查看逻辑CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "processor"|wc -l4 3.查看CPU是几核(即,核心数) [[em

(转)CPU的核心数、线程数的关系和区别

我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之说,下面文本就来解释一下CPU的核心数与线程数的关系和区别. 简单地说,CPU的核心数是指物理上,也就是硬件上存在着几个核心.比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组,等等,依次类推. 线程数是一种逻辑的概念,简单地说,就是模拟出的CPU核心数.比如,可以通过一个CPU核心数模拟出2线程的

centos系统查看系统版本、内核版本、系统位数、cpu个数、核心数、线程数

centos查看系统版本 cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 1)查看centos内核的版本: [[email protected] ~]# cat /proc/version Linux version 2.6.18-194.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Fri Apr 2 14:5

windows查看CPU个数,核心数和线程数

在Windows中,在cmd命令中输入"wmic",然后在出现的新窗口中分别输入"cpu get Name","cpu get NumberOfCores","cpu get NumberOfLogicalProcessors"即可查看物理CPU数.CPU核心数.线程数.如下图所示: Name:表示物理CPU数 NumberOfCores:表示CPU核心数 NumberOfLogicalProcessors:表示CPU线程数注

如何查看服务器CPU核心数和线程数

知道服务器CPU型号,那么我们如何在服务器里面查看服务器CPU核心数和线程数呢? 步骤: 先用鼠标右键点击屏幕最下方的任务栏空白处.会弹出一个菜单. 在菜单中用鼠标左键点选“启动任务管理器”. 点击任务管理器的“性能”选项. 在“性能”选项的“cpu使用记录”项中有几个方框就说明cpu有几个线程. cpu线程数不一定等于cpu的核心数,因为有些cpu采用了超线程技术,一个核心可以有两个线程.如果想查看cpu的核心数可以安装一个CPU-Z软件,打开后就可以看见有几个核心和线程了. PS:超线程处理

CPU的物理数、核心数、线程数

最近了解下CPU的参数,主要是对常见的CPU参数指标:物理数.核心数以及线程数做了下了解.增长了点自己的见识,方便自己回忆和分享,记录下来.参考了网上的一些说明并加以整理,形成该随笔.主要参考链接如下:https://www.cnblogs.com/kimsimple/p/7787018.html  感谢博主的解释.如有理解不对的地方,欢迎各位指点批评! 1.物理CPU个数 物理CPU及实际你看到的或者自己购买组装在电脑或者服务器的实体CPU.如下图所示: 2.CPU核心数 核心数表示,单个物理

WINDOWS操作系统中可以允许最大的线程数

默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程. 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程. 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制. 比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用

如何在 Linux 中统计一个进程的线程数

编译自:http://ask.xmodulo.com/number-of-threads-process-linux.html作者: Dan Nanni原创:LCTT https://linux.cn/article-6240-1.html译者: strugglingyouth本文地址:https://linux.cn/article-6240-1.html 2015-9-17 10:29    收藏: 5 问题: 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会有多少线程