- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试优化以下功能:(基本上它需要一行 32 位 Int,并将每个 int 复制到一个更大的目标数组中,然后复制每一行
for(int i = 0; i < numLines; i++)
{
pStartOfLine = pDest;
for(int j = 0; j < intsPerLineSrc; j++)
{
*pDest = *pSrc; // copy pixel A to FullSizeBuffer A
pDest++; // Move dest Ptr to next Pixel
*pDest = *pSrc; // Copy pixel A to FullsizeBuffer AGAIN
pDest++; // Move Src and Dst Pointrs to next pixels
pSrc++;
}
memcpy(pDest, pStartOfLine, (8*intsPerLineSrc) ); // Duplicate the Line written to pDest, to next line of pDest.
pDest = pDest + (2*intsPerLineSrc); // move pDest to Start of Next Line
}
在两个维度上有效地将图像缩放到 2 * 原始大小。现在,这让我觉得应该从 SIMD 中获益匪浅,但是我似乎找不到可以在这种特定情况下为我提供帮助的正确的内在指令集。
有人愿意帮助我吗?或者我是否会在如此简单的操作中始终受到内存限制,以至于在 SIMD 中重构是一种浪费?
是的,这部分代码最终在多线程中运行,因此它已经是大量多线程的,但我认为 SIMD 优化可能更有帮助。
干杯,任何帮助/建议,
詹姆斯
最佳答案
您当前的操作受内存带宽限制。
如果您能找到一种不处理整个图像而是处理 block (例如 16x16 像素 block 到 32x32 像素 block )并在每个 block 上进行其他计算的方法,那么您可能能够减少内存带宽限制。
但是如果您必须处理整个图像,您应该考虑一些事项来实现最大内存带宽:
memcpy
函数通常未针对大尺寸复制进行优化。主要原因之一是它的许多实现不使用非临时存储。非临时存储的经验法则是在大小大于最慢缓存大小的两倍时使用它们。假设您的处理器有一个 12 MB 的 L3 缓存。然后,如果目标图像的大小大于 6MB,则应考虑使用非临时存储。这几乎肯定是您的情况,因为您的代码正在写入 32 MB。这是一个如何同时使用 SSE2 和非时态存储的示例
int main() {
int n = 16;
int *src = (int*)_mm_malloc(n*sizeof(int), 16); //16 byte aligned
int *dst = (int*)_mm_malloc(2*n*sizeof(int), 16); //16 byte aligned
for(int i=0; i<n; i++) src[i] = rand();
for(int i=0; i<n; i+=4) {
__m128i x = _mm_load_si128((__m128i*)&src[i]);
__m128i lo = _mm_shuffle_epi32(x, 0x50); // 0x50 = 1100 in base 4
__m128i hi = _mm_shuffle_epi32(x, 0xfa); // 0xfa = 3322 in base 4
_mm_stream_si128((__m128i*)&dst[2*i+0], lo); //non-temporal store
_mm_stream_si128((__m128i*)&dst[2*i+4], hi); //non-temporal store
//_mm_store_si128((__m128i*)&dst[2*i+0], lo);
//_mm_store_si128((__m128i*)&dst[2*i+4], hi);
}
//for(int i=0; i<n; i++) printf("%x ", src[i]); printf("\n");
//for(int i=0; i<(2*n); i++) printf("%x ", dst[i]); printf("\n");
}
在您的情况下,将 n
替换为像素数。如果 n
不是四的倍数,那么您必须做一些清理工作,我在这里没有做。临时存储必须按 16 字节对齐才能执行此操作,这就是我对齐 dst
的原因。但是,src
不必对齐 16 字节,因此您可以使用 _mm_loadu_si128
而不是对齐 src
。
一旦您实现了单个线程的最大带宽并假设您有一个多插槽系统,您应该尝试从两个插槽获得最大带宽。我在这方面没有足够的经验来提供帮助,但我认为可以使用 numactl
来实现。参见 why-doesnt-this-code-scale-linearly举个例子。
关于c++ - SSE/优化 - 将数组复制到更大的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26398041/
我正在 Java 上开发 Tic Tac Toe 游戏(eclipse)。在我的计算机上,我的对话框非常小。我一直在努力把它做得更大。我没有任何运气。我希望这里有人能引导我走向正确的方向。下面的代码是
出于辅助功能的目的,我需要使所有可滚动控件(列表、 ListView )的滚动条更宽,滚动条箭头更大。 如何从可滚动控件(例如:TListView)获取滚动条( handle )? 如何使滚动条和箭头
在我的 flutter 应用程序中,我想制作一个圆圈作为这样的背景: 最佳答案 问题主要是当屏幕处于横向时,除非它覆盖整个屏幕,否则你不能在那里放置一个圆圈。 ClipRect 还有另一种方法,如果这
如何在列表中找到最接近的值,这将返回更高的值?示例:[3,7,12,19] 的列表,如果我的值为 8,我如何获得最接近(更大)的值 12?我想要 dart 中的这个逻辑。 最佳答案 只需过滤 List
我是一个绝对的 HTML 和 javascript 初学者,我很确定,这真的很容易实现。我生成了以下 IFRAME: document.write("");Das aktuelle Wetter in
我有点知道为什么压缩 DES 文件时它更大,但谁能给我正确的理由或链接,我似乎找不到任何原因? 谢谢:) 最佳答案 经过适当加密的密文在压缩程序看来非常像一系列随机数。如果没有以明文形式出现的模式,压
假设我有两个表,其中一个(我们称之为 person)有一个名为 type 的字段,该字段存储链接到另一个表的整数(我们称之为types 带有一个名为 id 的字段。什么会更能提高性能? 一个更大的查询
我有一个ListView,它使用GridView来显示DataTable,并且当新行添加到DataTable
我在只出现在 Firefox 中的导航菜单上遇到了一个奇怪的问题(在 IE7、8、9、10 和 Chrome 中工作正常)。菜单上的链接显示为 block ,但它们在 Firefox 中计算得比任何其
我正在使用 javax.mail 并获取邮件收件箱文件夹中的邮件计数。使用https://outlook.office.com/ Folder folderInbox = store.getFolde
我想让地球字形图标更大,以便它覆盖页面的大部分(它是矢量图像)。它不在按钮或任何东西中;它只是一个人。有没有办法做到这一点? 最佳答案 增加 glyphicon 的 font-size
我定制了一个看起来像这样的搜索栏 问题是很难捕获 slider 。所以我想做的是增加拇指的碰撞箱以使其更容易。我尝试了一些东西,但总是弄乱了搜索栏的外观。我有什么想法可以做到这一点吗? 布局.xml
我有一个问题:下载到 Documents 文件夹中的音乐比以前长 2 倍,而且体积更大。比特率也有问题(增加/减少 2 倍)。图片保存得很好,但任何音乐都有问题。也许我需要手动设置音频比特率,但我还没
为什么 div 区域仍然比图像 css 大? /image/WHDU3.jpg 如何设置 div 区域以适合图像? 最佳答案 IMG - 是行内元素,因此
我发现在对文本文件进行排序时非常困惑。不同的算法/应用程序会产生不同的结果,例如,比较两个字符串 str1=";P" 和 str2="-_-" 仅供引用,这里给出了这些字符串中每个字符的 ASCII:
我有一个应用程序已经在 Play 商店中存在多年,我刚刚构建了一个更新。该更新利用了 numberpicker,它的 min-sdk 为 11,并且在 v4 支持库中不适用。我倾向于发布我的新版本并在
你能告诉我如何强制 CSS 使 line-through 属性比元素 width 宽吗? 例如 50 结果看起来像现在如何使线条比元素更宽更明显? 赞 最佳答案 你可以使用 ,这是一种很俗气的方式 &
我想制作一个比应有的大得多的虚拟 Win32 EXE 文件。所以默认情况下,样板 Win32 EXE 文件为 80 KB。我想要一个 5 MB 的空间来测试其他一些实用程序。 第一个想法是添加资源,但
我有一个 UIView,里面有一个更大的 UIImageView。有没有办法隐藏超出 View 大小的内容? CGRect baseFrame = CGRectMake(100, 100, 300,
当我改变缓冲区的大小时,我得到了无法从 BufferedReader 解释的奇怪结果。 我曾强烈期望性能会随着缓冲区大小的增加而逐渐增加, yield 递减设置相当快,此后性能或多或少会持平。但看起来
我是一名优秀的程序员,十分优秀!