我正在编写一些AVX代码,我需要从可能未对齐的内存中加载.我目前正在加载4个双打,因此我将使用内部指令_mm256_loadu_pd ; 我写的代码是:
__m256d d1 = _mm256_loadu_pd(vInOut + i*4);
Run Code Online (Sandbox Code Playgroud)
然后,我使用选项进行编译,-O3 -mavx -g然后使用objdump获取汇编代码以及带注释的代码和line(objdump -S -M intel -l avx.obj).
当我查看底层汇编程序代码时,我发现以下内容:
vmovupd xmm0,XMMWORD PTR [rsi+rax*1]
vinsertf128 ymm0,ymm0,XMMWORD PTR [rsi+rax*1+0x10],0x1
Run Code Online (Sandbox Code Playgroud)
我期待看到这个:
vmovupd ymm0,XMMWORD PTR [rsi+rax*1]
Run Code Online (Sandbox Code Playgroud)
并充分利用256位寄存器(YMM0),而不是它看起来像海湾合作委员会已决定在128位部分(填写XMM0),然后再次加载另一半vinsertf128.
有人能够解释这个吗?在MSVC VS 2012中
使用单个vmovupd编译等效代码.
我运行gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0在Ubuntu的18.04 X86-64.
根据问题,我遇到了getnameinfo泄漏的内存.我正在使用Uccntu 12.04(Linux scv 3.2.0-35-generic#55-Ubuntu SMP Wed Dec 5 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux)和gcc 版本4.6.3.
我将我的服务器可执行文件与g ++链接,到目前为止valgrind尚未报告问题.然后我添加了一个简单的调用getnameinfo来打印出连接客户端的网络名称和端口.
我得到以下内容:
==4425== ==4425== HEAP SUMMARY: ==4425== in use at exit: 10 bytes in 1 blocks ==4425== total heap usage: 4,508 allocs, 4,507 frees, 134,939,153 bytes allocated ==4425== ==4425== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==4425== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==4425== by 0x50D7D71: strdup (strdup.c:43) ==4425== by …
可能重复:
在多线程程序中fork
如果我有一个使用fork()并且可能被开发为多线程的应用程序,那么为安全地编程这种应用程序需要考虑哪些拇指规则/指南?
我正在开发一个单线程的进程applet,它创建一个代理虚拟设备(更确切地说是一个虚拟的Xbox 360 pad); 我设法使用uinput接口创建它,我正确设置它并且它工作得很好.
为了向这个虚拟设备提供命令,我从另一个真实接口(在这种情况下是PS3 pad)中读取事件,然后用这些标志打开真实的设备文件:
fd = open("/dev/input/event22", O_RDONLY); // open the PS3 pad
Run Code Online (Sandbox Code Playgroud)
主循环类似于(减去错误检查):
while(run) {
input_event ev = {0};
read(fd, &ev, sizeof(struct input_event));
// convert from PS3 --> Xbox 360
convert(ev);
// write to the new virtual pad
write(fd_virtual, &ev, sizeof(struct input_event));
}
Run Code Online (Sandbox Code Playgroud)
你可以想象这read(fd, &ev, sizeof(struct input_event));是一个阻塞调用,我希望有一种超时循环循环并检查其他事件/执行其他代码.
由于这些原因,我想read(fd...在epoll循环中封装该调用,所以我也可以暂停.
问题是,以这种方式完成它会有效吗?通过使用epoll_wait,我是否会对当前循环引入额外的延迟,从而延迟虚拟键盘的响应能力?
我有一个奇怪的问题.我正在使用工厂注册模式,它在内部引用std :: map.我正在将这种方法用于多个组件,并且在不同的编译单元(即.cpp文件)中的多个点处进行注册.这发生在静态变量初始化时(在调用'main'之前).出于一些奇怪的原因,我指的是一个段错误
map[key] = value;
(基本上当我注册一个特定的pfn时).现在,如果我在同一个编译单元中移动特定麻烦组件的注册,一切正常.再说一遍,如果我只撤回一个组件的注册,我会得到一个段错误.
我不得不说,这不是我第一次使用这种模式,它适用于其他组件的相同可执行文件(即,在初始化时没有问题的情况下,在另一个工厂类型的多个.cpp上传播的组件使用基本相似的源代码) .
我该怎么办?现在我已经将组件的注册保留在同一个.cpp中(并且它可以完美地工作).我怎样才能更好地调查?
我正在使用g ++(Ubuntu/Linaro 4.4.4-14ubuntu5)4.4.5
在stacktrace下面
0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6
(gdb) bt
#0 0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6
#1 0x0000000000413fe9 in std::_Rb_tree_iterator, std::allocator > const, http::servlet* (*)()> >::operator-- (
this=0x7fffffffdff0) at /usr/include/c++/4.4/bits/stl_tree.h:199
#2 0x000000000041379d in std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, http::servlet* (*)()>, std::_Select1st, std::allocator > const, http::servlet* (*)()> >, std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::_M_insert_unique (this=0x632a20, __v=...) at /usr/include/c++/4.4/bits/stl_tree.h:1179
#3 0x00000000004125f2 in std::_Rb_tree, std::allocator >, std::pair, … 我现在的情况是想使用VAO/VBO来回收相同的顶点并使用索引来加速渲染。
一切都很好,除了我的纹理模型使用 UV 坐标,并且对于相同的顶点(大约 >80%),我最终可能会根据我期望渲染的三角形获得不同的 UV 坐标(事实上,我正在使用md2 模型和纹理)。
对于老式的即时模式来说,这种渲染方式非常不错。现在,解决这个问题并通过 VAO/VBO 渲染的最佳方法是什么?
我想到的是分解三角形并创建具有重复顶点的非常大的 VBO,以便我可以将正确的 UV 坐标链接到每个“相同”。
我不得不说我不喜欢这个...有什么想法吗?
诗。对于不了解格式的人:如果您想使用纹理映射,我相信您必须使用基于要渲染的三角形的自定义 UV 坐标。否则纹理颜色都乱了!