小编pla*_*cel的帖子

将std :: vector <std :: string>作为C风格字符串数组传递(char**)

我想将std :: strings的向量传递给OpenGL作为C样式的空终止字符数组(const char**)的数组.

void glTransformFeedbackVaryings(GLuint program,
                                 GLsizei count,
                                 const char **varyings,
                                 GLenum bufferMode);
Run Code Online (Sandbox Code Playgroud)

可能吗?

c++ opengl c++11

2
推荐指数
1
解决办法
1953
查看次数

检查树是否满足红黑树的黑高属性

如何递归检查给定的红黑树是否遵守"从节点到空链路的每条路径必须包含相同数量的黑节点"的规则.我正在使用这个结构:

enum color = {RED, BLACK};

typedef struct node {
    int value;
    struct node* left;
    struct node* right;
    color c;
} node;
Run Code Online (Sandbox Code Playgroud)

我试图使用这个原型实现一个算法:

bool isRBT(struct node* tree, int numberBlackNodesLeft, int numberBlackNodesRight)
Run Code Online (Sandbox Code Playgroud)

但是,我无法递归计算这些数字.因为,规则强制要求来自一个节点的每条路径都必须重复该规则.这对我来说很难实现.

请问有什么好主意吗?

提前致谢!

c c++ algorithm tree red-black-tree

2
推荐指数
1
解决办法
2247
查看次数

分析 _mm_setzero_ps 和 {0.0f,0.0f,0.0f,0.0f}

编辑:正如 Cody Gray 在他的评论中指出的那样,禁用优化的分析完全是浪费时间。那么我应该如何进行这个测试呢?


微软在其XMVectorZero情况下定义了_XM_SSE_INTRINSICS_使用_mm_setzero_ps{0.0f,0.0f,0.0f,0.0f}不使用。我决定看看胜利有多大。因此,我在 Release x86 中使用了以下程序,并将配置属性>C/C++>优化>优化设置为Disabled (/Od)

constexpr __int64 loops = 1e9;
inline void fooSSE() {
    for (__int64 i = 0; i < loops; ++i) {
        XMVECTOR zero1 = _mm_setzero_ps();
        //XMVECTOR zero2 = _mm_setzero_ps();
        //XMVECTOR zero3 = _mm_setzero_ps();
        //XMVECTOR zero4 = _mm_setzero_ps();
    }
}
inline void fooNoIntrinsic() {
    for (__int64 i = 0; i < loops; ++i) {
        XMVECTOR zero1 = { 0.f,0.f,0.f,0.f };
        //XMVECTOR zero2 …
Run Code Online (Sandbox Code Playgroud)

c++ profiling sse visual-studio

2
推荐指数
1
解决办法
985
查看次数

如何使用SSE2加载16 x 8位整数

假设我有16个8位整数,我想将它们加载到__m128i使用SSE2中:

__m128i v = _mm_set_epi8(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
Run Code Online (Sandbox Code Playgroud)

我可以静态使用,_mm_set_epi8但我想动态地这样做; 值将在运行时决定.

C = userinput;
for(int i=0; i<16; i++)
{
    load C*i on v at position i
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

x86 sse simd sse2

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

32位有符号整数乘法,不使用64位数据类型

我想在不使用64位数据类型的情况下进行32位有符号整数乘法.我的输入是Q1.31(两种)格式.

input1 = A32 (Ah Al) - higher, lower half's of A32
input2 = B32 (Bh Bl) - higher, lower half's of B32
Run Code Online (Sandbox Code Playgroud)

结果应为Q1.31格式,保留溢出情况.

我需要C代码.请提供格式说明.

c signed integer bit-manipulation multiplication

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

C++ 11正则表达式模式匹配

鉴于ECMAScript正则表达式,我试图针对指定的模式测试字符串.例如,字符串"+0.1"应该通过测试.但结果std::regex_match假的.

#include <regex>
#include <string>

std::regex format("^[+-]?\d{1,3}\.?\d?$");
std::string str = "+0.1";

bool match = std::regex_match(str, format); // false
Run Code Online (Sandbox Code Playgroud)

我还在regexr上测试了正则表达式模式并且它有效.

那我错了什么?

c++ regex c++11

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

使用 AVX2 有条件地选择一个常数值

我正在寻找一种基于 AVX2 值的特定条件来选择 AVX2 常量的无分支方式。

我现在正在做的伪代码:

condition = _mm256_cmp_gt(value, limit);
result = _mm256_or(_mm256_and(condition, constant_a), 
                   _mm256_andnot(condition, constant_b));
Run Code Online (Sandbox Code Playgroud)

还有比这更有效的吗?

x86 simd intrinsics avx avx2

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

将Vector加载到SSE寄存器中

我正在尝试将一个向量加载到SSE寄存器中,我的代码编译没有错误,但是当我尝试运行它时,我有分段错误.这是我的代码:

inline int SSEJaccard::calcSSEJaccardDist(unsigned int id1, unsigned int id2) {
  int result;
  __m128i v, v1;
  std::vector<uint32_t> &fv1 = fvs[id1];
  std::vector<uint32_t> &fv2 = fvs[id2];
  v = _mm_load_si128((__m128i const*) (&fv1));
  v1 = _mm_load_si128((__m128i const*) (&fv2));
  v = _mm_and_si128(v,v1);
  result =_mm_extract_epi16(v, 0) + _mm_extract_epi16(v, 4);
 return result;
}
Run Code Online (Sandbox Code Playgroud)

fsv是一个全局变量,定义如下:

std::vector<std::vector<uint32_t> > fvs;
Run Code Online (Sandbox Code Playgroud)

我正在使用英特尔编译器(ICC).谢谢

c++ x86 sse vector vectorization

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

将uint64_t rdtsc值转换为uint32_t

我有一个RNG功能xorshift128plus,需要一个Xorshift128PlusKey:

/** 
        * \brief Keys for scalar xorshift128. Must be non-zero.
        * These are modified by xorshift128plus.
        */
        struct Xorshift128PlusKey
        {
            uint64_t s1;
            uint64_t s2;
        };

        /** 
        * \brief Return a new 64-bit random number.
        */
        uint64_t xorshift128plus(Xorshift128PlusKey* key);
Run Code Online (Sandbox Code Playgroud)

我想使用rdtsc(处理器时间戳)为我的RNG 播种.问题是__rdtscmsvc下的内在函数返回64位无符号整数,种子必须是32位无符号整数.什么是对RDTSC转换为种子的最佳方式,同时保留随机性.转换必须尽可能快.

我不能使用std libboost.(这是一个游戏引擎)

c++ random integer rdtsc unsigned-integer

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

生成具有非重复随机模式的图像

一段时间以来,我一直在尝试创建一种特殊的随机模式。例如随机的黑点,像这样:

https://picload.org/thumbnail/riogwpll/pattern2.jpg

但是,我需要一个更大的图像,大约有 100,000 个点/圈。原则上没有问题,但是,具有几个 MB 的 SVG 会变得太大而无法打开它,例如,使用 Inkscape,因为每个圆圈都是单独绘制的。任何想法如何更好地实现,从而产生更小的文件。我已经尝试过一些带有模式的东西。问题是它应该是一个真正随机的、不重复的模式。

没有必要用点来做这件事,它也可以是这样的:[在此处输入图像描述][1] https://picload.org/thumbnail/riogwwdr/pattern1.jpg

对于想法/建议,我很感激。

language-agnostic random svg

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