CUDA,可以使用共享内存可以提高我的性能
CUDA, could using shared memory improve my performance?
我正在实现一种算法,以使用CUDA将图像转换为灰度。我现在已经有效了,但是我正在寻找提高性能的方法。目前,整个颜色图像被转移到设备内存,然后每个线程通过查找相应的三个(r
,g
,b
)颜色值来计算灰色像素值。
我已经确保访问全球记忆的访问是合并的,尽管这并没有真正提高我的性能(在内存访问合并后,36 MB的图像少了0.003 s ...)。现在,我想知道使用共享内存是否可以改善我的性能。这是我现在拥有的:
我的cuda内核:
__global__ void darkenImage(const unsigned char * inputImage,
unsigned char * outputImage, const int width, const int height, int iteration){
int x = ((blockIdx.x * blockDim.x) + (threadIdx.x + (iteration * MAX_BLOCKS * nrThreads))) * 3;
if(x+2 < (3 * width*height)){
float grayPix = 0.0f;
float r = static_cast< float >(inputImage[x]);
float g = static_cast< float >(inputImage[x+1]);
float b = static_cast< float >(inputImage[x+2]);
grayPix = __fadd_rn(__fadd_rn(__fmul_rn(0.3f, r),__fmul_rn(0.59f, g)), __fmul_rn(0.11f, b));
grayPix = fma(grayPix,0.6f,0.5f);
outputImage[(x/3)] = static_cast< unsigned char >(grayPix);
}
}
我的问题确实是,因为两个线程之间没有内存,使用共享内存不应在这里真正有所帮助吗?还是我误会了?
问:
linus
如果您不使用相同的值多一次,则使用共享内存(缓存)不会改善性能。但是,您可以尝试删除iteration
参数并使用每个块处理更多数据。尝试在内核中进行单个内核启动和一个循环,以便每个线程可以计算一个以上的输出数据。
否您是正确的,共享内存无济于事,因为您没有一次访问数据。
相关文章:
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 链接列表运算符重载没有打印出我想要的内容
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 当我调用对象的方法时,对象的成员会发生变化
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- 包括没有完整路径的我的库
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- 莱克斯没有返回我想要的东西
- 在我的Matrix4类中使用某些用户定义的运算符的操作正在返回高值的高值
- flens lapack:需要GNU GCC 4.7版或更高版本!我的mac有