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 - ) / BLOCK + ;
unsigned int x = k;
unsigned int y = ;
if (x > ){
x = ceil(sqrt(k));
y = (n - ) / (x*BLOCK) + ;
}
dim3 d = { x, y, };
//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] = - img[i];
i += (gridDim.x*blockDim.x)*(gridDim.y*blockDim.y);
}
} void addWithCuda(unsigned char *img, long H,long W)
{
unsigned char *dev_a = ; cudaSetDevice(); 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 = ; i < H*W; i++)
img[i] = - img[i];
} int main()
{
long W = ;
long H = ; unsigned char *img = new unsigned char[W*H];
unsigned char *cmp = new unsigned char[W*H]; for (long i = ; i < H*W; i++)
img[i] = rand() % ; 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 = ; 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 ;
}
cuda中当数组数大于线程数的处理方法的更多相关文章
- WINDOWS操作系统中可以允许最大的线程数(线程栈预留1M空间)(56篇Windows博客值得一看)
WINDOWS操作系统中可以允许最大的线程数 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来 ...
- (转)如何在Linux中统计一个进程的线程数
如何在Linux中统计一个进程的线程数 原文:http://os.51cto.com/art/201509/491728.htm 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会 ...
- centos系统查看系统版本、内核版本、系统位数、cpu个数、核心数、线程数
centos查看系统版本 cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 1)查看centos内核的版本: [root@loc ...
- 【转】cpu的核心数与线程数的关系
原文地址:http://www.dn580.com/dnzs/dncs/2013/10/08/172948914.html 我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能 ...
- 知识点查缺补漏贴03:单机最大进程数,线程数和Socket连接数
前言: 参加Unix/Linux相关高级研发职位时,是否经常会被文档,单机允许最大进程数.线程数和Socket连接数,而你却感到束手无措呢?本文给你一个最为详细的答案. 一.最大进程数 运行Linux ...
- 如何查看服务器CPU核心数和线程数
知道服务器CPU型号,那么我们如何在服务器里面查看服务器CPU核心数和线程数呢? 步骤: 先用鼠标右键点击屏幕最下方的任务栏空白处.会弹出一个菜单. 在菜单中用鼠标左键点选“启动任务管理器”. 点击任 ...
- CPU的物理数、核心数、线程数
最近了解下CPU的参数,主要是对常见的CPU参数指标:物理数.核心数以及线程数做了下了解.增长了点自己的见识,方便自己回忆和分享,记录下来.参考了网上的一些说明并加以整理,形成该随笔.主要参考链接如下 ...
- Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景
在上周三下午时,客户.业务和测试人员同时反溃生产环境登录进入不了系统,我亲自测试时,第一次登录进去了,待退出后再登录时,复现了客户的问题,场景像是请求连接被拒绝了,分析后判断是spring boot的 ...
- 如何在Linux中统计一个进程的线程数(转)
方法一: /proc proc 伪文件系统,它驻留在 /proc 目录,这是最简单的方法来查看任何活动进程的线程数. /proc 目录以可读文本文件形式输出,提供现有进程和系统硬件相关的信息如 CPU ...
随机推荐
- C#:struct的陷阱:无法修改“xxx”的返回值,因为它不是变量
示例代码如下: public struct SpiderResult { public string robotName; public string RobotName { get { return ...
- Android面试题(2)
1. int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型).Int是java的原始数据类型,Integer是java为int提供的封装类.Java为 ...
- socket心跳超时检测,快速处理新思路(适用于超大量TCP连接情况下)
假设一种情景:TCP服务器有1万个客户端连接,如果客户端5秒钟不发数据,则要断开.服务端如何检测客户端是否超时?这看起来是一个非常简单的问题,其实不然! 最简单的处理方法是:启动一个线程,每隔一段时间 ...
- 前端组件化Polymer入门教程(3)——快速入门
本系列主要翻译官方的教程,因为国内目前这方面的资料太少了,但也不一定和官网的一样,反正就是自己想到哪就写到哪. 如果我没有说明,默认情况下index.html始终包含这段代码,后面将不会再贴上来. & ...
- C++ string中的几个小陷阱,你掉进过吗?
C++开发的项目难免会用到STL的string,使用管理都比char数组(指针)方便的多,但在得心应手的使用过程中也要警惕几个小陷阱,避免我们项目出bug却迟迟找不到原因. 1. 结构体中的stri ...
- Netty——高级内置解码器、编码器、ByteBuf
netty通讯需要对数据进行编码,解码,于是我们需要用到netty的编码器.解码器 netty 提供的解码器 DelimiterBasedFrameDecoder 解决TCP的粘包解码器 Stri ...
- css3 2D转换(2D Transform) 动画(Animation)
transform 版本:CSS3 内核类型 写法 Webkit(Chrome/Safari) -webkit-transform Gecko(Firefox) -moz-transform Pres ...
- JSON知识点
什么是JSON? JSON是Javascript Object Notation(Javascript对象表示法)的缩写,是一种数据格式,而并非一种编程语言. 语法 JSON的语法可以表示以下三种类型 ...
- 网络之NSURLSession
NSUrlSession参考的这篇博客,自己也调试了它的代码:http://www.it165.net/pro/html/201406/15223.html ,对NSUrlSession还不太理解,先 ...
- MVC应用程序播放FLV视频,部分视图可多地方重复引用
网页上播放Falsh之外,还有一种格式就是FLV的视频,也是最常见的.Insus.NET再想在MVC应用程序实现这功能. 实现这个功能,需要从网上下载一个叫vcastr22.swf.如果在网上找不到, ...