小编Mak*_*gan的帖子

为什么vulkan会在具有集成显卡和GPU的系统中报告单个设备?

在C++中,我正在检查可用设备的数量,如下所示:

uint32_t deviceCount = 0;
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);

cout << deviceCount << endl;
vkGetPhysicalDeviceProperties(device, &deviceProperties);
vkGetPhysicalDeviceFeatures(device, &deviceFeatures);

cout << deviceProperties.deviceName << endl;
Run Code Online (Sandbox Code Playgroud)

这是打印出来的1 Geforce GTX 1070.

我的系统有一个GTX 1070和第四代intel 5处理器,带有集成显卡.根据我的理解,对于Vulkan应该足够好.

那么为什么我的程序只能拿起GTX 1070呢?它不应该也能找到集成显卡吗?

编辑:

根据cpuinfo的确切模型是: Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz

编辑2:

我的操作系统是Arch linux

c++ hardware graphics gpu vulkan

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

简单来说,textureGrad()是什么?

我在此阅读了khronos Wiki

但是我真的不明白它在说什么。TextureGrad到底做什么?

我认为它会采样多个mipmap级别,并使用为其提供的显式导数向量来计算一些颜色混合。但我不确定。

opengl graphics glsl

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

打字机水平显示2张图像?

我正在使用 typest 渲染一些东西,我想要并排显示 2 个图像,我弄清楚了如何垂直获取东西:

#figure(
  (image("eulerian.svg", width: 10%),
  image("lagrangian.svg", width: 10%)).join(),
  caption: [A curious figure.],
) <glacier>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我现在想知道如何使事情水平化。

math markup typesetting typst

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

什么是__aeabi_unwind_cpp_pr1',如何避免呢?

我有一堆手臂组装件,C和C ++文件。gcc正在尝试链接它们,但是这些是针对嵌入式项目的。

我没有使用任何外部库,正在使用的所有代码都是由我编写的。似乎发生了错误,因为我有一个称为int kernel_main(void)define 的函数main.c,它试图调用其中包含标头的set_LED(int value)定义(我确实在main.c文件中包含标头)。mailbox.cppmailbox.h

确切的错误是:

undefined reference to `__aeabi_unwind_cpp_pr1'
Run Code Online (Sandbox Code Playgroud)

我制作项目的方式是:-将所有源文件(.s,.c,.cpp)编译为目标文件(.o),而无需链接(-c),然后使用自定义链接器将它们链接在一起脚本。

编辑:我将添加一些信息,以使事情更清楚。

首先更改所有文件,以使所有文件均为C文件(无cpp扩展名),生成:

undefined reference to `set_LED'
Run Code Online (Sandbox Code Playgroud)

问题本身不太可能是名称修改,它可能与CPP和C的差异无关。

该问题很可能是链接器问题

这是构建过程:

编译c文件,例如:

arm-none-eabi-g++ -O0 -march=armv8-a source/MainFiles/mailbox.cpp -nostartfiles -c -o objects/MainFiles/mailbox.o
Run Code Online (Sandbox Code Playgroud)

(除了使用g ++代替gcc之外,编译C ++文件将是相同的)

链接所有内容:

arm-none-eabi-ld object1 object2... -o build/kernel.elf -T ./source/kernel.ld -I include_directory_1 -I include_directory_2 -L include_directory_1 -L indlude_directory_2
Run Code Online (Sandbox Code Playgroud)

包含目录是当前目录下的所有目录

编辑:错误回来了。忽略此问题中与名称修饰有关的部分。我需要修复的错误是:

./objects/Hardware/mailbox.o:(.ARM.exidx+0x18): undefined reference to `__aeabi_unwind_cpp_pr1'
Run Code Online (Sandbox Code Playgroud)

到目前为止,我所知道的是,这与取消堆栈和异常有关。似乎该函数在libgcc中定义。但是,我已使用-nostdlib,我省略了它,并且在两种情况下错误仍然存​​在。我尝试过尽可能将文件扩展名更改为.c,并尽可能将文件扩展名更改为.cpp,但是错误始终存在。

仅在我只有1个cpp文件且其余文件均为C文件的情况下,此问题才得到修复(我尝试了,这不再是对的)。再次触发该错误的是我正在重构代码,并且想将几个函数移到新文件中。

换句话说,在不删除单个文件的情况下,声明一个wait(uint32_t time)在mailbox.cpp中命名的函数是有效的,在具有相应标题声明的time.c(或cpp)文件中声明该函数,并将标题包括在mailbox.cpp中会破坏事情。注意:在移动函数时,我不会删除文件,而只是在每个文件中删除函数声明。

添加这样的存根:

void __aeabi_unwind_cpp_pr1()
{

}
Run Code Online (Sandbox Code Playgroud)

解决了该问题,该代码可以正常工作。但是我不喜欢这种解决方案。我不想在代码中神秘地调用一个无用的存根。我在当前的实现中不需要也不需要此函数,如何告诉编译器或链接器它们正在做的事情都需要此函数呢?

c c++ gcc

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

如果几何着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

在添加几何着色器之前,我在顶点着色器中声明了一个变量:

out vec3 normal; 
Run Code Online (Sandbox Code Playgroud)

由片段着色器接收为:

in vec3 normal; 
Run Code Online (Sandbox Code Playgroud)

但是,如果我向程序添加几何着色器,链接器会告诉我法线尚未声明为前一阶段的输出。但我不确定如何在几何着色器中接收或发送输出。

c++ opengl shader glsl geometry-shader

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

在 GLSL 中优化光线追踪着色器

我编写了一个基于体素化的光线追踪器,它按预期工作,但速度非常慢。

目前光线追踪器代码如下:

#version 430 
//normalized positon from (-1, -1) to (1, 1)
in vec2 f_coord;

out vec4 fragment_color;

struct Voxel
{
    vec4 position;
    vec4 normal;
    vec4 color;
};

struct Node
{
    //children of the current node
    int children[8];
};

layout(std430, binding = 0) buffer voxel_buffer
{
    //last layer of the tree, the leafs
    Voxel voxels[];
};
layout(std430, binding = 1) buffer buffer_index
{
    uint index;
};
layout(std430, binding = 2) buffer tree_buffer
{
    //tree structure       
    Node tree[];
};
layout(std430, binding …
Run Code Online (Sandbox Code Playgroud)

c++ opengl optimization gpu glsl

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

构建 OpenCV.js 失败。CMake 找不到已安装的编译器?

我有以下目录结构:

~/emsdk
~/opencv
Run Code Online (Sandbox Code Playgroud)

我正在尝试构建 OpenCV.js

我愿意

cd ~/opencv
python ./platforms/js/build_js.py build_js --emscripten_dir=~/emsdk/
Run Code Online (Sandbox Code Playgroud)

结果是:

CMake Error at /usr/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake:100 (message):
  Could not find toolchain file:
  ~/emsdk/cmake/Modules/Platform/Emscripten.cmake
Call Stack (most recent call first):
  CMakeLists.txt:135 (project)


CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!
Traceback (most …
Run Code Online (Sandbox Code Playgroud)

javascript opencv computer-vision web

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

如何跟踪由外部代码修改类变量的所有地方?

假设我有一个这样的类定义:

class A {
private:
    Field f;
public:
   /*A hundred methods all of which modify f*/

    m1();
    m2();
    ...
    m100();
}
Run Code Online (Sandbox Code Playgroud)

我们事先知道,所有这些方法(如果调用)将修改f。

假设您有一个非常意大利面条的代码库。

您需要在运行时查找是否实际修改了f。

您可以使用gdb,在每个方法上设置一个断点,查看执行在哪里停止,然后展开堆栈以查看哪个方法称为m *()方法中的任何一个。这是非常慢的,容易发生人为错误,在使用emscripten的代码库中或者在设置某些状态后python调用C ++二进制文件的地方,这不一定是可能的...

您可以注释掉所有这些方法,并探索代码在编译器抱怨的所有位置。这比以前的要糟糕得多,并且它在运行时执行,因此很难确定将实际调用哪种方法。

与上述类似,您可以将所有上述方法标记为已弃用,但是它或多或少具有相同的问题。

有没有人建议确定何时何地实际修改字段?

c++ debugging runtime

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

C ++如何创建自动转换图?

假设我们有一个包含两个类别的对象C1和C2的库A。

对于C1中的每个元素,C2中都有一个兼容的元素。

假设我们要创建一个将一个函数转换为另一个函数的通用函数。

template<typename C1, typename C2> 
C2 SpecialCast(C1 c1) {
     /* do some generic work */
}
Run Code Online (Sandbox Code Playgroud)

这就要求我们总是写。SpecialCast<Type>(parameter)但这是多余的,因为要知道转换类型就需要知道参数类型。因此,这给代码增加了不必要的冗长性。

理想的解决方案是定义一个vallid类型转换的头表,这样就可以做到:

template<typename C1> 
C2 SpecialCast(C1 c1) {
     /*get C2 from C1 using the table*/
     /* do some generic work */
}
Run Code Online (Sandbox Code Playgroud)

但是我目前正在努力寻找一种以最简单的方式定义表的好方法。

c++ generics types casting

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

LeakSanitizer 和泄漏库

我正在尝试使用 gcc 的泄漏清理选项来检测程序中的泄漏。

为此,我使用相关标志进行编译,运行我的程序,然后终止,这会产生以下输出:

==8013==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 72704 byte(s) in 1 object(s) allocated from:
    #0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
    #1 0x7f3ab2f8690d  (<unknown module>)
    #2 0x7f3ab2f50525  (<unknown module>)

Direct leak of 72704 byte(s) in 1 object(s) allocated from:
    #0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
    #1 0x7f3ab51d2aad  (<unknown module>)
    #2 0x7f3ab51c4475  (<unknown module>)

Direct leak of 256 byte(s) in 1 object(s) allocated from:
    #0 0x7f3ace944ada in __interceptor_malloc /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:144
    #1 0x562db822861c in RenderHandler::RenderHandler() ../Src/main.cpp:68
    #2 0x562db8226ee2 in main ../Src/main.cpp:200 …
Run Code Online (Sandbox Code Playgroud)

c++ debugging memory-leaks memory-leak-detector address-sanitizer

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