小编Bra*_*ram的帖子

如何启动和停止性能采样

我正在使用 perf 对程序的性能进行采样。

这对我有用:

$ perf record -g  ./bench
...
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.023 MB perf.data (93 samples) ]
$ ls -al perf.data
-rw------- 1 bram bram 26848 Oct 25 10:22 perf.data
Run Code Online (Sandbox Code Playgroud)

但现在我想在程序中的特定点开始和停止收集。但如果我这样做:

$ perf record -g -e cycles --filter="start render_image" ./bench
--filter option should follow a -e tracepoint option
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为过滤器标志确实遵循 -e 选项。这里发生了什么?

我也对 perf.data 的体积如此之小感到困惑,难道它真的只收集了 93 个样本吗?它运行了几秒钟。

最后,我假设“-e Cycles”是默认事件?

更新:正如 Arnabjyoti Kalita 所解释的,有一类特殊的事件称为跟踪点。如果我以 root 身份运行 …

profiling perf

6
推荐指数
1
解决办法
6449
查看次数

使用GameKit时,将源文件类型更改为Objective-C++会导致链接器错误

所以我在Objective-C应用程序上使用Xcode 6.1.我的应用程序使用GameKit框架.

我试图从我的GameViewController(Objective-C源代码)调用外部C++方法.

为了使GameViewController.mm编译,我必须手动将类型设置为'Objective-C++ Source'.

但是,即使源现在编译,它也将无法链接:

    Undefined symbols for architecture x86_64:
 "_OBJC_CLASS_$_GLKViewController", referenced from:
      _OBJC_CLASS_$_GameViewController in GameViewController.o
  "_OBJC_METACLASS_$_GLKViewController", referenced from:
      _OBJC_METACLASS_$_GameViewController in GameViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

我只能通过将类型设置回'Objective-C Source'并删除对外部C++函数的调用来消除链接器错误.

如果我的源代码编译为'Objective-C++ Source'而不是'Objective-C Source'类型,为什么链接器会失败?

请注意,我在Build-phases中正确地链接了GameKit.

c++ objective-c gamekit

5
推荐指数
1
解决办法
1089
查看次数

来自 Android Studio 的详细构建日志

使用 Android Studio 构建时如何获取详细日志(包括编译器和链接器的命令行参数)?

我刚刚从 Ant / Android.mk 构建过渡到 Android-Studio 构建。使用旧系统,我能够通过执行以下操作来了解编译器是如何调用的:

$ ndk-build V=1
Run Code Online (Sandbox Code Playgroud)

Android Studio 中实现此目的的等效设置是什么?我怀疑我的项目是针对错误的 GLES 版本(gles2 而不是 gles3)构建的,并希望通过查看链接器的命令行参数来确定。

android android-ndk android-studio build.gradle

5
推荐指数
1
解决办法
2945
查看次数

使用Gradle / Android Studio为Android构建独立的静态库

我已经将基于NDK的应用程序从命令行蚂蚁构建过渡到了Android Studio。

Android Studio位于Gradle之上。Gradle调用CMake来构建C ++代码。

我正在寻找的是一种仅为Android目标armv7,arm64,x86等构建一组静态.a文件的方法。

Android Studio项目面向完整的应用程序。

有没有办法让Gradle(或AStudio)仅构建静态库(.a),而无需构建应用程序或共享库?

我正在linux下使用所有最新的Android东西:Android Studio 3.0 canary4。NDK 15.0.4075724

android gradle android-ndk android-studio

5
推荐指数
1
解决办法
1683
查看次数

MSAA 和顶点插值导致值超出范围

我将GLSL与顶点着色器和片段着色器一起使用。

顶点着色器输出highp float[0,1]范围内的a

当它到达片段着色器时,我看到值(在三角形边缘)不少于 1.1!

这个问题就会消失,如果我...

如果启用了 MSAA,固定的 0 到 1 高精度浮点如何以远大于 1 的值到达片段着色器?

顶点着色器代码:

out highp float lightcontrib2;
...
lightcontrib2 = clamp( irrad, 0.0, 1.0 );
Run Code Online (Sandbox Code Playgroud)

片段着色器代码:

in highp float lightcontrib2;
...
if (lightcontrib2>1.1) { fragColor = vec4(1,0,1,1); return; }
Run Code Online (Sandbox Code Playgroud)

果然,使用 MSAA 4x,这就是 OpenGL 生成的图像。(观察窗口中心的磁铁色像素。)

洋红色像素

我已经排除了非数字值。

GL_版本:3.2.0 NVIDIA 450.51.06

interpolation glsl msaa

5
推荐指数
1
解决办法
389
查看次数

解释 AMD RDNA3 指令名称

我正在尝试分析为 RDNA3 AMD GPU 编译的 OpenCL 内核。

为此,我使用Radeon GPU 分析器。

当我在分析器中加载 OpenCL 内核时,它会在 gfx1102 (RDNA3) 程序集中显示其汇编指令。

到目前为止,一切都很好。

不过,我很难解释指令名称。我可以在ISA 文档中查找它们,但通常不会列出完整的指令名称。

在我的内核的内部循环中,我对 16 位浮点值进行乘加。

我看到这翻译成:

v_fmac_f16_e32    v?, v?, v?
Run Code Online (Sandbox Code Playgroud)

这似乎很合适,因为我知道“v”代表向量,fmac代表融合乘加,f16代表16位浮点参数。

但文档没有描述后缀_e32

_e32RDNA3组装中的suffic是什么意思?

assembly opencl amd-gpu

5
推荐指数
1
解决办法
135
查看次数

Google Play游戏服务集成失败,"Play游戏回调表示连接失败".

我使用极简主义代码示例将Google游戏服务与我的NDK游戏集成在一起.

启动应用程序时,身份验证在日志中失败:

V/GamesNativeSDK( 7212): Play Games callback indicates connection failure.
I/GamesNativeSDK( 7212): UI interaction required to connect to Google Play.
I/TeapotNativeActivity( 7212): Sign in finished with a result of -3
I/biplane ( 7212): OnAuthActionFinished
I/biplane ( 7212): You are not logged in!
I/TeapotNativeActivity( 7212): Fetching all blocking
I/TeapotNativeActivity( 7212): --------------------------------------------------------------
I/TeapotNativeActivity( 7212): Fetching all nonblocking
I/TeapotNativeActivity( 7212): --------------------------------------------------------------
I/TeapotNativeActivity( 7212): Achievement response status: -3
Run Code Online (Sandbox Code Playgroud)

我已执行在线文档中列出的所有步骤,包括:

  • 在Google Play开发者控制台中创建了一个游戏服务,并链接了两个应用.
  • 使用Debug键链接应用程序
  • 链接器应用程序与释放键
  • 从链接的应用程序(两个链接的应用程序的相同ID)中获取app-id并将其放在res/values/ids.xml中
  • 创建排行榜,并将其ID放在res/values/game-ids.xml中
  • 添加了标签到我的AndroidManifest.xml,名称="com.google.android.gms.games.APP_ID"和value ="@ string/app_id"
  • 下载最新的Game Services应用程序更新.
  • 将自己列为测试用户.

我不确定哪条消息是原始错误,哪个是症状."连接失败"或"需要UI交互".

请注意,在开发者控制台中,两个链接的应用程序列为"准备发布".

我使用的源代码是来自c …

android-ndk google-play-services google-play-games

4
推荐指数
1
解决办法
2957
查看次数

确定__m256值的SIMD通道的最小值

我知道通常应该避免跨SIMD通道的操作.但是,有时必须这样做.

我正在使用AVX2内在函数,并在__m256中有8个浮点值.

我想知道这个向量中的最低值,并使问题复杂化:也就是在哪个插槽中.

我目前的解决方案是内存往返,我不喜欢:

float closestvals[8];
_mm256_store_ps( closestvals, closest8 );

float closest  = closestvals[0];
int closestidx = 0;
for ( int k=1; k<8; ++k )
{
    if ( closestvals[k] < closest )
    {
        closest = closestvals[ k ];
        closestidx = k;
    }
}
Run Code Online (Sandbox Code Playgroud)

没有去往/从记忆中这样做的好方法是什么?

c simd intrinsics avx avx2

4
推荐指数
1
解决办法
366
查看次数

提示编译器可以使用对齐的memcpy

我有一个由7个__m256值组成的结构,它在内存中以32字节对齐的方式存储.

typedef struct
{
        __m256 xl,xh;
        __m256 yl,yh;
        __m256 zl,zh;
        __m256i co;
} bloxset8_t;
Run Code Online (Sandbox Code Playgroud)

我通过使用posix_memalign()动态分配数据的函数或使用(aligned(32))静态分配数据的属性来实现32字节对齐.

对齐很好,但是当我使用两个指向这样的结构的指针,并将它们作为memcpy()的目标和源传递时,编译器决定使用它__memcpy_avx_unaligned()来复制.

我如何强制clang使用对齐的avx memcpy函数,我认为这是更快的变体?

操作系统:Ubuntu 16.04.3 LTS,Clang:3.8.0-2ubuntu4.

UPDATE
仅在复制两个或多个结构时调用__memcpy_avx_unaligned().当只复制一个时,clang会发出14个vmovup指令.

c glibc memory-alignment memcpy avx

4
推荐指数
1
解决办法
653
查看次数

为什么 vkAcquireNextImageKHR() 从不阻塞我的线程?

我正在使用Vulkan 图形API(通过BGFX)进行渲染。我一直在测量我的电话需要多少(挂钟)时间。

我不明白的是vkAcquireNextImageKHR () 总是很快,而且从不阻塞。即使我禁用超时并使用信号量来等待演示。

演示文稿锁定为 60Hz 显示速率,我看到我的主循环确实以 16.6 或 33.3 毫秒运行。

我不应该在vkAcquireNextImageKHR()通话时长中看到此显示率的等待时间吗?

分析器将这个调用测量为 0.2 毫秒左右,而不是帧的重要部分。

VkResult result = vkAcquireNextImageKHR(
    m_device
  , m_swapchain
  , UINT64_MAX
  , renderWait
  , VK_NULL_HANDLE
  , &m_backBufferColorIdx
);
Run Code Online (Sandbox Code Playgroud)

目标硬件是手持控制台。

graphics semaphore vsync vulkan

4
推荐指数
1
解决办法
542
查看次数