我正在开始使用多线程编程,所以如果以下内容显而易见,请原谅.我正在为图像处理程序添加多线程,并且加速并不完全是我期望的.
我目前在具有超线程(4)的4个物理处理器CPU上获得4倍的加速,所以我想知道这种加速是否是预期的.我唯一能想到的是,如果单个物理CPU的两个超线程都必须共享某种内存总线,那么它可能是有意义的.
考虑到所有内存都分配在RAM中(我明白我的操作系统的虚拟内存管理器将决定是否进入页面,因此对于多线程来说,我不完全清楚这是否会被视为I/O绑定程序)这个假设的内存量来自堆)我的机器有16Gb的RAM,以防它决定分页/交换是否是一个问题.
我编写了一个测试程序,展示了使用QThreadPool和tbb :: parallel_for的串行案例和两个并行案例
您可以看到的当前程序除了将假定的图像从黑色设置为白色之外没有任何实际操作,并且它是为了在将任何实际操作应用于图像之前知道基线是什么而完成的.
我正在附加该程序,希望有人可以解释我,如果我在这种处理算法中寻求大约8倍的加速是一个失败的原因.请注意,我对其他类型的优化(例如SIMD)不感兴趣,因为我真正关心的不仅仅是让它更快,而是使用纯多线程使其更快,而不需要进入SSE或处理器缓存级别优化.
#include <iostream>
#include <sys/time.h>
#include <vector>
#include <QThreadPool>
#include "/usr/local/include/tbb/tbb.h"
#define LOG(x) (std::cout << x << std::endl)
struct col4
{
unsigned char r, g, b, a;
};
class QTileTask : public QRunnable
{
public:
void run()
{
for(uint32_t y = m_yStart; y < m_yEnd; y++)
{
int rowStart = y * m_width;
for(uint32_t x = m_xStart; x < m_xEnd; x++)
{
int index = rowStart + x;
m_pData[index].r = 255;
m_pData[index].g = …Run Code Online (Sandbox Code Playgroud) 我有一个使用 Objective C++ 和一些外部 C++ 库的 iOS 应用程序,该应用程序使用 Crashlytics 来跟踪可能的用户崩溃。
Crashlytics 愉快地处理来自 Objective C 领域的所有异常,这在过去帮助我很多来追踪问题,我想从 C++ 端获取相同类型的崩溃日志,无论何时抛出任何异常。
不幸的是,当 std::exception 被调用时,我在 Crashlytics 中得到的只是一个不包括原点的通用堆栈跟踪,这无助于解决这些问题,也无助于任何 std 异常进入相同的事实一刀切累积的“崩溃”类型。
我可以捕获这些异常并以某种方式重定向它们,以便它们出现在 Objective C 发起的崩溃旁边吗?
我正在尝试类似的东西,但我似乎无法让它工作,同时保持 Crashlytics 处于相同的工作状态,我错过了什么吗?
我正在考虑的另一个可能的解决方案是捕获 C++ 异常并使用 Crashlytics 本身将它们记录为错误,然后从包装器中重新抛出它们。
https://docs.fabric.io/apple/crashlytics/logged-errors.html
未处理的 C++ 异常后的示例堆栈跟踪:
Crashed: com.twitter.crashlytics.ios.exception
0 MyApp 0x100d9baac CLSProcessRecordAllThreads + 4312709804
1 MyApp 0x100d9baac CLSProcessRecordAllThreads + 4312709804
2 MyApp 0x100d9b968 CLSProcessRecordAllThreads + 4312709480
3 MyApp 0x100d8b6b8 CLSHandler + 4312643256
4 MyApp 0x100d99ac4 __CLSExceptionRecord_block_invoke + 4312701636
5 libdispatch.dylib 0x182556a14 _dispatch_client_callout + 16
6 …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它使用一些已知的大文件格式,并且自 iOS4 天以来一直支持 iOS 的“打开方式...”功能。
直到最近一直运行良好,某些应用程序(例如 iOS 内置邮件应用程序)会通过在我的应用程序内的 ~/Documents/Inbox 目录中创建副本来打开该应用程序,并且生活很好。
我最近意识到“打开方式...”不再适用于我的应用程序,至少当文件通过 iOS11+ 内置文件应用程序来自 iCloud/Dropbox/GoogleDrive 时,我想知道如果我错过了什么。
检查代码后,我开始认为我必须遗漏一些非常明显的东西,因为代码似乎是正确的,无法打开文件,因为给定的路径无效或我的应用程序没有读取它们的必要权限。
这是我的代码:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)urlToOpen sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if([urlToOpen isFileURL]) // <<< this goes through
{
if([[NSFileManager defaultManager] isReadableFileAtPath:urlToOpen.path])
{
// <<< this doesn't
}
}
}
Run Code Online (Sandbox Code Playgroud)
示例工作路径:
/private/var/mobile/Containers/Data/Application/F99A3EA4-457C-4043-AEB3-A9D961184360/Documents/plane.obj
/private/var/mobile/Containers/Data/Application/F99A3EA4-457C-4043-AEB3-A9D961184360/Documents/Inbox/cube.obj
Run Code Online (Sandbox Code Playgroud)
不起作用的路径示例:
/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/somedir/somefile.ext
/private/var/mobile/Containers/Shared/AppGroup/A7FA40A0-2C7D-4FC1-BF21-A8E88B106FF9/File Provider Storage/7791941/local-storage/L3dzX3JhZmFfemFiYWxhL2Jhc2VvcmNfbWVzaC5vYmo=/somefile.ext
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,两个有效的文件都将其数据复制到设备中的本地应用程序目录中。
如何打开这些文件?请注意,我提到该应用程序使用大文件,因为它确实如此,所以我无法获得它们的内存副本,这不会有多大帮助,我需要获得一个文件路径,以便我可以进行内存映射并在正确的时间加载所需的内容。
我已经阅读了一些关于就地开放等的内容,但它不适用于我正在开发的应用程序类型,因为它不在单个“元素”上运行,我提到的大文件只是可能的来源之一因此,我所看到的有关就地开放的内容不适用于我的情况。
有没有办法让应用程序能够直接访问这些文件,或者至少将它们复制到我的应用程序沙盒临时目录中,以便我可以直接对它们进行内存映射?
干杯!
c++ ×2
ios ×2
crashlytics ×1
file-io ×1
icloud ×1
ios11 ×1
objective-c ×1
performance ×1
tbb ×1