首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OMP:如何在运行时找到合适的缓存大小

OMP:如何在运行时找到合适的缓存大小
EN

Stack Overflow用户
提问于 2015-01-14 10:39:47
回答 1查看 263关注 0票数 0

我有以下(伪)代码:

代码语言:javascript
复制
static void ConvertBuffer( unsigned char * buffer, const int width )
{
#pragma omp parallel for
  for ( int x = 0; x < width; ++x ) // one image row
    {
    RGB rgb = {0,0,0}; HSB hsb;
    rgb.red = (float)buffer[x] / 255.;
    RGBToHSB(rgb, hsb);
    buffer[x] = hsb.brightness * 255;
    }
}

这是RGB→HSB转换算法的一个非常幼稚的实现。

第一个实现将每次提取一条扫描线(=图像的一行),在我的例子中是65536字节。但是,在对我的特定系统进行了尝试和错误之后,我发现,如果我一次处理16扫描线(= 1048576字节),那么总计算时间可以减少2的一倍。

有什么工具可以让我猜出这个神奇的数字,可能是在运行时,这样我就不需要在代码中某个地方硬编码16的神奇值了?

如果我知道RGBToHSB是令人尴尬的并行和缓存友好的,我能完全填充L3 cache并且应该接近最大的速度吗?

为供参考,我的系统描述如下:

代码语言:javascript
复制
$ sudo likwid-topology
-------------------------------------------------------------
CPU type:   Intel Core SandyBridge processor 
*************************************************************
Hardware Thread Topology
*************************************************************
Sockets:    1 
Cores per socket:   4 
Threads per core:   1 
-------------------------------------------------------------
HWThread    Thread      Core        Socket
0       0       0       0
1       0       1       0
2       0       2       0
3       0       3       0
-------------------------------------------------------------
Socket 0: ( 0 1 2 3 )
-------------------------------------------------------------

*************************************************************
Cache Topology
*************************************************************
Level:  1
Size:   32 kB
Cache groups:   ( 0 ) ( 1 ) ( 2 ) ( 3 )
-------------------------------------------------------------
Level:  2
Size:   256 kB
Cache groups:   ( 0 ) ( 1 ) ( 2 ) ( 3 )
-------------------------------------------------------------
Level:  3
Size:   6 MB
Cache groups:   ( 0 1 2 3 )
-------------------------------------------------------------

*************************************************************
NUMA Topology
*************************************************************
NUMA domains: 1 
-------------------------------------------------------------
Domain 0:
Processors:  0 1 2 3
Relative distance to nodes:  10
Memory: 122.332 MB free of total 5898.17 MB
-------------------------------------------------------------
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-14 13:46:36

您不能真正定义缓冲的“适当大小”。我的答案是把它设定得尽可能大。我会说在10 on到100 on之间,但是如果你能负担得起,你可以把它设置得更高,如果你缺少内存,你可以把它设置得更低。

如果正在读取文件并写入文件(相同或其他文件),则应考虑使用内存映射文件。这样,您就可以摆脱缓冲区(由OS管理),并且可以对整个映像调用一次函数。请注意,如果您的图像大于4GB,在32位系统上这可能不是一个好主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27940967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档