如何std::priority_queue使用类型的容器预分配std::vector?
std::priority_queue<unsigned char, std::vector<unsigned char>> pq;
pq.c.reserve(1024);
Run Code Online (Sandbox Code Playgroud)
不编译,因为底层向量是受保护的成员.是否可以使用它的构造函数将priority_queue其包装在预先保留的向量周围?
// 700 ms
cv::Mat in(height,width,CV_8UC1);
in /= 4;
Run Code Online (Sandbox Code Playgroud)
替换为
//40 ms
cv::Mat in(height,width,CV_8UC1);
for (int y=0; y < in.rows; ++y)
{
unsigned char* ptr = in.data + y*in.step1();
for (int x=0; x < in.cols; ++x)
{
ptr[x] /= 4;
}
}
Run Code Online (Sandbox Code Playgroud)
什么可以导致这种行为?是因为opencv"推广"Mat与Scalar乘法Mat匹配Mat乘法,还是特定的失败优化?(启用了NEON).
假设我有一个需要随机访问 1024 个元素数组的 32 个线程块。我想通过最初将块从全局转移到共享来减少全局内存调用的数量。我有两个想法:
A:
my_kernel()
{
CopyFromGlobalToShared(1024 / 32 elements);
UseSharedMemory();
}
Run Code Online (Sandbox Code Playgroud)
或乙:
my_kernel()
{
if (first thread in block)
{
CopyFromGlobalToShared(all elements);
}
UseSharedMemory();
}
Run Code Online (Sandbox Code Playgroud)
哪个更好?或者还有其他更好的方法吗?
是否所有API级别21设备都需要至少在LEGACY支持类型中为所有摄像机(例如正面,背面)公开camera2包装?
换句话说,在新的android.hardware.camera2界面下,或者甚至对于相机设备来说,Android 5相机在不推荐使用的android.hardware.Camera界面下更具功能性(并且确实发生了)是不可能找到或使用android.hardware.camera2设备?
"CUDA c ++"语言是一种c ++派生语言,但标准编译器不支持它,但可以由nVidia的nvcc编译器编译.这可以导致多语言项目,其中GPU模块使用nvcc编译,而非GPU模块使用gcc编译.
例如,语法kernel<<<dims>>>(params)不是c ++的一部分.
nVidia是否包含一个GPU库(作为CUDA的一部分),它实际上可以与标准的c ++编译器(如gcc)一起使用?
假设我们必须使用float变量作为计数器 - 例如
float i = 1;
float previ = 0;
do
{
previ = i;
}
while (i++);
Run Code Online (Sandbox Code Playgroud)
i(i-previ)与1的值有什么不同?这种差异仍然是一个整数,还是会成为一个理性的非整数?
我已经分析了我的程序,它花费了20%的CPU时间,基本上评估了以下表达式:
abs(x) > abs(y)
Run Code Online (Sandbox Code Playgroud)
其中x,y是双精度浮点变量.
有没有办法将表达式重构为更快的变体?
以下行(在两个不同的地方调用)在每行占用接近10%的CPU时间:
(这是函数Image_3 :: TestGradientAtPoint的片段)
if (abs(maxx[ch]) < abs(a)) maxx[ch] = a;
01187AC9 mov eax,dword ptr [ch]
01187ACC sub esp,8
01187ACF fld qword ptr [ebp+eax*8-68h]
01187AD3 fstp qword ptr [esp]
01187AD6 call abs (11305F9h)
01187ADB fld qword ptr [ebp-70h]
01187ADE fstp qword ptr [esp]
01187AE1 fstp qword ptr [ebp-0F8h]
01187AE7 call abs (11305F9h)
01187AEC add esp,8
01187AEF fcomp qword ptr [ebp-0F8h]
01187AF5 fnstsw ax
01187AF7 test ah,41h
01187AFA jne Image_3::TestGradientAtPoint+176h (1187B06h)
01187AFC mov eax,dword ptr …Run Code Online (Sandbox Code Playgroud) void LUT(InputArray src, InputArray lut, OutputArray dst, int interpolation=0 )
Run Code Online (Sandbox Code Playgroud)
根据查找表,在8位数组中进行替换,并将结果存储在dst中.
我需要实现一个布尔数据容器,它将存储相当多的变量.我想我可以使用char*和实现C风格的宏访问器,但我更喜欢将它包装在一个std::结构中.std::bitset<size_t>似乎不实用,因为它具有固定的编译时大小.
这样我std::vector<bool>就可以优化空间; 它有一个很好的bool式存取器.
有没有办法做一些事情,比如直接从它输入一个指针fwrite()?
如何将输入文件输入到这样的向量中?
最后,当需要大量文件I/O时,它是一个很好的数据结构吗?
那么随机文件访问(fseek等)呢?
编辑:我已经决定std::vector<unsigned int>在一个新类中包装一个具有我的要求所需功能的新类.
突出差异的最简单示例:
int foo()
{
doSomething();
return 0;
}
void bar()
{
doSomething();
return;
}
int main()
{
foo();
bar();
}
Run Code Online (Sandbox Code Playgroud)
是bar快foo,为什么?