Quantcast
Channel: Recent posts
Viewing all 415 articles
Browse latest View live

Offloading of a simple code that includes a User Defined Reduction

$
0
0

Dear all,

I am trying to compile with the latest Intel compiler (version 16.0.3) the following simple code in which an OpenMP v4.x user defined reduction is offloaded to a MIC.

#pragma offload_attribute (push,target(mic))
#include <stdio.h>

typedef struct {
   double real;
   double imag;
} complex_t;

complex_t complex_add (complex_t a, complex_t b)
{
   complex_t c;
   c.real = a.real + b.real;
   c.imag = a.imag + b.imag;
   return c;
}

#pragma offload_attribute (pop)

int main ()
{
   complex_t x;

#pragma omp declare reduction(cmplxAdd: complex_t: omp_out=complex_add(omp_out, omp_in)) initializer( omp_priv={0.0, 0.0} )
#pragma offload target(mic) out(x)
   {
      x = (complex_t) {0.0, 0.0};

#pragma omp parallel num_threads(48) reduction(cmplxAdd: x)
      {
         x = (complex_t) {1.0, -1.0};
      }
   }

   printf ("Done: result is  %f,%f\n", x.real, x.imag);
}

The code is compiled using

icc -O3 -qopenmp -o mytest mytest.c

The compiler fails, producing the following error message:

/tmp/iccI8DGFd.o: In function `main':
main.c:(.text+0x199): undefined reference to `__udr_i_0x4633c48'
main.c:(.text+0x1d6): undefined reference to `__udr_c_0x4633658'

If I understand correctly, the first undefined reference is for the user defined reduction initializer, and the second one for the user defined reduction combiner (the reduction function). However, searching the Internet for related documentation I was not able to find anything about. What should I do to properly compile the code ? Am I missing linking one or more specific libraries ?

Thank you in advance for your kind assistance.

Italo Epicoco


ipo: warning 11016: Warning unknown option -no_deduplicate

$
0
0

Hello everyone,

I compile with Intel Fortran Compiler 16 as Xcode 7.3.1 being my IDE on OS X El Capitan 10.11.5 and I get this error whenever I compile a fortran file. It doesn't frustrate my code being compiled, but I wonder if this issue has any effect on my code or will be?

Thanks.

 

ifort 2016 release 3: input statement requires too much data

$
0
0

Hello,

we installed the new release 3 of the Intel Parallel Studio 2016 (parallel_studio_xe_2016.3.067) on our cluster and a problem occurs while reading from an unformatted file with any optimization (O1, O2, O3) on.

The program itself works flawlessly with -O2 with release 2 of this year's ifort as well as with ifort 10 and 11. The operating system is Linux with kernel version 3.12.60.

The following code was taken from the complete program  in fixed form Fortran and is able to reproduce the error:

      program main
      implicit none
      integer*4 iconf(1000)
      integer*4 jerz(20), jver(20)
      integer*4 iv(20),ie(20),
     .          ivsave(20),iesave(20)
      character*4 girep
      integer*4, allocatable ::lconf(:,:)
      integer*4, allocatable ::lstart(:)
      integer*4, allocatable ::iconf1(:,:)
      integer*4, allocatable ::iconf2(:,:)
      integer*4, allocatable ::i1off(:,:)
      integer*4, allocatable ::i2off(:,:)
      integer*4, allocatable ::i1ix(:)
      integer*4, allocatable ::i1ex(:)
      integer*4, allocatable ::i2iix1(:)
      integer*4, allocatable ::i2iix2(:)
      integer*4, allocatable ::i2iex1(:)
      integer*4, allocatable ::i2iex2(:)
      integer*4, allocatable ::i2eex1(:)
      integer*4, allocatable ::i2eex2(:)
      integer*4, allocatable :: mat(:) ,merz(:,:) ,mver(:,:)
      integer irefold(73),i,j
      integer*8 matall,matclast,matcalc
      integer*4 i1i,i1e,i2ie,i2ii,idum,imem,ierr
      integer*4 momax,MEMMB,NCONF,INTS2EEMAX,INTS2IEMAX
      integer*4 INTS2IIMAX,INTS1EMAX,INTS1IMAX
      integer*4 INT2,INT1,I2EE,INT0

      matall = 0
      nconf=8477
      open(unit=2,file='Hc.info.ag',form='unformatted')
      read(2) idum
      read(2) int0
      read(2) (irefold(i),i=1,int0)
      read(2) momax
      read(2) i2ii

      allocate(i2iix1(i2ii),i2iix2(i2ii),stat=ierr)
      if (ierr.ne.0) stop 'Allocation failed for creators in cinew'
      read(2)(i2iix1(i),i=1,i2ii)
      read(2)(i2iix2(i),i=1,i2ii)

      print *, '1'


      read(2) i2ie
      allocate(i2iex1(i2ie),i2iex2(i2ie),stat=ierr)
      if (ierr.ne.0) stop 'Allocation failed for creators in cinew'
      read(2)(i2iex1(i),i=1,i2ie)
      read(2)(i2iex2(i),i=1,i2ie)

      print *, '2'

      read(2) i1i
      allocate(i1ix(i1i),stat=ierr)
      if (ierr.ne.0) stop 'Allocation failed for creators in cinew'
      read(2)(i1ix(i),i=1,i1i)

      print *, '3'

      read(2) i1e
      allocate(i1ex(i1e),stat=ierr)
      if (ierr.ne.0) stop 'Allocation failed for creators in cinew'
      read(2)(i1ex(i),i=1,i1e)

      print *, '4'

      read(2) i2ee
      allocate(i2eex1(i2ee),i2eex2(i2ee),stat=ierr)
      if (ierr.ne.0) stop 'Allocation failed for creators in cinew'
      read(2)(i2eex1(i),i=1,i2ee)
      read(2)(i2eex2(i),i=1,i2ee)

      print *, '5'

      read(2) int1
      allocate(iconf1(2,int1),stat=ierr)
      if (ierr.ne.0) stop 'Allocation failed for iconf1'

      print *, '6'

      read(2) ((iconf1(i,j),i=1,2),j=1,int1)

      read(2) int2
      allocate(iconf2(3,int2),stat=ierr)
      if (ierr.ne.0) stop 'Allocation failed for iconf2'

      print *, '7'

      read(2) ((iconf2(i,j),i=1,3),j=1,int2)
      allocate(i1off(0:int1,2),stat=ierr)
      if (ierr.ne.0) stop 'Allocation failed for i1off'
      read(2)(i1off(i,1),i=0,int1)
      read(2)(i1off(i,2),i=0,int1)

      print *, '8'

      allocate(i2off(0:int2,3),stat=ierr)
      if (ierr.ne.0) stop 'Allocation failed for i2off'
      read(2)(i2off(i,1),i=0,int2)
      read(2)(i2off(i,2),i=0,int2)
      read(2)(i2off(i,3),i=0,int2)
      read(2) ints1imax,ints1emax,ints2iimax,ints2iemax,ints2eemax

      print *, '9'

      allocate(lstart(nconf+1),stat=ierr)
      if (ierr.ne.0) stop'Allocation failed for lstart in mrci'
      imem = imem + 4 * ( nconf + 1 )
	  print *, '10'
      read(2)(lstart(i),i=1,nconf+1)
	  print *, '11'
      close(2)
      end

$ ifort -O0 main.f

$ ./a.out

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10    
 11

This works as expected. But with -O1, -O2 or -O3 the following error occurs:

$ ifort -O2 main.f

$ ./a.out

 1
 2
 3
 4
forrtl: severe (67): input statement requires too much data, unit 2, file /home/adrian/tmp/ifort_test/Hc.info.ag
Image              PC                Routine            Line        Source             
a.out              0000000000407049  Unknown               Unknown  Unknown
a.out              000000000041DAB6  Unknown               Unknown  Unknown
a.out              000000000041B673  Unknown               Unknown  Unknown
a.out              00000000004032A6  Unknown               Unknown  Unknown
a.out              00000000004026DE  Unknown               Unknown  Unknown
libc.so.6          00007F01B068EF45  Unknown               Unknown  Unknown
a.out              00000000004025E9  Unknown               Unknown  Unknown

 

The input file was created by a working binary of the program compiled with release 2 of ifort 2016 and is the same in all test cases.

 

Thanks.

 

Complex Matrix Assign Crashes in IFORT 16.0.3

$
0
0

Hi,

Attached is a simple test case that crashes on a complex matrix assign in ifort 16.0.3.  It works with all previous ifort versions I have used.  The crash occurs when using the cmplx intrinsic and does not occur when not using the intrinsic.  For example,

          zz = cmplx(0._db,0._db,db) ! db defined in test file

crashes but

         zz = 0._db ! db defined in test file

does not.  My compile line is

       ifort -traceback testZ8.F90

Thanks,

John

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for Linux*

$
0
0

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for Linux includes the latest update of the Intel Fortran and C/C++ 15.0 compilers for IA-32, Intel® 64, and Intel® Many Integrated Core Architecture (Intel® MIC Architecture) systems. This new product release includes: Intel® Fortran Compiler 15.0.7, Intel® C++ Compiler 15.0.7, GNU* Project Debugger (GDB*) 7.8 IA-32/Intel® 64 debugger, GNU* Project Debugger (GDB*) 7.7 Intel® Xeon Phi™ coprocessor debugger, Intel® Math Kernel Library (Intel® MKL) Version 11.2 Update 4, Intel® Integrated Performance Primitives (Intel® IPP) Version 8.2 Update 3, Intel® Threading Building Blocks (Intel® TBB) Version 4.3 Update 6

New in this release:

  • Intel® C++ Compiler 15.0.7
  • Intel® Fortran Compiler 15.0.7
  • Corrections to reported problems

Note: For more information on the changes listed above, please read the individual component release notes. See the previous releases's ReadMe to see what was new in that release.

Resources

Contents
File:  l_compxe_online_2015.7.235.sh
Product for developing 32-bit and 64-bit applications

File:  l_compxe_2015.7.235.tgz
Product for developing 32-bit and 64-bit applications

File:  l_ccompxe_2015.7.235_redist.tgz
Redistributable Libraries

File:  l_fcompxe_2015.7.235_redist.tgz
Redistributable Libraries

File:  get-ipp-8.2-crypto-library.htm
Cryptography Library

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for C++ OS X*

$
0
0

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for C++ OS X* includes the latest update of the Intel C/C++ 15.0 compilers for IA-32 and Intel® 64 architecture systems. This new product release includes: Intel® C++ Compiler 15.0.7, GNU* Project Debugger (GDB*) 7.8, Intel® Math Kernel Library (Intel® MKL) Version 11.2 Update 4, Intel® Integrated Performance Primitives (Intel® IPP) Version 8.2 Update 3, Intel® Threading Building Blocks (Intel® TBB) Version 4.3 Update 6

New in this release:

Note:  For more information on the changes listed above, please read the individual component release notes. See the previous releases's ReadMe to see what was new in that release.

Resources

Contents
File:  m_ccompxe_online_2015.7.234.dmg
Online installer

File:  m_ccompxe_2015.7.234.dmg
Product for developing 32-bit and 64-bit applications

File:  m_ccompxe_redist_2015.7.234.dmg
Redistributable Libraries

File:  get-ipp-8.2-crypto-library.htm
Cryptography Library

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for Fortran OS X*

$
0
0

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for Fortran OS X* includes the latest update of the Intel Fortran 15.0 compilers for IA-32 and Intel® 64 architecture systems. This new product release includes: Intel® Fortran Compiler 15.0.7, GNU* Project Debugger (GDB*) 7.8, Intel® Math Kernel Library (Intel® MKL) Version 11.2 Update 4

New in this release:

  • Intel® Fortran Compiler updated to 15.0.7
  • Corrections to reported problems

Note:  For more information on the changes listed above, please read the individual component release notes. See the previous releases's ReadMe to see what was new in that release.

Resources

Contents
File:  m_fcompxe_online_2015.7.234.dmg
Online installer

File:  m_fcompxe_2015.7.234.dmg
Product for developing 32-bit and 64-bit applications

File:  m_fcompxe_redist_2015.7.234.dmg 
Redistributable Libraries

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for Windows*

$
0
0

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for Windows* includes the latest update of the Intel Fortran and C/C++ 15.0 compilers for IA-32 and Intel® 64 architecture systems. This new product release includes: Intel® Visual Fortran Compiler XE Version 15.0.7, Intel® C++ Compiler XE Version 15.0.7, Intel® Math Kernel Library (Intel® MKL) Version 11.2 Update 4, Intel® Integrated Performance Primitives (Intel® IPP) Version 8.2 Update 3, Intel® Threading Building Blocks (Intel® TBB) Version 4.3 Update 7, Intel® Debugger Extension for Intel® Many Integrated Core Architecture (Intel® MIC Architecture) Version 7.7-8.0

New in this release:

Note:  For more information on the changes listed above, please read the individual component release notes. See the previous releases's ReadMe to see what was new in that release.

Resources

Contents
File: w_compxe_online_2015.7.287.exe
Online installer

File: w_compxe_2015.7.287.exe
Product for developing 32-bit and 64-bit applications (with Microsoft Visual Studio 2010 Shell & Libraries*, English version)

File: w_compxe_all_jp_2015.7.287.exe
Product for developing 32-bit and 64-bit applications (with Microsoft Visual Studio 2010 Shell & Libraries*, Japanese version)

File:  w_ccompxe_redist_msi_2015.7.287.zip
C++ Redistributable Libraries for 32-bit and 64-bit msi files

File:  w_fcompxe_redist_msi_2015.7.287.zip
Fortran Redistributable Libraries for 32-bit and 64-bit msi files

File:  get-ipp-8.2-crypto-library.htm
Cryptography Library


Intel® Parallel Studio XE 2015 Update 7 Composer Edition for C++ Windows*

$
0
0

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for C++ Windows* includes the latest update of the Intel C/C++ 15.0 compilers for IA-32 and Intel® 64 architecture systems. This new product release includes: Intel® C++ Compiler XE Version 15.0.7, Intel® Math Kernel Library (Intel® MKL) Version 11.2 Update 4, Intel® Integrated Performance Primitives (Intel® IPP) Version 8.2 Update 3, Intel® Threading Building Blocks (Intel® TBB) Version 4.3 Update 7, Intel® Debugger Extension for Intel® Many Integrated Core Architecture (Intel® MIC Architecture) Version 7.7-8.0

New in this release:

Note:  For more information on the changes listed above, please read the individual component release notes. See the previous releases's ReadMe to see what was new in that release.

Resources

Contents
File: w_ccompxe_online_2015.7.287.exe
Online installer

File: w_ccompxe_2015.7.287.exe
Product for developing 32-bit and 64-bit applications

File:  w_ccompxe_redist_msi_2015.7.287.zip
Redistributable Libraries for 32-bit and 64-bit msi files

File:  get-ipp-8.2-crypto-library.htm
Cryptography Library

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for Fortran Windows*

$
0
0

Intel® Parallel Studio XE 2015 Update 7 Composer Edition for Fortran Windows* includes the latest update of the Intel Fortran 15.0 compilers for IA-32 and Intel® 64 architecture systems. This new product release includes: Intel® Visual Fortran Compiler XE Version 15.0.7, Intel® Math Kernel Library (Intel® MKL) Version 11.2 Update 4, Intel® Debugger Extension for Intel® Many Integrated Core Architecture (Intel® MIC Architecture) Version 7.7-8.0, Microsoft Visual Studio 2010 Shell and Libraries*

New in this release:

Note:  For more information on the changes listed above, please read the individual component release notes. See the previous releases's ReadMe to see what was new in that release.

Resources

Contents
File:  w_fcompxe_online_2015.7.287.exe
Online installer

File:  w_fcompxe_2015.7.287.exe
Product for developing 32-bit and 64-bit applications (with Microsoft Visual Studio 2010 Shell & Libraries*, English version)

File:  w_fcompxe_all_jp_2015.7.287.exe
Product for developing 32-bit and 64-bit applications (with Microsoft Visual Studio 2010 Shell & Libraries*, Japanese version)

File:  w_fcompxe_redist_msi_2015.7.287.zip
Redistributable Libraries for 32-bit and 64-bit msi files

Better spam filter

$
0
0

Can someone from Intel update the spam filters on this forum or provide a better way to filter out all the unwanted crap that is posted?

If not, then I see no alternative but to unsubscribe trom this forum.

 

Distribute compiiled DLL without ifort redistributable libraries?

$
0
0

Hi,

I am building a fortran DLL that I need to deliver to others. I would like to not require that the person receiving it have the intel libraries. Is there a compiler option so that I can statically link the libraries? (libmmd.dll and libifcoremd.dll)

 

Thank you,

James

Scope of IMPLICIT NONE through a USE statement

$
0
0

If a parent module has an IMPLICIT NONE statement and this module is accessed through a USE statement in a descendant module without an IMPLICIT NONE statement, does the IMPLICIT NONE apply to descendant module? In my recent experience, the implicit none does not. As a result, some of my legacy code generates compilation errors or worse still, continues executing with unrealistic numbers. This seems to be irrespective of compiler settings. An example is included below. Any help would be greatly appreciated.

module parent

implicit none

integer(kind = 4) :: a, b

contains

subroutine psub()

a = 1

b = 2

! c = 3 ! generates compilation error since c is not declared

print *, 'a = ', a

print *, 'b = ', b

! print *, 'c = ', c ! generates compilation error since c is not declared

end subroutine psub

end module parent

module descendant

use parent

contains

subroutine dsub()

d = 4 ! does not generate compilation error even though d is not declared

call psub()

call tsub(i)

print *, 'd = ', d ! prints d as a single precision number 4.000000

read *

end subroutine dsub

subroutine tsub(i)

integer(kind = 4) :: i

print *, 'In tsub: i = ', i ! prints i = -858993460 since expected argument is mismatched in type

end subroutine tsub

end module descendant

program main

use descendant

call dsub()

end program main

 

How to Uninstall an Intel Fortran Licenses

$
0
0

Due to unusual circumstances it was necessary to install Fortran on a number of machines, including some virtual machines. Now that things are normal again it is not possible to register Fortran on a new machine because the maximum number of installations has been reached.

Where/How can some of these now unused licenses be “un-installed” ?

Thanks

 

BLOCK, END BLOCK statements not threadsafe

$
0
0

I have run accross random results using a BLOCK, END BLOCK contstruct. My application was multi-threaded. When I move the local declarations into the parent procedure and remove the BLOCK construct the results become repeatable.

I am using implied AUTOMATIC for the project via /Qopenmp.

The help file does not mention this limitation of your implementation. Is it a bug or intentional ?

Using Visual Fortran Compiler XE 15.0.5.280.


ifort compilation summary

$
0
0

I am currently working on a Cray HPC.  I am using Intel Fortran, but through Cray's recommended Fortran front-end wrapper, ftn.  Is there an ifort compiler option that will provide a compilation/linking summary of all flags used for compiling, linking, along with libraries/includes that were used?

Thanks!

Install Issues on a MAC

$
0
0

I am trying to instal the fortran compiler on a mac (yosemite) but I'm having issues with authorizing. I have no idea what administrator or root access even means, but I have tried both using my admin password on my mac; however, I always get an "authorization failure" message. I've seen a few posts on this but I have not been able to follow them. PLEASE, someone help! 

ifort 17 beta - ICE

$
0
0

 ifort -c -coarray cgca_m3gbf.f90
cgca_m3gbf.f90(116): catastrophic error: **Internal compiler error: internal abort** Please report this error along with the circumstances in which it occurred in a Software Problem Report.  Note: File and line given may not be explicit cause of this error.
compilation aborted for cgca_m3gbf.f90 (code 1)

The file a part of a coarray library:

https://sourceforge.net/p/cgpack/code/HEAD/tree/head/cgca_m3gbf.f90

 ifort --version
ifort (IFORT) 17.0.0 20160315

 

problem with "deallocate"

$
0
0

This simple dummy program I have done to show the problem will compile with both ( gfortran 4.9.2.10 and ifort 17.0.0 20160315 ).

With gfortran it works smoothly while with ifort it generates a SEGFAULT in the deallocation phase.

I can't understand if this is a problem of the program or a problem of the compiler.

>>=====================================================================================

MODULE container
IMPLICIT NONE
TYPE :: container_t
  PRIVATE
  INTEGER, DIMENSION(:), POINTER :: A=>NULL()
CONTAINS
  PROCEDURE, PASS, PUBLIC :: BIND=>container_bind
  PROCEDURE, PASS, PUBLIC :: FREE=>container_free
END TYPE
CONTAINS
SUBROUTINE container_bind( hobj, dat )
  CLASS(container_t),             INTENT(INOUT) :: hobj
  CLASS(*), DIMENSION(:), TARGET, INTENT(IN)    :: dat
  SELECT TYPE  ( A => dat )
  TYPE IS (INTEGER)
    hobj%A => A
  END SELECT
END SUBROUTINE container_bind
SUBROUTINE container_free( hobj )
  CLASS(container_t),     INTENT(INOUT) :: hobj
  IF ( ASSOCIATED(hobj%A) ) DEALLOCATE(hobj%A)
END SUBROUTINE container_free
END MODULE container

PROGRAM test
  USE :: container
IMPLICIT NONE
  TYPE(container_t) :: T
  INTEGER, DIMENSION(:), POINTER :: A=>NULL()
  ALLOCATE(A(10))
  WRITE(*,*) 'Allocated...'
  CALL T%BIND( A )
  WRITE(*,*) 'Bounded...'
  CALL T%FREE()
  WRITE(*,*) 'Finished...'
END PROGRAM test

>>=====================================================================================

 

 

writing and reading derived types with pointers

$
0
0

Hi All,

I'm trying to save a write a derived type that contains a pointer to an unformatted file for later reading.  Below is a test version.  The derived type sol in module dType is separate because I'm patching together various Fortran codes (F95 and F77, etc).  The current version of the code "saves" sol1, but it seems to only save the pointer references, not their values, so when sol1 is deallocated, sol2 also becomes unreferenced.  I'm sure my hack on the UDTIO is not correct.

Any help would be appreciated (I'm still trying to figure out UDTIO).  Thanks

-joe

   module dType
      implicit none
      type, public :: sol
         integer:: n
         real(8), pointer:: vec(:)
      end type sol
   end module dType

   module dType_io
      use dType
      implicit none
   contains

   subroutine write_sol(dtv, unit, iostat, iomsg)
      class(sol), intent(in) :: dtv
      integer, intent(in)             :: unit
      integer, intent(out)            :: iostat
      character(*), intent(inout)     :: iomsg

      write(unit, iostat=iostat, iomsg=iomsg) dtv%n
      write(unit, iostat=iostat, iomsg=iomsg) size(dtv%vec)
      write(unit, iostat=iostat, iomsg=iomsg) dtv%vec
   end subroutine write_sol

   subroutine read_sol(dtv, unit, iostat, iomsg)
      class(sol), intent(inout)  :: dtv
      integer, intent(in)                 :: unit
      integer, intent(out)                :: iostat
      character(*), intent(inout)         :: iomsg

      integer allocSize

      ! read is sol type, but allocate pointer space as needed.
      read(unit, iostat=iostat, iomsg=iomsg) dtv%n
      read(unit, iostat=iostat, iomsg=iomsg) allocSize
      allocate( dtv%vec(allocSize) )
      read(unit, iostat=iostat, iomsg=iomsg) dtv%vec
   end subroutine read_sol
   end module dType_io

   program directAccess
      use dType
      implicit none
      integer, parameter :: dp = kind(0d0)
      type(sol):: sol1, sol2
      integer solUnit, n, sze
      integer i

      sol1%n = 10
      allocate( sol1%vec(sol1%n) )
      sol1%vec = [ (real(i),i=1,sol1%n) ]

      open(newunit=solUnit, file='test.sol', form='unformatted', status='replace', action='write')
      write(solUnit) sol1
      close(solUnit)

      open(newunit=solUnit, file='test.sol', form='unformatted', status='old', action='read')
      read(solUnit) sol2

      deallocate( sol1%vec ); nullify(sol1%vec) ! this will cause sol2 to lose reference

      close(solUnit)
      stop
   end program directAccess




 

Viewing all 415 articles
Browse latest View live


Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>