小编the*_*int的帖子

C++ vs Java?为什么ICC生成的代码比VC慢?

以下是C++中的一个简单循环.计时器使用QueryPerformanceCounter()并且非常准确.我发现Java需要60%的时间用C++,这不可能是什么?!我在这做错了什么?即使是严格的别名(这里没有包含在代码中)也没有任何帮助......

long long var = 0;
std::array<int, 1024> arr;
int* arrPtr = arr.data();
CHighPrecisionTimer timer;

for(int i = 0; i < 1024; i++) arrPtr[i] = i;

timer.Start();

for(int i = 0; i < 1024 * 1024 * 10; i++){
    for(int x = 0; x < 1024; x++){
        var += arrPtr[x];
    }
}

timer.Stop();

printf("Unrestricted: %lld us, Value = %lld\n", (Int64)timer.GetElapsed().GetMicros(), var);
Run Code Online (Sandbox Code Playgroud)

这个C++在大约9.5秒内完成.我正在使用英特尔编译器12.1与主机处理器优化(特别是我的)和一切最大化.所以这是英特尔编译器的最佳选择!自动并行化有趣地消耗70%的CPU而不是25%但是不能更快地完成工作;)...

现在我使用以下Java代码进行比较:

    long var = 0;
    int[] arr = new int[1024];

    for(int i = 0; i < 1024; i++) …
Run Code Online (Sandbox Code Playgroud)

c++ java performance

45
推荐指数
4
解决办法
4828
查看次数

为什么KD树在点集中最近邻搜索的速度如此之慢?

我正在使用CGAL(最新的)KD树实现来搜索点集中的最近邻居.维基百科和其他资源似乎也暗示KD树是可行的方式.但不知怎的,它们太慢了,而且Wiki也暗示了O(n)的最坏情况,这远非理想.

[BEGIN-EDIT] 我现在正在使用"nanoflann",这比用于K邻居搜索的CGAL中的等效物快约100-1000倍.我正在使用"英特尔Embree"进行光线投射,这比CGAL的AABB树快约100-200倍. [END-EDIT]

我的任务看起来像这样:

我有一个巨大的点集,比如高达几百万.点!它们的分布在三角形几何体的表面上(是的,光子示踪剂).所以可以说它们的分布在3D空间中是2D的,因为它在3D中是稀疏的,但在观察表面时是密集的......这可能是问题对吗?因为对我而言,这似乎触发了KD树的最坏情况性能,这可能会更好地处理3D密集点...

CGAl非常擅长它的功能,所以我有点怀疑它们的实现很糟糕.我用它进行光线追踪的AABB树在地上几分钟内燃烧了十亿个光线......我猜这是非常了不起的.但另一方面,他们的KD树甚至无法处理mio.在任何合理的时间点和250k样本(点查询)......

我提出了两个解决方案,从KD树中剔除废话:

1)使用纹理贴图将光子存储在几何体上的链接列表中.这总是一个O(1)操作,因为你无论如何都必须进行光线投射......

2)使用视图相关的切片哈希集.这是你得到的越远,哈希集越粗.所以基本上你可以想到NDC坐标中的1024x1024x1024光栅,但是使用哈希集来节省稀疏区域的内存.这基本上具有O(1)复杂度,并且可以有效地并行化,用于插入(微分片)和查询(无锁).

前一解决方案的缺点在于,几乎不可能对相邻光子列表进行平均,这在较暗区域中是重要的,以避免噪声.后一种解决方案没有这个问题,并且应该与KD树特征相同,只是它具有O(1)最坏情况性能,lol.

所以你怎么看?糟糕的KD树实施?如果没有,对于有界最近邻居查询,是否存在比KD树"更好"的东西?我的意思是我没有反对上面的第二个解决方案,但提供类似性能的"经过验证的"数据结构会更好!

谢谢!

这是我使用的代码(不可编译):

#include "stdafx.h"
#include "PhotonMap.h"

#pragma warning (push)
    #pragma warning (disable: 4512 4244 4061)
    #pragma warning (disable: 4706 4702 4512 4310 4267 4244 4917 4820 4710 4514 4365 4350 4640 4571 4127 4242 4350 4668 4626)
    #pragma warning (disable: 4625 4265 4371)

    #include <CGAL/Simple_cartesian.h>
    #include <CGAL/Orthogonal_incremental_neighbor_search.h>
    #include <CGAL/basic.h>
    #include <CGAL/Search_traits.h>
    #include <CGAL/point_generators_3.h>

#pragma warning (pop)

struct PhotonicPoint
{
    float vec[3];
    const Photon* photon;

    PhotonicPoint(const Photon& photon) : …
Run Code Online (Sandbox Code Playgroud)

c++ raytracing kdtree cgal data-structures

14
推荐指数
3
解决办法
2万
查看次数

纠正丢包(UDP)的代码

我不知道要寻找什么,因为我得到的所有与“错误纠正代码”有关的东西都与您不知道错误位置的情况有关。因此,这些代码比我需要的要复杂得多,效率低下。

在下文中,请注意位等于数据包(因为仅可能丢失整个数据包,因此该位模拟非常适合)。

是否存在已考虑到您已经知道k位丢失的ECC,而仅提供给您一种在那k个位置重构数据流的方法?另外,由ECC添加的位应该是独立的(最好)。这样,如果数据包的ECC部分内部发生数据包丢失,它仍然可以重构一些原始数据(并非总是会出现k个错误,大多数情况下不会出现任何错误。因此,ECC容错自己是很重要的ECC位已添加)。

这与IMO有很大的不同。对于一个简单的缺失位,我只能使用一个XOR位。但是我不够聪明,无法将其概括为n位。

再说一次,我有n位数据流,而且我知道最多有k位丢失(我真的知道确切是哪一个,并且它们丢失了,不可能发生损坏)。现在,我需要一个编解码器,它可以以尽可能少的开销添加到数据流中来重构它们。我梦想着拥有(n + k)位来纠正n位流中的k个随机位错误:)。最重要的是,理想情况下,如果添加到n位数据流中的k个 ECC位中的任何一个遭到破坏,例如k个位中的c个位都被破坏,那么它仍然应该能够重构(kc)位错误。n位流。

请注意,通过xD我不知道错误位置。

例:

我能想到的一种算法是这个。n位数据流要防止错误。

令p为n的最小相对素数。然后,通过递增j,对i =(p * j)mod n的数据流进行迭代,对通过选择每个偶数j的位获得的子流进行XOR。该子流具有n / 2个元素。迭代后,我们获得了n / 2个元素的奇偶校验。我们可以用相同的方式(取奇数j)获得另一半的奇偶校验。

对于2位丢失,这可减少50%的错误。

好的一面是,我们现在可以任意改善。只需采用下一个较高的相对素数,然后再次执行相同操作即可。现在,我们有25%的错误机会。基本上,每次添加两个额外的奇偶校验位,我们就可以将错误机会减少一半。

c++ math udp protocols error-correction

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

Linux C++:如何在多个文件中正确使用模板特化?

我有一个奇怪的问题.在Windows上,使用Visual Studio 2010以及英特尔编译器,所有内容都按预期链接.但是当我尝试在Linux上使用CLang 3.0编译我的代码时,它确实编译(如果我只使用单个CPP文件,它也会链接和运行)但是没有链接.

消息是有多个符号定义,指的是模板实例化.例如,在多个编译单元共享的头文件中考虑以下两行:

 template<class T> void myFunc(T in) { }
 template<> void myFunc<int>(int in) { }
Run Code Online (Sandbox Code Playgroud)

现在从Linux链接器我会得到以下内容:

"file xyz":"myFunc(int in)"的多个定义,首先在"some file"中定义.

但是我该怎么做呢?既然它适用于Windows,我认为它应该在某种程度上适用于Linux?

对于静态模板数据成员也是如此,这些成员与您声明变量而不是函数或多或少相同.我更喜欢它是否适用于静态模板数据成员.

如果其他一切都失败了,我想我仍然可以创建一个"MakeAll.cpp"文件,其中包含所有CPP,但这对我来说听起来不是一个理想的解决方案......

谢谢你的帮助!

c++ linux linker templates

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

C ++ 11:防止lambda范围捕获错误

在C ++中,与诸如C#之类的语言相反,可以指定是否在值或通过lambda表达式中的引用捕获包围范围变量。这导致了不确定的情况,在这种情况下,可以将通过引用捕获的包围范围的lambda传递给在调用lambda表达式之前返回的函数:

void test()
{
    int t = 1;
    enqueue_task([&]() { do_something(t); });
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当安排由lambda表达式指定的任务计划执行时,“ t”很可能超出范围。显然,这会导致难看的错误。

我的解决方案将是这样的语言功能:

template<class T>
void enqueue_task(T lambda)
{
    static_assert(!std::is_lambda<T>::value || std::is_lambda_captured_by_value<T>::value,
        "The lambda expression is executed asynchronously and therefore capturing eclosing state via reference is forbidden.");

    // enqueue task for execution
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这将是一个干净的“非侵入式”扩展,该扩展将允许中间件编写者保护其API免受滥用。当然,它不提供防弹保护,因为我仍然可以按值和可能更多的值传递指向堆栈对象的指针。无论如何,在通过值传递时仍会静默地导致未定义行为的代码本身可能已经是可疑的。

是否有已经可以支持的类似功能?

对我来说,目前一个理智的解决方案似乎根本不允许在延迟执行情况下使用任何lambda表达式。例如,不应将事件处理程序设为lambda类型。说起来容易做起来难,因为这也意味着我不能使用std :: function,而必须回到良好的旧函数类型。

更好的方法是引入某种关键字,例如:

void test()
{
    int t = 1;
    enqueue_task(deferred () { do_something(t); });
}
Run Code Online (Sandbox Code Playgroud)

这将确保编译器可以通过传递的lambda函数,使其适合延迟执行,这意味着其封闭范围已消失。

我认为C ++ 11为使C ++编程安全已走了很长一段路。这种lambda的东西是您仍然将枪对准脚下的少数几个地方之一。它只是一个定时炸弹。

lambda c++11

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

C++:不区分大小写"Boost:unordered_map"不起作用?

我试图从std :: unordered_map(VS2010)切换到boost :: unordered_map(版本1.48),令人惊讶的是,一些重要的测试用例在我的项目中失败了.我找到了原因并得出结论:boost :: unordered_map不遵守我的不区分大小写的相等提供程序:

struct StringEqualityCaseInsensitive : public std::equal_to<String>
{
    bool operator ()(const String& a, const String& b) const { return boost::iequals<String, String>(a, b); }
};

boost::unordered_map<string, int, boost::hash<string>, StringEqualityCaseInsensitive> map;
Run Code Online (Sandbox Code Playgroud)

现在我只添加一些大写元素并搜索它们的小写对应物(使用find()成员方法).如果我使用std :: unordered_map它可以正常工作并且使用boost它不会.残酷的是,如果我查找大写元素,则会调用相等比较器,当我查找小写时,它不会被调用...

任何人都有线索,这是为什么?(不确定这是否重要,但我使用的是启用了C++ 0x支持的英特尔编译器12.1)

编辑:该死的,现在它恍然大悟.也许我还需要调整哈希类以返回与低/大写无关的相同值.但他们有不同的行为仍然很奇怪?!

谢谢!

c++ boost unordered-map case-insensitive

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