小编Bra*_*ram的帖子

如何选择AVX比较谓词变体

在高级向量扩展(AVX)中,比较指令如_m256_cmp_ps,最后一个参数是比较谓词.谓词的选择压倒了我.它们似乎是类型,排序,信号的三重奏.例如_CMP_LE_OS是'小于或等于,有序,信令.

对于初学者来说,是否存在选择信令或非信令的性能原因,同样,有序或无序的速度比另一个更快?

什么'非信令'甚至意味着什么?我根本无法在文档中找到这个.任何关于何时选择什么的经验法则?

以下是avxintrin.h的谓词选择:

/* Compare */
#define _CMP_EQ_OQ    0x00 /* Equal (ordered, non-signaling)  */
#define _CMP_LT_OS    0x01 /* Less-than (ordered, signaling)  */
#define _CMP_LE_OS    0x02 /* Less-than-or-equal (ordered, signaling)  */
#define _CMP_UNORD_Q  0x03 /* Unordered (non-signaling)  */
#define _CMP_NEQ_UQ   0x04 /* Not-equal (unordered, non-signaling)  */
#define _CMP_NLT_US   0x05 /* Not-less-than (unordered, signaling)  */
#define _CMP_NLE_US   0x06 /* Not-less-than-or-equal (unordered, signaling)  */
#define _CMP_ORD_Q    0x07 /* Ordered (nonsignaling)   */
#define _CMP_EQ_UQ    0x08 /* Equal (unordered, non-signaling)  */
#define …
Run Code Online (Sandbox Code Playgroud)

simd avx

35
推荐指数
2
解决办法
7360
查看次数

输出matplotlib图到SVG,文本为文本,而不是曲线

当我使用matplotlib.pyplot.savefig("test.svg", format="svg")将图形导出为SVG时,生成的SVG文件非常庞大.

这是因为我的图中有很多文本注释,每个文本最终都是SVG中的路径.

我希望我的文本最终成为SVG中的文本字符串,而不是路径.如果文本字符串以这种方式导出,那么解释输出也变得太难了.

有没有办法强制matplotlib输出文本作为文本,而不是曲线?

目前,我在SVG文件中看到了这些代码片段:

<path d=" M9.8125 72.9062 L55.9062 72.9062 L55.9062 64.5938 L19.6719
64.5938 L19.6719 43.0156 L54.3906 43.0156 L54.3906 34.7188 L19.6719
34.7188 L19.6719 8.29688 L56.7812 8.29688 L56.7812 0 L9.8125 0 z "
id="DejaVuSans-45" />
Run Code Online (Sandbox Code Playgroud)

svg matplotlib

22
推荐指数
1
解决办法
4791
查看次数

AVX 256位等效于_mm_load1_ps

使用SSE,您可以将内存中的单个浮点数加载到__m128的所有4个插槽中,并使用内部_mm_load1_ps()

当使用带有AVX的256位宽SIMD时,似乎没有_mm256_load1_ps()将单个浮点数从存储器加载到向量的所有8个插槽中.

为什么会遗漏这个遗漏,最好的方法是什么呢?

或者甚至更好:有没有办法将单个浮点数加载到向量的目标槽0..7?

simd intrinsics avx

8
推荐指数
1
解决办法
1290
查看次数

在OpenGL3核心配置文件中使用矩阵作为顶点属性

我在OSX上使用OpenGL3.2 Core Profile.我想做实例绘图(glDrawArraysInstanced),我为每个实例传递一个矩阵.

我的顶点着色器构建得很好:

#version 150
in mediump vec4 position;
in mediump mat4 trf;
in lowp vec4 rgb;
out lowp vec4 colour;
uniform highp mat4 modelcamviewprojmat;
void main()
{
    mediump vec4 tpos = trf * position;
    gl_Position = modelcamviewprojmat * tpos;
    colour = rgb;
}
Run Code Online (Sandbox Code Playgroud)

'trf'的绑定很好:

glBindAttribLocation(program, ATTRIB_TRF, "trf" );
Run Code Online (Sandbox Code Playgroud)

但是我如何传递我的数据呢?glVertexAttribPointer无法传递大于4个浮点数的值.所以这个调用失败了:

glVertexAttribPointer( ATTRIB_TRF,   16, GL_FLOAT, 0, 16 * sizeof(float), ... );
Run Code Online (Sandbox Code Playgroud)

我怀疑我需要用4次调用glVertexAttribPointer来替换它,每次调用4次浮点数.但是我可以将什么价值用于'指数'(第一个参赛)?我是否需要使用4个向量属性,并在GLSL顶点着色器中组合四个向量?如果是这样,什么样的GLSL代码实现了这一点?或者我可以使用BindAttribLocation的返回值并对所有行使用val + 0,val + 1,val + 2和val + 3吗?

glsl vbo opengl-3

7
推荐指数
1
解决办法
5088
查看次数

RISCV无分支编码

在英特尔 AVX 上,存在无分支代码的可能性。您可以计算这两种情况,并根据条件混合结果,而不是针对 case0 或 case1 进行分支。

AVX 使用vblendps指令以 8 种方式实现浮动。

您还可以使用 x86 指令CMOVcc以标量方式(无需向量)执行此操作,该指令有条件地执行移动操作。

注意:ARM 有CSEL,NEON 有VBSL

RISCV64 可以做这样的标量移动吗,这样你就不必分支

a = c ? x : y;
Run Code Online (Sandbox Code Playgroud)

据我了解,RISCV 实现是有序的,因此在不需要分支时它比 x86 更有好处。(后者至少可以围绕一些指令进行洗牌,甚至可以推测性地分支以隐藏延迟。)

我能找到的最接近 riscv 的无分支操作是SLT(设置小于),但设置为 1 或 0,然后需要乘法?将 SLT 设置为 -1 或 0 不是更有用,这样我们就可以进行 AND 运算吗?

更新

做时:

int foo(int a, int b, int x, int y)
{
    return a < b ? x : y;
}
Run Code Online (Sandbox Code Playgroud)

我尝试了使用 SLT 的穷人版本的无分支。我不确定我是否完全正确,通过使用位掩码作为 0 - 条件(0|1),我想出了:

branchless: …
Run Code Online (Sandbox Code Playgroud)

assembly cpu-architecture riscv conditional-move branchless

7
推荐指数
2
解决办法
1657
查看次数

Android IAB v5:不支持查询产品详细信息

我正在将我的应用程序从 IAB v1 升级到 IAB v5。

我可以成功连接计费客户端。

但如果我随后尝试查询产品详细信息,我会收到来自 BillingClient 的警告:

不支持查询商品详情。

查询代码是从文档中复制的:

        QueryProductDetailsParams queryProductDetailsParams =
                QueryProductDetailsParams.newBuilder()
                        .setProductList(
                                List.of(
                                        QueryProductDetailsParams.Product.newBuilder()
                                                .setProductId("premium")
                                                .setProductType(BillingClient.ProductType.INAPP)
                                                .build()))
                        .build();

        billingClient.queryProductDetailsAsync(
                queryProductDetailsParams,
                new ProductDetailsResponseListener() {
                    public void onProductDetailsResponse(BillingResult billingResult,
                                                         List<ProductDetails> productDetailsList) {
                        // check billingResult
                        // process returned productDetailsList
                        Log.d(TAG, "Got details for " + productDetailsList.size() + " products." );
                    }
                }
        );

Run Code Online (Sandbox Code Playgroud)

onProductDetailsResponseListener()调用该方法,但产品详细信息列表为空。

产品premiumID有效,已使用IAB v1库多次成功购买。

为什么我会收到此警告消息?为什么不支持查询详情?

我的 gradle 文件引入了 IAB v5:

dependencies {
    ...
    api 'com.android.billingclient:billing:5.0.0'
}
Run Code Online (Sandbox Code Playgroud)

更新1

如果我使用以下 API 通过 …

java android in-app-billing

7
推荐指数
1
解决办法
1832
查看次数

GLSL 相当于 LINES 的 gl_PointCoord 是什么?

因此,在 OpenGLES-2 中,片段着色器可以访问gl_PointCoord以查看片段在点基元上的位置。

还有gl_FragCoord可以查看片段在帧缓冲区中的位置。

但是,gl_LineCoord在哪里?它不存在,那么我的片段着色器如何知道线基元上片段的位置?

我想知道这一点的原因是我想做一条虚线,在屏幕空间而不是世界空间中使用虚线。

我目前能想到的唯一方法是采用 fragCoord.x^2 + fragCoord.y^2 的 sqrt 但如果只有 gl_LineCoord 可用,这听起来很昂贵且不必要。

glsl opengl-es-2.0

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

Android 模拟器和 OpenGL ES3:EGL_BAD_CONFIG

我在我的 Ubuntu 主机上运行一个Android 虚拟设备。它使用的是 CPU/ABI Intel Atom (x86),而我使用的是主机 GPU。模拟器使用的是基于内核的虚拟机

使用的设置

只要我使用 OpenGL ES2 上下文,这就会非常有效。但是,如果我的应用程序尝试创建 OpenGL ES3 上下文,则使用...

const EGLint contextAttribs[] = {
    EGL_CONTEXT_CLIENT_VERSION, 3,
    EGL_NONE
};
context = eglCreateContext(display, config, NULL, contextAttribs);
Run Code Online (Sandbox Code Playgroud)

...然后我收到一个EGL_BAD_CONFIG错误:

I/biplane ( 2839): EGL: vendor Android version 1.4 Android META-EGL
I/biplane ( 2839): EGL: client apis OpenGL_ES
I/biplane ( 2839): number of EGL configurations that match our preferred criteria: 1
I/biplane ( 2839): R8 G8 B8 A8 DEPTH24
E/EGL_emulation( 2839): tid 2852: …
Run Code Online (Sandbox Code Playgroud)

android kvm android-virtual-device android-emulator opengl-es-3.0

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

如何启动和停止性能采样

我正在使用 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
查看次数

使用变量使用_mm256_extract_epi32()内在函数索引simd向量

我正在使用AVX内在_mm256_extract_epi32().

我不完全确定我是否正确使用它,因为gcc不喜欢我的代码,而clang编译并运行它没有问题.

我是基于整数变量的值来提取通道,而不是使用常量.

使用clang3.8(或clang4)为avx2编译以下代码段时,它会生成代码并使用vpermd指令.

#include <stdlib.h>
#include <immintrin.h>
#include <stdint.h>

uint32_t foo( int a, __m256i vec )
{
    uint32_t e = _mm256_extract_epi32( vec, a );
    return e*e;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我改用gcc,那么就说gcc 7.2然后编译器无法生成代码,错误如下:

In file included from /opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/immintrin.h:41:0,
                 from <source>:2:
/opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/avxintrin.h: In function 'foo':
/opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/avxintrin.h:524:20: error: the last argument must be a 1-bit immediate
   return (__m128i) __builtin_ia32_vextractf128_si256 ((__v8si)__X, __N);
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/immintrin.h:37:0,
                 from <source>:2:
/opt/compiler-explorer/gcc-7.2.0/lib/gcc/x86_64-linux-gnu/7.2.0/include/smmintrin.h:449:11: error: selector must be an integer constant in the …
Run Code Online (Sandbox Code Playgroud)

simd intrinsics avx avx2

6
推荐指数
2
解决办法
778
查看次数