小编hel*_*922的帖子

将OpenCL代码嵌入到可执行文件中

这是使用#include加载OpenCL代码的后续操作

我注意到当你使用grrussel描述的方法(并在Bullet Physics中使用)时,创建的字符串会删除所有换行符(注释似乎也被剥离了,但我并不太担心).现在大多数情况下,如果包含的opencl代码中没有任何预处理器定义,那么这很好,但如果有代码将无法使用OpenCL编译器进行编译.

有没有得到的方式#include来保持换行符在那里,或者有没有更好的方法,以嵌入的OpenCL代码到我的可执行文件(不是复制字符串转换成CPP文件,并把报价周围的一切其他)?

我在Visual Studio 2010中对此进行了测试,我不确定其他编译器是否表现出相同的行为.我更喜欢一种不需要任何外部工具并且可以与各种编译器/平台配合使用的方法.

其他答案的复制代码:

在C++/C源代码中

#define MSTRINGIFY(A) #A
char* stringifiedSourceCL = 
#include "VectorAddKernels.cl"
Run Code Online (Sandbox Code Playgroud)

在OpenCL源代码中

MSTRINGIFY(
   __kernel void VectorAdd(__global float8* c)
   {
    // snipped out OpenCL code...
    return;
   }
);
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio-2010 opencl

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

Java Socket HTML响应

我正在尝试使用Java套接字向浏览器发送简单的HTML响应.

这是我的Java代码:

    Socket socket = server.accept();
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String s;
    // this is a test code which just reads in everything the requester sends
    while ((s = in.readLine()) != null)
    {
        System.out.println(s);
        if (s.isEmpty())
        {
            break;
        }
    }
    // send the response to close the tab/window
    String response = "<script type=\"text/javascript\">window.close();</script>";

    PrintWriter out = new PrintWriter(socket.getOutputStream());
    out.println("HTTP/1.1 200 OK");
    out.println("Content-Type: text/html");
    out.println("Content-Length: " + response.length());
    out.println();
    out.println(response);
    out.flush();
    out.close();
    socket.close();
Run Code Online (Sandbox Code Playgroud)

server 是一个ServerSocket设置为自动选择要使用的开放端口.

这个想法是任何重定向到http:\\localhost:port(port …

html java sockets http

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

Strange/fp浮点模型标志行为

我正在检查一些使用/fp:precise/fp:fast标志的代码.

按照MSDN文档/fp:precise:

使用/ fp:精确地在x86处理器上,编译器将对float类型的变量执行舍入,以便为赋值和强制转换以及将参数传递给函数时具有适当的精度.这种舍入保证了数据不会保留大于其类型容量的任何重要性.使用/ fp:precise编译的程序可以比没有/ fp:precise编译的程序更慢更大./ fp:exact禁用内在函数; 而是使用标准的运行时库例程.有关更多信息,请参阅/ Oi(生成内部函数).

查看对sqrtf(调用/arch:SSE2目标x86/Win32平台)的调用的反汇编:

0033185D  cvtss2sd    xmm0,xmm1  
00331861  call        __libm_sse2_sqrt_precise (0333370h)  
00331866  cvtsd2ss    xmm0,xmm0  
Run Code Online (Sandbox Code Playgroud)

这个问题我相信现代的x86/x64处理器不使用80位寄存器(或者至少不鼓励使用它们),所以编译器会做我认为是下一个最好的事情并用64位双精度计算.因为内在函数被禁用,所以调用了一个库sqrtf函数.

好吧,相当公平,这似乎符合文档所说的内容.

但是,当我为x64 arch编译时,会发生一些奇怪的事情:

000000013F2B199E  movups      xmm0,xmm1  
000000013F2B19A1  sqrtps      xmm1,xmm1  
000000013F2B19A4  movups      xmmword ptr [rcx+rax],xmm1  
Run Code Online (Sandbox Code Playgroud)

不使用64位双精度执行计算,并且正在使用内在函数.据我所知,结果与/fp:fast使用标志的结果完全相同.

为什么两者之间存在差异?难道/fp:precise根本无法与x64平台工作?

现在,作为一个完整性检查,我用/fp:precise和测试了VS2010 x86中的相同代码/arch:SSE2.令人惊讶的是,sqrtpd内在被使用了!

00AF14C7  cvtps2pd    xmm0,xmm0  
00AF14CA  sqrtsd      xmm0,xmm0  
00AF14CE  cvtpd2ps    xmm0,xmm0 
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么VS2010在VS2012调用系统库时会使用内在函数?

针对x64平台的VS2010测试结果与VS2012相似(/fp:precise似乎被忽略).

我无法访问任何旧版本的VS,因此我无法在这些平台上进行任何测试.

作为参考,我正在使用Intel …

c floating-point sse visual-studio-2010 visual-studio-2012

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

提升python make_constructor以及保管人和病房

假设我有以下两个C ++类(无法修改):

struct A
{
    // stuff
};

struct B
{
    // B will internally hold a reference to a
    B(A& a, some_cpp_only_type arg);
};
Run Code Online (Sandbox Code Playgroud)

我正在尝试包装B类,并some_cpp_only_type从Python接口隐藏该参数(B没有此参数,没有替代构造函数)。

我现在有以下包装器代码:

using namespace boost::python;

boost::shared_ptr<B> make_B(A& a)
{
    return boost::make_shared<B>(a, get_cpp_only_instance());
}

BOOST_PYTHON_MODULE(my_module)
{
    class_<B, boost::noncopyable>("B", no_init)
      .def("__init__", make_constructor(&make_B));
}
Run Code Online (Sandbox Code Playgroud)

现在这行得通,因为我在APython内部持有对包装对象的引用。但是,我真的很想至少在B销毁该实例之前保持这种状态。我尝试将with_custodian_and_ward_postcall呼叫策略添加到中make_constructor,但出现了几页无意义的编译器错误(甚至来自Clang)。这是修改后的无效代码:

using namespace boost::python;

boost::shared_ptr<B> make_B(A& a)
{
    return boost::make_shared<B>(a, get_cpp_only_instance());
}

BOOST_PYTHON_MODULE(my_module)
{
    class_<B, boost::noncopyable>("B", no_init)
      .def("__init__", make_constructor(&make_B, with_custodian_and_ward_postcall<0,1>()));
}
Run Code Online (Sandbox Code Playgroud)

使用时如何正确指定通话政策 …

c++ python boost-python

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

解释为什么分配第二次改变性能的原因

我正在测试密集矩阵乘法(作为好奇心)的一些微基准测试,我注意到一些非常奇怪的性能结果.

这是一个最小的工作示例:

#include <benchmark/benchmark.h>

#include <random>

constexpr long long n = 128;

struct mat_bench_fixture : public benchmark::Fixture
{
  double *matA, *matB, *matC;

  mat_bench_fixture()
  {
    matA = new double[n * n];
    matB = new double[n * n];
    matC = new double[n * n];
    benchmark::DoNotOptimize(matA);
    benchmark::DoNotOptimize(matB);
    benchmark::DoNotOptimize(matC);
#if 0
    delete[] matA;
    delete[] matB;
    delete[] matC;
    benchmark::DoNotOptimize(matA);
    benchmark::DoNotOptimize(matB);
    benchmark::DoNotOptimize(matC);
    matA = new double[n * n];
    matB = new double[n * n];
    matC = new double[n * n];
    benchmark::DoNotOptimize(matA);
    benchmark::DoNotOptimize(matB);
    benchmark::DoNotOptimize(matC);
#endif
  }

  ~mat_bench_fixture() …
Run Code Online (Sandbox Code Playgroud)

c++ performance microbenchmark google-benchmark

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

忽略返回值语法?

在Matlab中,可使用tilda符号忽略返回多个参数的函数中的某个参数。但是,当我在Octave中尝试相同的代码时,出现语法错误。

我有两个问题:

  1. 为什么八度不支持此功能?(即错误,将来的增强,设计决策等)

  2. 如果有的话,Octave中的替代语法是什么(不只是将“虚拟变量”放在现场,然后清除该变量)?此外,这种替代语法与Matlab是否兼容?


% this is valid Matlab code, but will result in a syntax error in Octave
[colA, colB, ~, colC] = textread('data.txt', '%d %d %s %d', 1);
Run Code Online (Sandbox Code Playgroud)

Fyi,我正在使用带有某些Octave Forge软件包的Windows编译的Octave 3.2.4。

matlab octave

4
推荐指数
2
解决办法
2155
查看次数

符合标准的容器

我一直很好奇是什么需要一个符合stl标准的容器(或者符合boost标准,我的理解是它们要么相同,要么非常相似).我已经看到了一些人们称之为符合stl的例子(例如,这个在codeproject,显然是实际的stl容器),但我不确定我需要拥有哪些容器的组件.

从我可以收集到的,我至少需要这些东西:

  1. 符合STL的迭代器(当前的stl只使用双向或更高的迭代器,不知道这是一个要求还是只是偶然的机会,仍然需要考虑什么才能被认为是"符合stl标准的迭代器")

  2. 定义分配器(默认为std::allocator)以及正确使用它们的机制(仍然试图找出最后一部分的含义)

  3. 用于元编程的公共typedef(指针类型,const指针类型,引用类型,值类型,const引用类型,差异类型,可能还有其他一些?).问题:什么是difference type

  4. 'generic'(即使用元编程/模板使容器能够容纳几乎任何类型)

还有什么我错过了,或者更糟糕的是,在上面的列表中出错(可能是诸如const-correctness,线程安全,异常生成/处理等等)?此外,是否存在一个规范文档,详细说明了所需要的内容,如果这样的事情存在的话?

c++ stl

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

检查通用类型

Java Collections接口(例如,ListSet)定义contains接受任何Object 的方法.

 public boolean contains(Object o)
Run Code Online (Sandbox Code Playgroud)

然而,当涉及到实现这个方法时,我正在处理的特定集合要求我有一个与类的泛型类型兼容的类型E(即要么是类E,要么是E的子类,或者是类如果E是接口,它实现E).换句话说,如果o可以转换为E类型,那么它是兼容的.这提出了一个问题,因为Java会删除Generic类型信息,所以这样的事情是不可能的:

public boolean contains(Object o)
{
    if(o instanceof E) // compile error due to type erasures
    {
        // ... check if this collection contains o
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是什么是最好的方法来完成这样的事情?关于Type ErasuresOracle文章提到这是禁止的,但没有提供任何解决方案.

我只能想到一种半优雅的方式来解决这个问题:

进行强制转换以输入E.如果强制转换失败,则o不能是E类型或E类型的子类.

public boolean contains(Object o)
{
    try
    {
        E key = (E) o; // I know it's unsafe, but if o is castable to E then the method should …
Run Code Online (Sandbox Code Playgroud)

java generics type-erasure

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

OpenGL为什么要取消选择着色器程序?

可能重复:
是否需要glDisableClientState?

在OpenGL中我经常看到这个代码遵循这种模式:

glUseProgram(prog_id);
// ... do some stuff
glUseProgram(0);
Run Code Online (Sandbox Code Playgroud)

我明白glUseProgram(0)取消选择任何着色器程序.现在我的问题是取消选择着色器程序是什么意思?

例如,为什么我应该或不应该在渲染循环中做这样的事情?

while(render_loop_condition)
{
    glUseProgram(prog_id);
    // do some stuff
}
// various cleanup code
glUseProgram(0);
Run Code Online (Sandbox Code Playgroud)

在使用多个着色器程序的渲染循环中,我可以这样做:

while(render_loop_condition)
{
    glUseProgram(prog_id1);
    // do some stuff
    glUseProgram(prog_id2);
    // do some other stuff
}
// various cleanup code
glUseProgram(0);
Run Code Online (Sandbox Code Playgroud)

opengl shader opengl-3

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

Apache POI 清除冻结/拆分窗格

有谁知道如何使用 Apache POI 清除/删除工作表上任何现有的冻结或拆分窗格?

我尝试在 (-1,-1) 处创建一个新的冻结窗格,但看起来 POI 会自动将其更改为 (0,0),这意味着第一行和第一列仍处于冻结状态。

仅供参考,我正在使用 HSSF 和 XSSF API。

java apache-poi

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