我正在运行I/O密集型应用程序的一些实验,并试图了解改变内核i/o缓冲区大小,不同电梯算法等的影响.
如何知道内核中i/o缓冲区的当前大小?内核是否在需要时使用多个缓冲区?如何更改此缓冲区的大小?是否存在存储此信息的配置文件?
(要明确的是,我不是在讨论处理器或磁盘缓存,我在谈论内核使用的缓冲区,缓冲读/写,然后再将它们刷新到磁盘).
提前致谢.
有没有人有Linux aio功能的经验(io_*,而不是posix aio)?如果有人可以提供某些示例的链接(或在此提供一些示例),那将是很棒的.另外,您对其使用的一般观察/评论是什么?
我正在开发一个I/O库,有人建议我查看它们.众所周知,它们在某些情况下比POSIX aio表现更好,我想看看.
谢谢.
Gcc的-fdump-tree-optimized选项将C代码的优化版本转储为C文件.有没有办法可以使用intel的icc编译器做同样的事情?
我有一个矩阵乘法代码,我编译为icc -O3 -ipo mult.c.我想查看编译器如何执行优化.如果没有任何作用,那么我将生成程序的汇编代码.
我正在研究一些fortran-calling-C代码,并且不清楚iso_c_binding模块的使用.
我有fortran和C接口在没有 iso_c_binding的情况下成功运行,问题是我是否仍应显式绑定函数和变量.例如,这有效:
program testprog
...
interface
subroutine c_parser(param)
integer, intent(in) :: param
end subroutine
end interface
integer :: a
call c_parser(a)
..
end program
/****************/
void c_parser_ (int* param)
Run Code Online (Sandbox Code Playgroud)
因此,在C函数中附加下划线,为其编写接口,并从fortran程序中调用它.我不使用指针或allocatables,我的所有代码都有int,char,float和逻辑,需要从fortran子程序移动到C.
iso_c_binding服务的确切目的是什么?有没有陷阱?作为一个例子,这提到了在通过绑定使用字符串时的一个警告(参见"不幸的是,至少在GNU和英特尔编译器上,声明"部分).
我有一个读取基准,并且在连续运行之间,我必须确保数据不驻留在内存中,以避免因缓存而出现影响。到目前为止,我所做的就是:运行一个程序,在连续运行读取基准测试之间写入一个大文件。就像是
./read_benchmark
./write --size 64G --path /tmp/test.out
./read_benchmark
Run Code Online (Sandbox Code Playgroud)
write 程序只是将一个大小为 1G 的数组写入文件 64 次。由于主存的大小是64G,所以我写了一个大约的文件。相同的尺寸。问题是写入需要很长时间,我想知道是否有更好的方法来做到这一点,即避免数据缓存时出现的影响。
另外,如果我将数据写入/dev/null 会发生什么?
./write --size 64G --path /dev/null
Run Code Online (Sandbox Code Playgroud)
这样,写入程序退出得非常快,实际上没有执行任何I/O,但我不确定它是否覆盖了64G的主存,这正是我最终想要的。
非常感谢您的意见。
我的gnuplot上的x轴看起来类似于:
2 4 8 16 32 64 72 86 98 112 128 256 512 1024 ... 1048576
所以这些是来自2,4,8 ... 1048576的log2值.问题是有某些中间值,如72,86,98,112等,它们不是基于log2的值,并且彼此如此接近以至于标签重叠.有没有办法可以保持抽搐(即绘制值),但不能在x轴上显示标签?我想只显示那些精确幂为2的标签,但我想在图上显示所有值.
谢谢.
这是错误的,因为可能无法初始化可变大小的对象
int size = 4;
int array[size] = {1};
Run Code Online (Sandbox Code Playgroud)
size是一个变量,但编译器在创建时是否知道它的值array(size在编译时没有为初始值4分配?)?让我们size改变之后,为什么会出现这个问题呢?我的意思是,这些是连续的指令,什么可能改变size数组声明之前的值?
第二个问题:为什么不允许这样做:
const int size = 4;
int array[size] = {1};
Run Code Online (Sandbox Code Playgroud)
我宣称size是一个常数.我知道const!=只读,并且声明size为宏是正确的方法.但是,如果我保证编译器使用const我不会改变它的值size,为什么不允许?
我需要在gnuplot中这样做:
plot 1:4 where col 2=="P1", col 3=="3", col 1 has substring "blur1"
Run Code Online (Sandbox Code Playgroud)
下面是一个数据集:
col_1 col_2 col_3 col_4
gcc.blur1.O0 P1 3 10.5
icc.blur1.O2 P2 5 9.8
gcc.blur2.O3 P2 3 8.9
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我正在尝试使用pwrite将2GB写入文件,但下面的代码写的数量较少.但是,如果我使用1GB的2个pwrite调用总共写入2GB,那就行了.
预期文件大小:2147483648字节(2GB),观察:2147479552
编译为: gcc -Wall test.c -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_XOPEN_SOURCE=600
64位Opensuse上的gcc v 4.5.0
这是完整的计划.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
size_t size = 2147483648; //2GB
off_t offset = 0;
int fd;
char *buf = (char*) malloc (size * sizeof(char));
if(buf == NULL)
{
printf("malloc error \n");
exit(-1);
}
if(-1 == (fd = open("/tmp/test.out", O_RDWR|O_CREAT, 0644)))
{
fprintf(stderr, "Error opening file. Exiting..\n");
free(buf);
exit(-1);
}
if(-1 == (pwrite(fd, buf, size, offset)))
{
perror("pwrite error");
free(buf);
exit(-1);
} …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的文件:
b, 20, 434
a, 20, 23
a, 10, 123
a, 20, 423
a, 10, 89
b, 20, 88
b, 10, 133
b, 10, 99
Run Code Online (Sandbox Code Playgroud)
a,10)a行放在一起)也就是说,输出应该是文件应该是
a, 10, 123
a, 20, 423
b, 10, 133
b, 20, 434
Run Code Online (Sandbox Code Playgroud)
如何在 bash 脚本中执行此操作?谢谢你的帮助。