我编写了一些执行一系列全局内存访问的简单基准测试.当我测量L1和L2缓存统计数据时,我发现(在GTX580中有16个SM):
total L1 cache misses * 16 != total L2 cache queries
Run Code Online (Sandbox Code Playgroud)
实际上,右侧远高于左侧(大约五倍).我听说过一些注册溢出也可以放到L2中.但我的内核只有不到28个寄存器,而不是那么多.我想知道这种差异的根源是什么?还是我误解了那些性能计数器的含义?
谢谢
我知道CUDA中有函数clock(),您可以在其中放入内核代码并查询GPU时间.但我想知道OpenCL中是否存在这样的事情?有没有办法在OpenCL中查询GPU时间?(我正在使用NVIDIA的工具包).
cuda profiler手册指出,由于更加宽松的合并策略,未合并的内存事务的数量将始终为零.但我确信仍然存在不合并的情况.怎么计算呢?是否有任何工具或模拟器可以帮助?其中,哪一个似乎最准确?谢谢
我想从父母那里创造N个孩子.我希望所有的孩子同时开始(一个功能 - 测量时间).所以我把函数放在一个信号处理程序中,当父完成创建(fork)所有子节点时,它会向所有子节点发送信号(使用kill(children_id))让make启动.代码如下,但它不能按预期工作.具体来说,它分叉所有子项,但根本不执行函数"measure_time".这个功能不是记录执行时间而是打印出来的东西.如果我做错了什么,有人会告诉我吗?
int n_task = 4;
for (i = 0; i < n_task; i++){
pid = fork();
if (pid < 0){
printf("cannot fork!\n");
} else
if (pid == 0){ //child
printf("printed from child [%d]\n", getpid());
signal(SIGUSR1, measure_time); //measure_time is a function
exit(0);
} else {
pid_array[i] = pid;
}
}
//This code is executed from parent only
for (int i = 0; i < n_task; i++)
{
kill(pid_array[i], SIGUSR1);
}
Run Code Online (Sandbox Code Playgroud)