Geert Jan Bex
自2009年以来,我是Flemish SuperCuputer中心的HPC顾问,进行支持和培训(也是Prace和Eurocc)。我拥有机器学习主题的物理和CS博士学位。
地点比利时
活动
-
@georginokalengtshikwand如今,Intel Oneapi可以免费使用,您甚至可以安装整个套件的Docker容器。
-
@georginokalengtshikwand除非我在这里最终感到困惑,否则打印了2和3,所以我不明白您的意思。
-
@georginokalengtshikwand您如何运行应用程序?这将从标准输入中读取,因此,如果您不喂养标准输入,则应用程序将坐下来等待,因此请与之调用,例如
$ ./read_messy_data.exe -
@iagoginé-Vázquez您可以为X0和R创建矩阵作为网格格里德(请参阅MATLAB或PYTHON NOMPY),以便结果是函数值的矩阵,因此行表示X0值,列值R值。
-
@georginokalengtshikwand在打印语句中,将函数is_leap_year称为参数。如果您从此类功能打印,则会创建僵局。主程序中的打印语句将锁定I/O流,因此IS_LEAP_YEAR函数中的写入语句在释放锁之前无法执行,这将永远不会发生。
这是... -
@ninibethgibellisarmientoherrera除非您想分配存储库以在Github上托管自己的副本。要克隆存储库(只需获取本地副本),您不需要帐户(我认为;)
-
@iagoginé-Vázquez掩码表达式是可选的,因此您可以,但不必在索引上指定逻辑表达式。
-
@atuljadhav当然,请随意使用您感到舒适的任何环境。
-
@Varshafelsy您必须安装WSL,这不是默认Windows安装的一部分。Google用于在Windows版本(10或11)上安装WSL2并按照说明进行操作。
-
@iagoginé-Vázquez如果记忆使用,那就是“ vim-synntastic/andtastic”
-
@Varshafelsy您在哪个目录?您可能没有写入权限,或者您两次执行命令(在这种情况下,目录可能已经存在,MKDIR将失败)。
-
@yunus您是对的,那是错别字。感谢您指出的,我会纠正它。
-
@ajayrawat良好的观察/问题和有效的问题。我个人不会说Fortran开始类似于C ++。Fortran的OOP特征更具包含,语法比C ++更简单。当然,是的,如果您将OOP添加到一种语言中,它在概念上会变得更丰富,因此更加复杂。但是,它还可以让您...
-
@aseemrajankshirsagar他们还为数学操作提供了更好的性能(尽管有关于性能的龙)。
-
@bp的确,模式识别,发现异常值和系统的假设测试是一种“元技能”,它是一个好的调试器的标志,无论您是在调试科学计算机程序,人类的思想还是人之间的相互作用。它归结为某种心态。
-
@aseemrajankshirsagar坦率地说,在Fortran中的I/O并不是周围最好的事情。
-
@paulpPrace组织了MPI,OpenMP,Cuda和Hybrid编程的出色课程。
-
@paulpPython支持所有相关的位操作。
-
-
@paulp这主要是性能问题,因此可以根据手头上的应用程序进行基准测试。
-
@paulp文本I/O具有您可以轻松检查结果的优势,但是,是的,性能可以屈服于(受一个重要因素)。
-
@mohammadshamimhasanmandal好问题。我学习新语言时的个人方法是对对角(Fortran说话的内在程序说话)阅读文档。我不尝试记住详细信息,而只是简单地可用。当我需要一个过程时,我会查找细节。
-
@paulp您会喜欢Fortran的用户定义类型。
-
@paulp确实,这就是为什么缩进仍然有用的原因,即使它在Python中没有语义。另外,您可以使用,例如“结束”来确保一切匹配。
-
-
@estherbendewr这是一个链接错误(LD),构建过程的流程是包含模块的定义和包含程序单元的文件的fortran文件,都会汇编,从而产生对象文件(.o文件)。下一步是将这两个对象文件链接到可执行文件中。cmake文件会照顾好这个,所以我猜...
-
Geert Jan Bex 回答[学习者离开FutureArearn]
@enricospecogna您可以从编译器开始。如果要在存储库中构建代码,则也需要CMAKE。
-
@ASHWINKUMAR我不确定我明白你的意思。对于性能(和多线程),最好使用BLAS实现(OpenBlas或MKL或...)。如果编译器可以通过对Blas的电话代替对Matmul的电话,那就太好了,但这是一厢情愿的想法。
-
@rajkumarpaudel我无法用GitHub存储库中的代码复制它,所以我假设您自己实施了吗?
-
@chiennguyen帕斯卡(Pascal)是阿尔戈尔(Algol)的后代。它早于(官方)的福特兰指针是二十年来的指针,在Fortran 90中引入了Poins(尽管有一些Fortran 77的扩展已经支持Pointers)。
-
@ASHWINKUMAR我们从“ data.txt”中读取,我们写入标准输出。如果您打开一个文件要读取,则无法写入它,反之亦然。尽管可以打开文件,以便您可以读写并写入该文件,并且在某些情况下当然非常有用。稍后我们将看到其中的例子。
Fort.1027238656文件可能是核心转储,即... -
@chiennguyenAN或也会有所帮助。
-
@ASHWINKUMAR对于大型矩阵,良好的BLAS实现(OpenBlas或Intel的MKL)仍然很有用。
-
@jacobabdelfatah通常,标量具有与数组元素相同的类型,但是当然,您可以使用整数标量并用真实数组将其乘以。在这里,
可以是任何算术运算符。 -
@jacobabdelfatah序列属性表明编译器应在代码中指定的顺序中生成用户定义的类型。如果您不指定顺序,则编译器可以重新排序元素以更好地利用内存对齐,从而可以改善代码的性能。因此,只有在您...
-
@jacobabdelfatah请注意,这2位在A的前面,因此表示要打印2个字符串(a)。格式说明符前面的数字是重复的次数。
-
@jacobabdelfatah我们正在打印整个数组, *指示将其用于所有数组元素的格式代码,无论数组的长度如何。
-
-
@chiennguyen确实,您是对的,感谢您指出的。
-
@jacobabdelfatah不过,请小心,C ++布尔操作员很懒惰,福特兰的操作员不是。
-
@jacobabdelfatah在C ++中有一个BOOL类型,具有真实和错误的值,但实际上,在引擎盖下,它仍然是零与非零。
-
@thomaswatson实际上,返回空隙的函数将类似于Fortran子例程。
-
@chiennguyen您在哪个目录中获取此错误?
-
@juliomendez有些人喜欢隐性循环,有些则不喜欢。我想这取决于您的背景。
-
@chiennguyenFortran现在有一个块语句,可以进行词汇范围。
-
@chiennguyen您是否安装了Fortran编译器(即Gfortran)?
-
@thomaswatson可能是的,如果您使用Make或Cmake构建,则应该可以配置VS代码(如果您足够勇敢;)
-
@chiennguyen这是将 *用作格式说明符的结果。我的猜测是为了防止连续输出语句的输出置换。如果需要控制,则必须使用格式指定符。
-
@chiennguyen您也可以使用int将真实的整数转换为整数。但是,当我有一段时间没有使用Fortran时,我总是会犯一个错误。
-
@Rolfrabenseifner确实,在第5周,我们与其他编程语言讨论互操作性。
-
@mahmoudelbakly它可以保护您免受错误,例如,无意中修改参数的值,并为编译器提供了信息以进行优化。
-
@mahmoudelbakly是的,否。您可以定义用户定义的类型,以使字段对应于您要从功能返回的所有值。尽管您的函数返回一个值(该用户定义类型的实例)有效地,您可以返回该用户定义类型中的所有字段。
您还可以选择具有多个外部或...的子例程
-
@leonardclark我的荣幸,我希望这很有用。
-
@leonardclark确实,内存带宽也更有效地使用。
-
-
DPD
-
-
@ivangirault您可以为此使用预处理器。它不像C ++模板那样干净,但可以完成工作。
-
@Wolft关于Fortran中面向对象的编程有很多信息。
-
@leeh实际上,与卷曲牙套相比,末端比卷曲牙套比白色更容易。
-
它显示了根
-
@juliomendez谢谢,很高兴您喜欢它。
-
@juliomendez的确,Bjarne Stroustrup在Fortran与C ++方面发表了很多评论。以下文章可以追溯到2007年,从那以后C ++取得了很大进步,但仍然:http://ftp.demec.ufpr.br/cfd/bibliografia/decyk_et_al_2007_fortran.pdf
-
@juliomendez确实是。实际上,在fortran说话中,一个过程是函数或子例程。该文本是从另一个较旧的MOOC复制的,我使用该术语函数表示函数和子例程,因为该MOOC均适用于Fortran和C/C ++程序员。
-
@noelallapatt您将有足够的机会在每周结束时弄脏双手。
-
@stephenroesner我感谢(并使用)良好的文档。自己在写文档上花费多少时间取决于目标受众。但是,经验了解到,必须在完成后必须记录大型项目是非常不愉快的,因此无论如何在开发时都可以记录重要功能/钥匙API。
-
@stephenroesner确实,这也将在稍后进行详细讨论。
-
@lucaspacheco对于性能,应避免运行时多态性。只要编译器可以找出要拨打哪些程序,就不会产生绩效影响。如果必须在运行时确定,它将降低效率。
-
@stephenroesner确实,对于许多编程语言,该约定是为常数使用大写。
-
@云天燕对此表示歉意。我们的团队中没有任何中国演讲者,因此当我们要求翻译时,很难检查质量。
-
它指的是动态内存管理部分。因此,如果您分配用户提供的大小和失败的大小数组,则错误消息应提供信息,即,读取诸如“指定的向量大小太大”之类的内容。
-
@juliomendezPA是“旧”数据的地址。PA_NEW是新数据的地址。在第一次迭代t = 1中,计算根据A的内容修改了A_NEW的内容。在该迭代的末尾,PA和PA_NEW的末尾已交换,即PA现在指向A_NEW,PA_NEW现在指向A。
在第二个迭代t = 2中,数据... -
@juliomendez关键是,使用指针(双关语),您不必复制数据。鉴于复制数据是由内存带宽绑定的(它必须从RAM到CPU移动到RAM中的另一个位置),这将需要时间。当您交换指针时,没有任何复制,因此没有内存访问,也没有往返RAM。
-
指针的语义与其他变量相对于其具有“地址”的其他变量的语义并没有什么不同。在诸如C或C ++之类的语言中,由于使用了分配运算符,因此非常清楚,“普通”值与地址相同。Fortran有所作为,因为指针“分配”有自己的...
-
@juliomendez指针(归根结底)只是在存储器中的数据中仅处理数据,因此除了指针存储地址的64位外,没有内存开销。也就是说,与数组相比,编译器在处理指针时可能无法进行某些优化,因此,对于计算,某些代码的效率可能较低。
-
@juliomendez值属性意味着按值调用,对于标量参数,它大致相当于意图(in)。
您通过停止通过的整数(0-255)是应用程序的退出状态。语义是0意味着成功。非零表示一些问题,特定数字可用于传达问题的性质,例如1表示...
-
这主要是正确的,但并非总是如此。如果在编译时已知数组的大小,则编译器可以生成更有效的代码(循环展开可以精确,不必考虑边缘情况)。
另外,如果分配的内存与指针一起使用,则无法安全执行一些优化,因此编译器不会做... -
Fortran运行时有自己的垃圾收集器。当分配的阵列不符合范围时,将对阵列进行处理(至少在同一汇编单元中发生的阵列)。我个人更喜欢做零工,以确保。
当应用程序终止时,是OS可以进行清理。 -
我建议您查看完整的源代码。这可能使遵循文本更容易。您会在GitHub存储库中找到它。
-
@CESARGUERRA谢谢:)喜欢教您的课程。
我自己教授有关计算物理学的课程,尽管我使用C ++(我必须承认)。 -
@CESARGUERRA__file__和__line__宏由预处理器而不是编译器本身处理,因此您要么必须调用预处理器,或者更好地确保通过使用.f90(OR .F03,...)作为文件扩展名。它至少适用于Gfortran(GCC)和Ifort(Intel)。我怀疑大多数编译器都会称为...
-
@CESARGUERRA这使我们进入了功能编程和单调的有趣主题。您可以考虑返回具有结果为一个元素的用户定义的类型,而状态为另一个元素。这将使您可以将其写入基本功能。但是,所得的数据结构不会很有效。您还必须Deifne ...
-
@juliomendez我认为在cmake中,您指定 *您想要的 * *,而在“制作文件”中,您指定了要完成的方式。换句话说,cmake具有描述性,是必须的。Cmake将创建一堆包含方式的制作文件,作为开发人员,您不必担心这一点,因为Cmake知道在指定您的内容时如何做事...
-
@juliomendez想想线性代数具有功能的模块,该模块在计算流体动力学应用程序中可能很有用,也可以在文本检索中进行。
-
@guuslöhlefink很高兴您喜欢它,与您互动真是太好了。
-
@guuslöhlefink他们是完全不同的事情。OpenMP旨在用于共享内存编程,因此该应用程序在单个计算节点上运行。MPI是一个用于消息传递的库,使用它的应用程序由可以在许多计算节点上运行的过程组成,通过发送消息来交换数据和状态。
实际上,如果您真的有... -
@guuslöhlefink那把我带回来了很长时间。我记得读过它,这很诱人。我认为我从来没有掌握过编译器。
-
@guuslöhlefink的确,但是好事是您对其有多维视图。
-
@CESARGUERRA哦,不,不是另一个构建工具,为什么人们会被迫创建构建工具?有制造,AutoConf,Cmake,Scons,Bazel,我可能会忘记另外十几个;)
诸如CMAKE之类的优点是它是通用的,当您用多种语言编程时,这真的很不错。例如,doxygen也是如此。我... -
@guuslöhlefink该CNA也可以使用流I/O或数据格式(例如HDF5)完成(请参见稍后)。
-
@guuslöhlefink通常,有时会做到这一点。总是更好地检查。
-
@CESARGUERRA您的问题使我意识到,对构建过程进行简短的解释将很有用。由于我使用的是Cmake而不是简单的制作,因此我认为我可以摆脱它,但显然不是;)
-
@CESARGUERRA假设我们在单独文件中定义的模块中定义了两个函数。编译后,两个函数的组件将在对象文件中。现在假设我们只使用一个程序编译单元中的一个函数,该功能在另一个文件中定义。
发生的事情取决于链接器。对于GFORTRAN和LD,即使有-os(就是...
-
@guuslöhlefink确实,尽管可视化大数据集也是一个引人入胜的话题。
-
@tarikmenkad感谢您的互动。
-
@juliomendez除了自动平行外(这确实是最初的目标)外,编译器仍然有优势。当在多个索引上使用DO DO时,编译器是100%,即可以按任何顺序完成嵌套循环上的迭代,因此可以优化用于内存访问(从而更好地性能)。
-
@juliomendez请注意,我没有在块中声明我,只有j。因此,在块中,我指的是在外部范围中声明的变量。
-
@guuslöhlefink确切地说,限制是有问题的,因为这违反了Liskov的原则。
-
@tarikmenkad确实,尽管这也可以通过格式I/O或二进制中的I/O流i/o来实现。
-
@tarikmenkad鉴于主要的Python实施是Cpython,答案最终总是肯定的;)