[菜鸟每天来段CUDA_C]基于共享内存的位图与syncthreads的使用
2013-11-25 11:22
405 查看
本文使用CUDA实现基于共享内存的位图显示。位图中每个位置的像素值由每个线程计算,计算结果保存到缓冲区(共享内存)中。
结果为一个由多个绿色球形构成的网格(如下图)。
图中可以看出:没用同步(syncthreads)的运行结果是错误的,原因在于一个线程块的线程没有全部计算结束就对共享内存赋值。
Syncthreads的主要功能是对线程块中的线程进行同步,确保线程块中的每个线程都执行完__syncthreads()函数之前的语句才会执行下一条语句。
部分代码如下:
完整代码链接:http://download.csdn.net/detail/jonny_super/6606341
(VS2008 + OpenGL + CUDA)
参考资源:
Jason Sanders, Edward Kandrot, CUDA By Example: An Introduction toGeneral-Purpose GPU Programming (2011).
结果为一个由多个绿色球形构成的网格(如下图)。
图中可以看出:没用同步(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; }
完整代码链接:http://download.csdn.net/detail/jonny_super/6606341
(VS2008 + OpenGL + CUDA)
参考资源:
Jason Sanders, Edward Kandrot, CUDA By Example: An Introduction toGeneral-Purpose GPU Programming (2011).
相关文章推荐
- [菜鸟每天来段CUDA_C]基于GPU的Julia集
- [菜鸟每天来段CUDA_C]使用多个CUDA流提高程序执行效率
- [菜鸟每天来段CUDA_C]多GPU的使用
- 菜鸟每天来段CUDA_C]多GPU的使用
- [菜鸟每天来段CUDA_C]GPU上通过常量内存实现光线跟踪
- CUDA的内存结构,通过实例展示寄存器和共享内存的使用
- [菜鸟每天来段CUDA_C] 利用页锁定内存提高运算效率
- linux 共享内存的使用
- Win32汇编使用内存映射文件在进程间共享数据
- Windows上C++使用共享内存进行进程间通讯
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- 限制容器对内存的使用 - 每天5分钟玩转 Docker 容器技术(27)
- CUDA纹理内存的使用
- php之中使用共享内存进行高速数据更新的一种方案
- cuda《学习笔记三》——共享内存和同步
- Solaris系统SHM共享内存使用方法
- 使用内存映射文件在进程间共享数据
- h.264并行解码算法2D-Wave实现(基于多核非共享内存系统)
- cuda常量内存的使用
- 如何查看哪些进程在使用共享内存