小编atb*_*atb的帖子

glsl无穷大常数

GLSL是否有+/-无穷大或NaN的任何预定义常数?我这样做是一种解决方法,但我想知道是否有一种更清洁的方式:

// GLSL FRAGMENT SHADER
#version 410

<snip>

const float infinity = 1. / 0.;

void main ()
{
    <snip>
}
Run Code Online (Sandbox Code Playgroud)

我知道这个isinf函数,但我需要为变量赋予无穷大,这对我没有帮助.

glsl infinity

13
推荐指数
3
解决办法
6644
查看次数

如何确定地址是否缓存对齐?

是否符合C++ 11标准(或者,如果不符合,至少通常可接受)的方式来确定地址是否与缓存行边界对齐?

像这样的事情:

T* p = SOMETHING;
bool aligned = reinterpret_cast< std::uintptr_t > (p) % CACHE_LINE_SIZE == 0;
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

如何使用TBB多线程"尾调用"递归

我试图使用tbb多线程现有的递归算法.单线程版本使用尾调用递归,从结构上看,它看起来像这样:

void my_func() {
    my_recusive_func (0);
}

bool doSomeWork (int i, int& a, int& b, int& c) {
    // do some work
}

void my_recusive_func (int i) {
    int a, b, c;
    bool notDone = doSomeWork (i, a, b, c);
    if (notDone) {
        my_recusive_func (a);
        my_recusive_func (b);
        my_recusive_func (c);
    }
}
Run Code Online (Sandbox Code Playgroud)

我是tbb新手所以我的第一次尝试使用了parallel_invoke函数:

void my_recusive_func (int i) {
    int a, b, c;
    bool notDone = doSomeWork (i, a, b, c);
    if (notDone) {
        tbb::parallel_invoke (
                [a]{my_recusive_func (a);},
                [b]{my_recusive_func (b);},
                [c]{my_recusive_func (c);}); …
Run Code Online (Sandbox Code Playgroud)

c++ recursion multithreading tbb c++11

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

如何使用TBB并行化std :: partition

有没有人有任何使用TBB有效并行化std :: partition的技巧?这已经完成了吗?

这是我在想的:

  1. 如果数组很小,std :: partition it(serial)并返回
  2. 否则,使用自定义迭代器将数组视为2个交错数组(在缓存大小的块中交错)
  3. 为每对迭代器启动一个并行分区任务(递归到第1步)
  4. 交换两个分区/中间指针之间的元素*
  5. 返回合并的分区/中间指针

*我希望在平均情况下,与阵列的长度相比,该区域将是小的,或者与在连续块中分区阵列所需的交换相比较.

我尝试之前的任何想法?

c++ sorting algorithm parallel-processing tbb

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

GLSL 4.1与gl_ModelViewProjectionMatrix

我正在开发一个glsl着色器程序,作为在"闭源"应用程序中运行的插件的一部分.应用程序(maya)是使用opengl 2.1编写的,但是我们的显卡支持opengl/glsl 4.1,我想在程序中使用镶嵌和几何着色器.应用程序设置opengl视口和传统的模型/视图矩阵堆栈,我无法控制代码的那一部分.

我的传递顶点着色器使用GLSL 1.2并且工作正常:

// GLSL VERTEX SHADER
#version 120

void main ()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)

我的传递几何着色器使用glsl 4.1并且在应用程序中也可以正常工作:

// GLSL GEOMETRY SHADER
#version 410

layout (lines_adjacency) in;
layout (line_strip, max_vertices = 2) out;

void main ()
{
    gl_Position = gl_in[1].gl_Position;
    EmitVertex();
    gl_Position = gl_in[2].gl_Position;
    EmitVertex();
    EndPrimitive();
}
Run Code Online (Sandbox Code Playgroud)

但这只是一个传递测试.在我的真实几何着色器中,我需要在世界空间中进行一些计算,但几何着色器点在视图空间中.我的问题是:我可以在4.1几何着色器中访问gl_ModelViewProjectionMatrix吗?我知道传统的矩阵堆栈已经在glsl 4.1中被弃用,而不是统一变量,但我无法改变应用程序.我不能在几何着色器中使用glsl 1.2,因为我需要lines_adjacency输入类型.我是否需要在我的插件的C++源代码中将矩阵复制到一个统一变量中?或者是否有一个"后门"直接从glsl 4.1获取它?或者其他我没想到的东西?

opengl glsl maya

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

std :: vector结构与元素的适当结构

是否可以构造具有初始大小的std :: vector并将其元素就位构建?我的存储类型不可复制,因此无法使用,因为初始值被构造为临时值并复制到元素:

#include <iostream>
#include <memory>
#include <vector>

struct A
{
    A(int i = 0) : i_ (i) {};
    int i_;
    std::unique_ptr<int> p_; // not copyable
};

int main()
{
    std::vector<A> v (10, 1); // error
}
Run Code Online (Sandbox Code Playgroud)

这接近于我要达到的目标,也许还算不错,但是我想知道是否有更清洁的方法:

int main()
{
    //std::vector<A> v (10, 1); // error

    std::vector<A> v;
    v.reserve (10);
    for (int i = 0; i < 10; ++i) {
        v.emplace_back (1);
    }
}
Run Code Online (Sandbox Code Playgroud)

我仅限于c ++ 11,但出于好奇,我对c ++ 17解决方案也很感兴趣。

c++ stl c++11

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

使用std :: bind与std :: reference_wrapper :: get

我正在尝试使用std::bind来调用,std::reference_wrapper::get但我无法编译.我确定我忽略了一些明显的东西,但编译错误并没有帮助我.此代码是人为设计的,并不代表我的实际用例:

#include <functional>
#include <iostream>

struct A
{
    void p() {std::cout << this << '\n';};
};

using ARef = std::reference_wrapper< A >;

int main()
{
    A a;
    a.p();
    auto p = std::bind (&A::p, std::placeholders::_1);
    p (a); // ok

    ARef ar (a);
    p (ar.get()); // ok
    auto get = std::bind (&ARef::get, std::placeholders::_1);
    p (get (ar)); // error
}
Run Code Online (Sandbox Code Playgroud)

编辑:这与clang编译好.

gcc 6.3.0输出: http ://coliru.stacked-crooked.com/a/00bffc7549193cb8

main.cpp: In function 'int main()':
main.cpp:21:19: error: no match for call to '(std::_Bind<std::_Mem_fn<A& (std::reference_wrapper<A>::*)() …
Run Code Online (Sandbox Code Playgroud)

c++ gcc functional-programming stdbind c++11

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

如何在C++ 17 STL并行算法中处理调度?

是否存在C++ 17 STL并行算法的标准调度程序规范,还是完全依赖于实现?串行算法具有复杂性保证,但调度程序实现对于非均匀任务负载的性能至关重要,规范是否解决了这个问题?如果没有标准化的调度程序,似乎很难保证跨平台性能.

c++ parallel-processing stl c++17

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