假设一个函数需要一个指向类型为T的向量的指针,但是当我只有一个类型为T的向量向量(类型不能保证是POD)时,这是
std::vector<std::vector<T>> input;
auto selectedVectorPtr=&input[j];
Run Code Online (Sandbox Code Playgroud)
比这更安全
std::vector<std::vector<T>> input;
auto selectedVectorPtr=&(input[j]);
Run Code Online (Sandbox Code Playgroud)
还假设输入的范围不会结束,直到该函数selectedVectorPtr作为参数.
我的担忧(/误解)是:
可以说我的数组是32KB,L1是64 KB.Windows在程序运行时是否使用了部分内容?也许我无法使用L1,因为Windows正在使其他程序工作?我应该将程序的优先级设置为使用所有缓存吗?
for(int i=0;i<8192;i++)
{
array_3[i]+=clock()*(rand()%256);//clock() and rand in cache too?
//how many times do I need to use a variable to make it stay in cache?
//or cache is only for reading? look below plz
temp_a+=array_x[i]*my_function();
}
Run Code Online (Sandbox Code Playgroud)
该程序使用C/C++.
对于L2也一样.
还有功能保存在缓存中吗?缓存是只读的吗?(如果我更改了我的数组,那么它会丢失缓存绑定?)
编译器是否创建asm代码以使用缓存更高的产量?
谢谢
我在C#项目中使用了C++ DLL,DLL里面有一个类,它由外部函数创建和销毁,例如:
class myClass
{
int N;
public:
//some elements and some functions
myClass(int n)
{
N=n;
}
};
__declspec(dllexport) myClass * builderF(int n)
{
return new myClass(n);
}
__declspec(dllexport) void destroyerF(myClass * c)
{
delete c;
}
Run Code Online (Sandbox Code Playgroud)
这些都是外部的"C"{}体.
编译器如何让我使用C++功能是"C"空间?它不仅适用于C代码吗?这是经过测试和运行的(我开始为C#制作一个opencl包装器).我之前只使用纯C代码.
我有一个opencl内核批处理类,它将40多个内核排入队列,每个内核执行之间都有一个clFinish().
问题:当我注释掉clFinish()时,程序会更快地运行%100,这是否意味着当内核使用相同的缓冲区进行写入和读取时,内核之间存在未定义的行为?我怀疑性能提升来自更好地利用gpu /职业资源.使用有序命令队列是否保证两个内核之间存在障碍,还是需要它们之间的clFinish()?
它是一个简单的物理模型,两个版本之间没有差异.
也许我只需要在最后使用clFinish()?
编辑:此命令队列未使用CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE.
假设以AVX2为目标的编译和C++内在函数,如果我每个体体计算使用17个寄存器编写一个nbody算法,那么第17个寄存器可以间接(寄存器重命名硬件)或直接(visual studio编译器,gcc编译器)映射到AVX上-512注册以减少内存依赖关闭?例如,skylake架构有1或2个AVX-512 fma单元.这个数字是否也改变了总寄存器?(具体来说,至强银4114 cpu)
如果这样可行,它是如何工作的?当所有指令都是AVX2或更低时,第一个硬件线程使用每个ZMM向量的前半部分和第二个硬件线程使用每个ZMM向量的后半部分?
编辑:如果在目标机器上进行在线编译会怎样(例如,使用OpenCL)?司机可以为我注册使用吗?
x86 cpu-architecture cpu-registers compiler-optimization avx512
我尝试了指针和引用(&),但当我尝试获取信息(我只是从内存中读取)时,计算机"发出哔哔声"并且程序终止.将指针指定给字节(char*)时没问题.但是当我读到那台电脑发出哔哔声时.(x =*p;)
Windows xp,1GB + 128 MB RAM.我不知道我的eproom + eeproms.
我可以使用System()函数来使用OS命令来访问内存吗?你认识任何人吗?
我正在使用Digital-Mars C++和VC++ 10编译器,我有masm32汇编程序.如何使用mm0 .... mm7 64位寄存器在eax,eabx 32位寄存器之间切换数据?我可以在c ++编译器asm {}或_asm {}中使用它们吗?
这样的东西可能有用:
mmTo32 eax,mm3
mmTo16 bx,mm6
mmTo8 cl,mm4
ToMM mm2,eax
Run Code Online (Sandbox Code Playgroud)
我用Google搜索但找不到足够的信息.
谢谢.
我正在学习如何使用Amd的app sdk和Khronos的Opencl 1.2头文件在C++中创建简单的opencl程序.我使用下面的例子,它正在工作.但是当我最后尝试.release()缓冲区时,我从编译器收到一条错误消息,说"无法访问受保护的成员".
int problemSize=1024;
const char * kernelDerlenecek =
"__kernel void Toplam(__global float * v1, __global float * v2)"
"{"
" int i = get_global_id(0);"
" v2[i]=v1[i];"
"}";
cl::Context altYapi(CL_DEVICE_TYPE_GPU);
cl::Program::Sources kaynaklar;
kaynaklar.push_back(std::make_pair(kernelDerlenecek,strlen(kernelDerlenecek)));
cl::Program program(altYapi,kaynaklar);
std::vector<cl::Device> aygitlar=altYapi.getInfo<CL_CONTEXT_DEVICES>();
program.build(aygitlar);
cl::Kernel kernel(program,"Toplam");
cl::CommandQueue cmdQ(altYapi,aygitlar[0]);
std::vector<cl_float> input;
std::generate_n (std::back_inserter ( input ) , problemSize , rand) ;
cl::Buffer inputBuffer(altYapi, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, sizeof(cl_float) * input.size(), &input[0]);
cl::Buffer outputBuffer(altYapi ,CL_MEM_WRITE_ONLY , sizeof(cl_float )* input.size()) ;
kernel.setArg(0,inputBuffer);
kernel.setArg(1,outputBuffer);
cl::NDRange Global(1024);
cl::NDRange Local(64);
cmdQ.enqueueNDRangeKernel(kernel,cl::NullRange,Global,Local);
float …Run Code Online (Sandbox Code Playgroud) 我正在使用nodejs和express工作的服务器端程序,它按预期工作但是,当我打字(甚至不是2个字符的域)时,服务器捕获谷歌chromes请求(并发送响应作为回报).
如何在输入地址时停止我的服务器程序响应谷歌chromes请求,即使在开头的字母(它完成但不输入,我总是输入),但不是当它是用户的实际请求时.
即使对于未访问过的网站,谷歌浏览器也会这样做吗?
是否有一个特殊的请求参数来过滤这个,所以我只能选择真正的客户端请求而不是浏览器内部(但入站到我的服务器)请求?
当我在地址栏上写一些东西,比如"我怎么能"时,它会自动填充一个(已经访问过的)"查询一个集合"(可能是来自该网站的请求),而且只是在底部有(未访问)"爱".Google Chrome是否会向未访问过的爱情建议网站发送http请求?
谷歌浏览器版本:54.0.2840.99米(64位)
对于具有一些预取技术的浏览器,这可能是正常的行为吗?
// Example program
#include <iostream>
#include <string>
#include <regex>
int main()
{
std::string strr("1.0.0.0029.443");
std::regex rgx("([0-9])");
std::smatch match;
if (std::regex_search(strr, match, rgx)) {
for(int i=0;i<match.size();i++)
std::cout << match[i] << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
这个程序应该写
1
0
0
0
0
2
9
4
4
3
Run Code Online (Sandbox Code Playgroud)
但它写道
1
1
Run Code Online (Sandbox Code Playgroud)
在http://cpp.sh/和Visual Studio上进行了检查,结果均相同。
为什么只找到2个匹配项,为什么相同?
据我从这里的答案了解,正则表达式搜索在第一个匹配项时停止,并且match变量保留必要的(sub?)字符串值以继续(通过重复)其他匹配项。同样,由于它在第一次比赛时停止,因此()字符仅用于结果中的子比赛。