[菜鸟每天来段CUDA_C]基于共享内存的位图与syncthreads的使用
来源:互联网 发布:贪心算法加油站问题 编辑:程序博客网 时间:2024/06/16 20:22
本文使用CUDA实现基于共享内存的位图显示。位图中每个位置的像素值由每个线程计算,计算结果保存到缓冲区(共享内存)中。
结果为一个由多个绿色球形构成的网格(如下图)。
图中可以看出:没用同步(syncthreads)的运行结果是错误的,原因在于一个线程块的线程没有全部计算结束就对共享内存赋值。
Syncthreads的主要功能是对线程块中的线程进行同步,确保线程块中的每个线程都执行完__syncthreads()函数之前的语句才会执行下一条语句。
部分代码如下:
/********************************************************************* sharedMem.cu*********************************************************************/#include <stdio.h>#include <stdlib.h>#include <cuda_runtime.h>#include <cutil_inline.h>#include "CPUBitmap.h"#define DIM 512#define PI 3.1415926535897932f/************************************************************************//* Init CUDA *//************************************************************************/bool InitCUDA(void){ ......}/************************************************************************/__global__ void kernel(unsigned char* ptr){int x = threadIdx.x + blockIdx.x * blockDim.x;int y = threadIdx.y + blockIdx.y * blockDim.y;int offset = x + y * blockDim.x * gridDim.x;__shared__ float sharedMem[16][16];const float period = 128.0f;sharedMem[threadIdx.x][threadIdx.y] = 255 * (sinf(x*2.0f*PI/period) + 1.0f) * (sinf(y*2.0f*PI/period) + 1.0f) / 4.0f;__syncthreads();ptr[offset*4 + 0] = 0;ptr[offset*4 + 1] = sharedMem[15-threadIdx.x][15-threadIdx.y];ptr[offset*4 + 2] = 0;ptr[offset*4 + 3] = 255;}/************************************************************************/int main(int argc, char* argv[]){if(!InitCUDA()) {return 0;}CPUBitmap bitmap(DIM, DIM);unsigned char* devBitmap;cutilSafeCall(cudaMalloc((void**)&devBitmap, bitmap.image_size()));dim3 grids(DIM/16, DIM/16);dim3 threads(16, 16);kernel<<<grids, threads>>>(devBitmap);cutilSafeCall(cudaMemcpy(bitmap.get_ptr(), devBitmap, bitmap.image_size(), cudaMemcpyDeviceToHost));bitmap.display_and_exit();cudaFree(devBitmap);return 0;}
(VS2008 + OpenGL + CUDA)
参考资源:
Jason Sanders, Edward Kandrot, CUDA By Example: An Introduction toGeneral-Purpose GPU Programming (2011).
- [菜鸟每天来段CUDA_C]基于共享内存的位图与syncthreads的使用
- [菜鸟每天来段CUDA_C]基于GPU的Julia集
- [菜鸟每天来段CUDA_C]多GPU的使用
- 菜鸟每天来段CUDA_C]多GPU的使用
- [菜鸟每天来段CUDA_C]CUDA与OpenGL互操作
- [菜鸟每天来段CUDA_C]向量相加的CUDA实现和顺序执行比较
- [菜鸟每天来段CUDA_C]GPU上实现任意长度的矢量求和
- [菜鸟每天来段CUDA_C]CUDA实现向量的点积运算
- [菜鸟每天来段CUDA_C]GPU上通过常量内存实现光线跟踪
- [菜鸟每天来段CUDA_C] 利用页锁定内存提高运算效率
- [菜鸟每天来段CUDA_C]GPU实现水波动画效果
- [菜鸟每天来段CUDA_C] GPU上实现直方图计算
- [菜鸟每天来段CUDA_C]使用多个CUDA流提高程序执行效率
- [菜鸟每天来段CUDA_C]CppIntegration在C++程序中引用CUDA程序
- [菜鸟每天来段CUDA_C]CUDA实现简单热传导动态模拟
- 基于共享内存的位图——GPU高性能编程CUDA实战5.3.3
- linux共享内存与信号量的使用
- 共享内存的使用
- Android开发之git工具
- 避免将unsigned int和int放在布尔表达式中作比较
- 视频专辑:Java邮件开发(深入JAVA邮件技术)
- Linux下,当bin被干掉了,没有yum,可以ssh,解决方案
- MFC创建椭圆形半透明对话框
- [菜鸟每天来段CUDA_C]基于共享内存的位图与syncthreads的使用
- 计算机专用英语词汇1500词(四)
- decode
- iOS断点调试(xcode )
- BS和CS开发架构的详细解析
- 数据源—商务智能的来源
- 简单的wx例子
- (Relax 后缀数组1.4)POJ 2774 Long Long Message(求两个字符串公共子串的最大长度)
- 路由器OSPF动态路由配置