我有一个矩阵乘法代码,如下所示:
for(i = 0; i < dimension; i++)
for(j = 0; j < dimension; j++)
for(k = 0; k < dimension; k++)
C[dimension*i+j] += A[dimension*i+k] * B[dimension*k+j];
Run Code Online (Sandbox Code Playgroud)
这里,矩阵的大小由表示dimension
.现在,如果矩阵的大小是2000,运行这段代码需要147秒,而如果矩阵的大小是2048,则需要447秒.所以虽然差别没有.乘法是(2048*2048*2048)/(2000*2000*2000)= 1.073,时间上的差异是447/147 = 3.有人可以解释为什么会发生这种情况吗?我预计它会线性扩展,但这不会发生.我不是要尝试制作最快的矩阵乘法代码,只是试图理解它为什么会发生.
规格:AMD Opteron双核节点(2.2GHz),2G RAM,gcc v 4.5.0
程序编译为 gcc -O3 simple.c
我也在英特尔的icc编译器上运行了这个,并看到了类似的结果.
编辑:
正如评论/答案中所建议的那样,我运行了维度= 2060的代码,需要145秒.
继承完整的计划:
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
/* change dimension size as needed */
const int dimension = 2048;
struct timeval tv;
double timestamp()
{
double t;
gettimeofday(&tv, NULL);
t = tv.tv_sec + (tv.tv_usec/1000000.0); …
Run Code Online (Sandbox Code Playgroud) 有人可以通过infiniband解释IPoIB和TCP的概念吗?我理解本地infiniband提供的整体概念和数据速率,但不太了解TCP和IPoIB如何适应.为什么你需要它们,他们做了什么?有人说他们的网络使用IPoIB或TCP与infiniband有什么区别?哪一个更好?我不是来自强大的网络背景,所以如果你能详细说明那就太好了.
谢谢您的帮助.
我怎么能在gnuplot中这样做:
plot "test.csv" using 1:2 if value_in_column_3 == 80.0
Run Code Online (Sandbox Code Playgroud)
它应该只选择第3列== 80.0的行并忽略所有其他行(它不应该为其他行绘制0,只需忽略它们)
提前致谢.
从这里:文件是否在UNIX中附加原子
考虑多个进程打开同一文件并附加到其中的情况.O_APPEND保证寻找到文件的末尾然后开始写操作是原子的.因此,只要每个写入大小<= PIPE_BUF,多个进程就可以附加到同一个文件中,并且任何进程都不会覆盖任何其他进程的写入.
我编写了一个测试程序,其中多个进程打开并写入同一个文件(write(2)
).我确保每个写入大小> PIPE_BUF(4k).我期待看到进程覆盖其他人数据的实例.但那并没有发生.我测试了不同的写入大小.那只是运气还是有理由不这样做?我的最终目标是了解附加到同一文件的多个进程是否需要协调其写入.
这是完整的计划.每个进程都创建一个int缓冲区,用它填充所有值rank
,打开一个文件并写入它.
规格:Opensuse 11.3 64位的OpenMPI 1.4.3
编译为:mpicc -O3 test.c,运行方式:mpirun -np 8 ./a.out
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int
main(int argc, char** argv) {
int rank, size, i, bufsize = 134217728, fd, status = 0, bytes_written, tmp_bytes_written;
int* buf;
char* filename = "/tmp/testfile.out";
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
buf = (int*) malloc (bufsize * sizeof(int));
if(buf == NULL) {
status = -1; …
Run Code Online (Sandbox Code Playgroud) I have a function that takes a void**
argument and an integer that indicates its datatype
void foo (void** values, int datatype)
Run Code Online (Sandbox Code Playgroud)
Inside the function, depending on the datatype, I malloc it this way:
if (datatype == 1)
*values = (int*) malloc (5 * sizeof(int));
else if (datatype == 2)
*values = (float*) malloc (5 * sizeof(float));
Run Code Online (Sandbox Code Playgroud)
All is good upto now. However, when character strings come into the picture, things get complicated. The void**
would need to be void*** …
我正在测试内核异步io函数(不是posix aio),我正在试图弄清楚它是如何工作的.下面的代码是一个完整的程序,我只需将数组重复写入使用O_DIRECT打开的文件.我在回调函数中遇到错误"写入错过的字节,期望1024得到0"(参见work_done()中的fprintf语句).
对于那些不熟悉内核aio的人,下面的代码执行以下操作:
我在第5步得到一个错误.如果我不使用O_DIRECT打开文件,一切正常,但它胜过了异步写入的目的.有人能告诉我我做错了什么吗?这是内核aio的正确用法,例如,我对回调的使用是否正确?O_DIRECT的使用是否有任何限制?
我用'gcc -Wall test.c -laio'编译
提前致谢.
/*
* File: myaiocp.c
* Author: kmehta
*
* Created on July 11, 2011, 12:50 PM
*
*
* Testing kernel aio.
* Program creates a 2D matrix and writes it multiple times to create a file of desired size.
* Writes are performed using kernel aio functions (io_prep_pwrite, io_submit, etc.)
*/
#define _GNU_SOURCE
#define _XOPEN_SOURCE 600
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <pthread.h>
#include …
Run Code Online (Sandbox Code Playgroud) 我在Makefile中有这个:
run:
for x in *.bin ; do ./$$x ; done
Run Code Online (Sandbox Code Playgroud)
这样它就可以逐个启动所有可执行文件.我想做这个:
run:
for x in *.bin ; do ./$$x &; done
Run Code Online (Sandbox Code Playgroud)
这样它就会启动每个可执行文件并将其放在后台.当我放入&符号时,上面的语句出现语法错误.
我不想调用make,make &
因为这将在后台运行进程但仍然是一个接一个,而我希望单个可执行文件在后台运行,这样在任何时刻我都有多个可执行文件在运行.
先感谢您.
我正在尝试将数组写入文件,我以这种方式打开文件:
open(unit=20, FILE="output.txt", form='unformatted', access='direct', recl=sizeof(u))
Run Code Online (Sandbox Code Playgroud)
这里u
是一个数组,sizeof(u)
是2730025920,约为2.5GB.当我运行程序时,我收到一个错误Fortran runtime error: RECL parameter is non-positive in OPEN statement
,我相信这意味着记录大小太大.
有办法处理这个吗?一种选择是在多个写调用中写入数组,使得每次写入中的记录大小小于2.5GB.但我想知道我是否可以在一次通话中编写整个阵列.
编辑:
u
已声明为double precision u(5,0:408,0:408,0:407)
程序编译gfortran -O3 -fopenmp -mcmodel=medium test.f
为此程序中有一些OpenMP代码,但文件I/O是顺序的.
gfortran v 4.5.0,操作系统:在64位AMD Opteron上打开11.3
谢谢你的帮助.
我使用以下代码创建一个文件:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
const char* filename = "./test.out";
int fd;
if(-1 == (fd = open(filename, O_CREAT|O_RDWR, 0666)))
{
perror("Error");
errno = 0;
}
else
puts("File opened");
if(-1 == (close(fd)))
{
perror("Error");
errno = 0;
}
else
puts("File closed");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我将mode
参数指定为0666
,应该授予每个人读,写访问权限.然而,一个ls -l
节目
-rw-r--r-- 1 kmehta users 0 2012-01-29 16:29 test.out
如您所见,写权限仅授予文件所有者.我不知道为什么其他人都没有被正确授予权限.chmod a+w test.out
但是,正确设置权限.
代码编译为 gcc -Wall …
该writev
函数采用struct iovec数组作为输入参数
writev(int fd, const struct iovec *iov, int iovcnt);
输入是需要写入文件的内存缓冲区列表(比如说).我想知道的是:
writev内部是否这样做:
for (each element in iov)
write(element)
这样每个元素iov
都在一个单独的I/O调用中写入文件?或者writev
在一次 I/O调用中将所有内容写入文件?
c ×6
io ×2
posix ×2
aio ×1
algorithm ×1
file-io ×1
fortran ×1
gnuplot ×1
infiniband ×1
linux ×1
linux-kernel ×1
makefile ×1
mpi ×1
networking ×1
performance ×1
tcp ×1
unix ×1