我注意到当你使用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) 我正在尝试使用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 …
我正在检查一些使用/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 ++类(无法修改):
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)
使用时如何正确指定通话政策 …
我正在测试密集矩阵乘法(作为好奇心)的一些微基准测试,我注意到一些非常奇怪的性能结果.
这是一个最小的工作示例:
#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) 在Matlab中,可使用tilda符号忽略返回多个参数的函数中的某个参数。但是,当我在Octave中尝试相同的代码时,出现语法错误。
我有两个问题:
为什么八度不支持此功能?(即错误,将来的增强,设计决策等)
如果有的话,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。
我一直很好奇是什么需要一个符合stl标准的容器(或者符合boost标准,我的理解是它们要么相同,要么非常相似).我已经看到了一些人们称之为符合stl的例子(例如,这个在codeproject,显然是实际的stl容器),但我不确定我需要拥有哪些容器的组件.
从我可以收集到的,我至少需要这些东西:
符合STL的迭代器(当前的stl只使用双向或更高的迭代器,不知道这是一个要求还是只是偶然的机会,仍然需要考虑什么才能被认为是"符合stl标准的迭代器")
定义分配器(默认为std::allocator)以及正确使用它们的机制(仍然试图找出最后一部分的含义)
用于元编程的公共typedef(指针类型,const指针类型,引用类型,值类型,const引用类型,差异类型,可能还有其他一些?).问题:什么是difference type?
'generic'(即使用元编程/模板使容器能够容纳几乎任何类型)
还有什么我错过了,或者更糟糕的是,在上面的列表中出错(可能是诸如const-correctness,线程安全,异常生成/处理等等)?此外,是否存在一个规范文档,详细说明了所需要的内容,如果这样的事情存在的话?
Java Collections接口(例如,List或Set)定义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 Erasures的Oracle文章提到这是禁止的,但没有提供任何解决方案.
我只能想到一种半优雅的方式来解决这个问题:
进行强制转换以输入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) 在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) 有谁知道如何使用 Apache POI 清除/删除工作表上任何现有的冻结或拆分窗格?
我尝试在 (-1,-1) 处创建一个新的冻结窗格,但看起来 POI 会自动将其更改为 (0,0),这意味着第一行和第一列仍处于冻结状态。
仅供参考,我正在使用 HSSF 和 XSSF API。
c++ ×4
java ×3
apache-poi ×1
boost-python ×1
c ×1
generics ×1
html ×1
http ×1
matlab ×1
octave ×1
opencl ×1
opengl ×1
opengl-3 ×1
performance ×1
python ×1
shader ×1
sockets ×1
sse ×1
stl ×1
type-erasure ×1