namespace someNameSpace {
extern "C" void doSomething()
{
someOperations();
}
}
Run Code Online (Sandbox Code Playgroud)
我想doSomething()在C++和C环境中运行.
是someNameSpace仍然封装doSomething(),如果我将其暴露在extern "C"联动?
有没有一种很好的方法在C++和C之间共享函数,同时避免在C++端污染全局命名空间?
编辑:因为此代码主要用于C++模式,而C链接仅供测试使用,我想这是一种更好的方法.
namespace someNameSpace {
#ifdef COMPILE_FOR_C_LINKAGE
extern "C"
#else
extern "C++"
#endif
{
void doSomething()
{
someOperations();
}
}
}
Run Code Online (Sandbox Code Playgroud) 在Beignet的优化指南中,这是一个针对英特尔GPU的OpenCL开源实现
工作组大小应大于16并且是16的倍数.
Gen上两个可能的SIMD通道是8或16.为了不浪费SIMD通道,我们需要遵循这个规则.
英特尔处理器显卡Gen7.5的计算架构中也提到:
对于基于Gen7.5的产品,每个EU有七个线程,总共28 千字节的通用寄存器文件(GRF).
...
在Gen7.5计算架构中,大多数SPMD编程模型采用这种样式代码生成和EU处理器执行.实际上,每个SPMD内核实例似乎在其自己的SIMD通道内串行且独立地执行.
实际上,每个线程同时执行SIMD-Width数量的内核实例.因此,对于计算 内核 的SIMD-16编译,SIMD-16 x 7线程= 112个内核实例可以在单个EU上同时执行.类似地,对于SIMD-32 x 7个线程= 224个内核实例在单个EU上并发执行.
如果我理解正确,使用SIMD-16 x 7 threads = 112 kernel instances作为示例,为了在一个EU上运行224个线程,工作组大小需要为16.然后OpenCL编译器将16个内核实例折叠到16通道SIMD线程中,并执行此操作在7个工作组中进行7次,并在单个EU上运行它们?
问题1:我是否正确到此为止?
但是OpenCL规范也提供了矢量数据类型.因此,通过传统的SIMD编程(如在NEON和SSE中)充分利用欧盟的SIMD-16计算资源是可行的.
问题2:如果是这种情况,使用vector-16数据类型已经明确使用了SIMD-16资源,因此删除了至少16项每工作组限制.是这样的吗?
问题3:如果以上都是真的,那么两种方法如何相互比较:1) OpenCL编译器将112个线程折叠成7个SIMD-16线程; 2) 7个本机线程编码为明确使用vector-16数据类型和SIMD-16操作?
我有一个在Linux上运行的Qt应用程序.
用户可以使用此应用程序将系统切换到mem sleep.
切换到mem睡眠是微不足道的,但是在用户空间中捕获唤醒事件则不然.
我目前的解决方案是使用无限循环来捕获mem睡眠,这样当系统唤醒时,我的应用程序总是从可预测的点继续.
这是我的代码:
void MainWindow::memSleep()
{
int fd;
fd = ::open("/sys/power/state", O_RDWR);// see update 1)
QTime start=QTime::currentTime();
write(fd,"mem",3); // command that triggers mem sleep
while(1){
usleep(5000); // delay 5ms
const QTime &end=QTime::currentTime();// check system clock
if(start.msecsTo(end)>5*2){// if time gap is more than 10ms
break; // it means this thread was frozen for more
} // than 5ms, indicating a wake up after a sleep
start=end;
}
:: close(fd); // the end of this function marks a wake …Run Code Online (Sandbox Code Playgroud) 我正在使用编写得很糟糕的代码库并且有很多内存泄漏.
它使用了许多包含原始指针的结构,这些结构主要用作动态数组.
尽管结构通常在函数之间传递,但是这些指针的分配和释放被放置在随机位置,并且不容易被跟踪/推理/理解.
我将其中的一些更改为类,并将这些指针改为由类本身进行RAII.它们运行良好并且看起来不是很难看,除了我禁止复制构造和复制分配这些类只是因为我不想花时间实现它们.
现在我在想,我是在重新发明轮子吗?为什么我不用std:array或std :: valarray替换C风格的数组?
我更喜欢std :: valarray,因为它使用堆内存和RAIIed.并且std :: array在我的开发环境中尚未可用.
Edit1:std :: array的另一个优点是大多数动态数组都是POD(主要是int16_t,int32_t和float)数组,而数字API可以使生活更轻松.
在我开始之前有什么需要注意的吗?
我能想到的是,可能没有一种简单的方法可以将std :: valarray或std :: array转换回C风格的数组,并且我们的部分代码确实使用指针算法并且需要将数据呈现为普通的C风格的数组.
还要别的吗?
编辑2
我最近遇到了这个问题.一个非常糟糕的事情std::valarray是它在C++ 11之前不能安全地复制 - 可分配.
正如在该答案中引用的那样,在C++ 03及更早版本中,如果源和目标具有不同的大小,则为UB.
背景:我坚持arm-arago-linux-gnueabi-g++ (GCC) 4.3.3.虽然也欢迎需要C++ 11或更高版本的答案,但请在C++ 03之后明确表达任何语言要求.
对象的构造函数将值填充到算法使用的表中.
由于这些表没有改变而且不应该改变,我希望它们是const,我该怎么做?
难度#1,这些值是计算生成的,我不想在源文件中对它们进行硬编码.
难度#2,计算有时取决于仅在运行时可用的输入.
难度#3,我不知道为什么但我不希望数组是静态的,即使所有对象的值可能相同(值不依赖于运行时输入的情况).
难度#4,它是一个数组,因此C++ 03中的初始化列表将不起作用.
Edit1: 在这篇文章发表几周后,我发现当std :: array不可用时,std :: array和std :: vector都是C风格数组的替代品.
我正在尝试为 ARM 板设置交叉编译软件项目。
该板的 rootfs 中有一些不在主机中的库。因此,为了确保链接器可以链接到它们,我将 rootfs 复制到本地目录并用于-Wl,-rpath-link=${Target}将链接器指向它。
问题:
ld 找不到 glibc。
分析:
使用-Wl,--verbose选项,ld显示:
opened script file {Target}/usr/lib/libpthread.so
opened script file {Target}/usr/lib/libc.so
Run Code Online (Sandbox Code Playgroud)
libc.so:
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /usr/lib/ld-linux-armhf.so.3 ) )
^^^^^ ^^^^^^^^^ ^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
libpthread.so
/* GNU ld script
Use the shared library, but some functions are only in
the …Run Code Online (Sandbox Code Playgroud) 我正在尝试为嵌入式系统配置自定义Yocto构建.
我需要向目标fs和工具链添加包.
目前我只是想添加已有配方的包.
例如,通过添加IMAGE_INSTALL += " boost-dev",TOOLCHAIN_TARGET_TASK += "boost-dev"我可以为targetfs和工具链添加提升.
我想做的事
Yocto构建的rootfs非常完整,并且有很多库,但工具链只有最基本的库.
我想将缺少的库添加到工具链中.
题:
如何找到可用库的名称?
就像boost-dev,我做了很多谷歌搜索通过添加名称boost-dev找到TOOLCHAIN_TARGET_TASK我可以得到我想要的.
但是像OpenGL和OpenCL这样的东西,即使我知道它们是/meta-fsl-arm/recipes-graphics/imx-gpu-viv在我的情况下提供的,我该如何找出我要添加的包名TOOLCHAIN_TARGET_TASK?
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。
我知道Android从大容量存储设备切换到MTP设备已经有一段时间了,并且在一些Android存储库中找到了MTP设备驱动程序的源代码。
然而,在主线内核代码中,我没有找到该特定文件,也没有找到等效文件。
但我确实找到了2010 年提交给 RFC 的MTP 小工具驱动程序的补丁。
问题:
为什么主线内核不接受这个补丁,也不提供MTP小工具的任何其他实现,但Android内核提供了它?
这是因为技术困难还是其他原因,比如有更好的方法?
如果我想在我的设备上启用 USB MTP 小工具(一个带有运行 2.6.37 内核的 TI OMAP3730 SoC,另一个带有运行 3.14 内核的 NXP/Freescale IMX6 SoC),我应该使用哪个版本的 MTP 小工具进行向后移植?
我不是在寻找便携式SIMD实现.
我所需要的只是:一个比特准确的实现.只要性能不是非常慢,性能就无所谓.
我想将它用于早期开发和测试,以便我可以在主机上编译并运行前10个迭代.然后在ARM目标上交叉编译和微调性能.
我很习惯这种开发周期,当我与TI DSP的工作就像在这里描述.当我转向ARM NEON时,我想继续这样做.
这已经完成了,还是我需要发明轮子?
背景:
我试图ubuntu在台式计算机上设置一台机器.整个过程耗费了一整天,包括安装操作系统和软件.不过,我并没有考虑太多.
然后我尝试使用新机器完成我的工作,它比我的笔记本电脑慢得多,这很奇怪.
我做了iotop,发现解压缩包时的磁盘流量大约是1-2MB/s,这肯定是不正常的.
然后,经过数小时的研究,我发现这篇文章描述了完全相同的问题,并提供了一个丑陋的解决方案:
我们最近在一些系统上遇到了一个主要的性能问题,其中磁盘写入速度非常慢(~1 MB/s - 正常性能为150 + MB/s).
...
编辑:解决这个问题,要么删除足够的RAM,要么添加"mem = 8G"作为内核启动参数(例如在Ubuntu上的/ etc/default/grub中 - 不要忘记运行update-grub!)
我也看过这篇文章
https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/
并做到了
cat /proc/vmstat | egrep "dirty|writeback"
Run Code Online (Sandbox Code Playgroud)
输出是:
nr_dirty 10
nr_writeback 0
nr_writeback_temp 0
nr_dirty_threshold 0 // and here
nr_dirty_background_threshold 0 // here
Run Code Online (Sandbox Code Playgroud)
这些值是8223和4111何时mem=8g设置.
因此,它基本上显示当系统内存大于8GB(在我的情况下为32GB)时,无论vm.dirty_background_ratio和vm.dirty_ratio设置如何(在我的情况下为 5%和10%),实际的脏阈值变为0并且写入缓冲区被禁用?
为什么会这样?
这是内核中还是其他地方的错误?
除了拔掉RAM或使用"mem = 8g"之外,还有解决方案吗?
更新:我正在使用32位的ubuntu 12.04运行3.13.0-53通用内核,所以这可能只发生在32位系统上.
相关: 这对int64_t的处理是GCC和Clang的错误吗?
我能想到的唯一解决方案是将其中一个操作数显式转换为int64,至少也要强制产品int64.
但是如果以这种方式完成,则由编译器的智能实际做到int64*int32,或者int64*int64,或者理想情况下,将其优化回来int32*int32.
如在相关问题讨论,分配的结果int32*int32,以int64不改变的事实int32*int32已经引起UB.
任何想法?
QObject::connect: Incompatible sender/receiver arguments
Bar::bar(signed short*) --> Foo::foo(short int*)
Run Code Online (Sandbox Code Playgroud)
有没有办法让QT在这种事情上更聪明,还是我应该使用编码标准来避免这种奇怪的?
编辑:上面的错误消息是来自失败的connect()调用的运行时错误消息.
我正在尝试为所有小部件读取全局样式表并将其应用于QApplication实例.
这样可以正确地设置所有小部件的样式,除了我无法在主窗口构造函数及其子窗口小部件的构造函数中查询样式选项(如字体和字体大小),因为此时样式表尚未应用于它.
所以我需要:
有没有办法实现其中之一?
我的主窗口代码如下:
int main(int argc, char **argv)
{
QWSServer::QWSServer::setBackground(QBrush(QColor(0, 0, 0, 255)));
QApplication app(argc, argv);
QFile stylesheet("/usr/bin/app.qss");
stylesheet.open(QFile::ReadOnly|QFile::Text);
QTextStream styleSheetStyle(&stylesheet);
app.setStyleSheet(styleSheetStyle.readAll());
MainWindow * pWindow = new MainWindow();
pWindow->setWindowFlags(Qt::FramelessWindowHint);
pWindow->show();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
在小部件中,需要样式:
void paintText(QPixmap *target, const QString &text)
{
QPainter painter(target);
painter.setPen(QColor(184,188,193,255));
painter.setFont(property("font").value<QFont>());
style()->drawItemText(&painter,
target->rect().adjusted(0,0,0,-15),
Qt::AlignHCenter|Qt::AlignBottom,
QPalette(QColor(184,188,193,255)),
true,
text);
painter.end();
}
Run Code Online (Sandbox Code Playgroud)
如果在窗口小部件的构造函数中调用该绘制函数,则font是默认的,如果在show事件中调用,则font是全局样式表指定的字体.
但是这个函数只需要调用一次,所以我不想在show事件中绘制它,即使我可以使用一个标志使它只在第一个show事件上运行.