小编JAT*_*rim的帖子

字节数组置换SSE优化

我想使用SSE内在函数翻译此代码.我找到了可能与此代码一起使用的pshufbSSSE3指令和类似的__builtin_ia32_pshufb128(v128i, v128i)GCC内在函数.代码s通过索引k通过特定方式交换数组中的字节来置换字节向量.

void permutation(int k, std::vector<char> & s) 
{
  for(size_t j = 1; j < s.size(); ++j) 
  {
      std::swap(s[k % (j + 1)], s[j]); 
      k = k / (j + 1);
  }
}
Run Code Online (Sandbox Code Playgroud)

我花了一个小时思考如何将代码翻译成pshufb.是否有可能用单个信号置换16个字节,pshufb还是需要多个指令?足够好的解决方案将在时间上只置换16个字节.

编辑:问题的进一步背景:我正在迭代所有可能的排列s.提前计算k = 0, 1, 2,...多个结果s是可以的.但是我需要k稍后再现-th置换,最好是O(1)操作.

c++ gcc sse x86-64 simd

12
推荐指数
1
解决办法
633
查看次数

CMake正则表达式匹配列表中的目录

所以我有这样的文件(或值)列表

set(HEADER_FILES DirA/header1.h DirA/header2.hpp
                DirB/header3.h DirB/stuff.hpp)
Run Code Online (Sandbox Code Playgroud)

那么如何才能在DirA中获取文件的子列表?我正在使用CMake 2.8.x并且我累了正则表达式匹配:

string(REGEX MATCHALL "DirA/(.+)" DirA_FILES ${HEADER_FILES})
Run Code Online (Sandbox Code Playgroud)

但结果只是原始字符串的副本,如:"DirA/header1.h DirA/header2.hpp DirB/header3.h DirB/stuff.hpp"或什么都没有.

再好一点,在写这个问题时我解决了它:

set(SubListMatch)
foreach(ITR ${HEADER_FILES})
    if(ITR MATCHES "(.*)DirA/(.*)")
        list(APPEND SubListMatch ${ITR})
    endif()
endforeach()
Run Code Online (Sandbox Code Playgroud)

但是CMake对我来说是一件很新鲜的事情,那么如何将该代码包装成函数呢?到目前为止,我从未编写任何CMake函数.

regex list cmake

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

C++11 thread_local 析构函数行为

我有以下情况:在标头“test.hpp”中我定义:

class ObjectA {
    public:
        ObjectA();
        ~ObjectA();
        static ObjectA & get_A();
};
class ObjectB {
    public:
        ~ObjectB();
        static ObjectB & get_B();
        void do_cleanup();
};
Run Code Online (Sandbox Code Playgroud)

在单独的编译单元中,我实现了 ObjectB:

#include "test.hpp"
#include <iostream>
ObjectB::~ObjectB() {
    std::cout<<"ObjectB dtor"<<std::endl;
}
ObjectB & ObjectB::get_B() {
    thread_local ObjectB b_instance;
    return b_instance;
}
void ObjectB::do_cleanup() {
    std::cout<<"Clearing up B garbage..."<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

对象A:

#include "test.hpp"
#include <iostream>
ObjectA::ObjectA() {
    ObjectB::get_B(); <--dummy call to initialize thread_local ObjectB;
}
ObjectA::~ObjectA() {
     std::cout<<"ObjectA dtor"<<std::endl;
     ObjectB::get_B().do_cleanup(); // <-- is this undefined behaviour??
} …
Run Code Online (Sandbox Code Playgroud)

c++ destructor thread-local

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

找不到std :: set <int> min-max中的第一个值

如何找到第一个存在的值h,使结果被限制在范围内.std::set<int> ids[0, *ids.rbegin() + 1]

我认为这是一个相当简单的问题,但我还没有找到任何匹配的问题.基本上我想要倒置的一套,ids以便我可以使用它们.

到目前为止我有以下内容:

#incldue <set>
std::set<int> ids;
int h = 0;
for(; !ids.empty() && (h <= *ids.rbegin() + 1); ++h) {
    if(!ids.count(h)) {
        break;
    }
}
// h is now smallest value not in ids.
Run Code Online (Sandbox Code Playgroud)

我怀疑这会进一步改进,例如不需要循环?

@edit:澄清集合中的值:在我的用例中,算法生成的值被插入到集合中.我应该说的真的std::set<unsigned int>.我很高兴在这个问题上进行了如此多的讨论!

c++ algorithm set

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

标签 统计

c++ ×3

algorithm ×1

cmake ×1

destructor ×1

gcc ×1

list ×1

regex ×1

set ×1

simd ×1

sse ×1

thread-local ×1

x86-64 ×1