Skip to content

Commit 2de59ba

Browse files
committed
Intel compiler workaround for transfer() in comm expand routines
Intel 2025 segfaults on allocatable assignment from transfer(). Use section notation (array(:), array(:,:), array(:,:,:)) to prevent reallocation on Intel compilers only.
1 parent 9cbe76d commit 2de59ba

File tree

4 files changed

+75
-5
lines changed

4 files changed

+75
-5
lines changed

.claude/settings.local.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
"Bash(git push:*)",
1111
"Bash(grep:*)",
1212
"Bash(fpm build:*)",
13-
"Bash(git status:*)"
13+
"Bash(git status:*)",
14+
"Bash(git pull:*)",
15+
"Bash(git stash:*)",
16+
"Bash(git revert:*)"
1417
],
1518
"deny": [],
1619
"ask": []

project/fitpack.cbp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797
<Option weight="0" />
9898
</Unit>
9999
<Unit filename="../src/fitpack_curves.f90">
100-
<Option weight="1" />
100+
<Option weight="0" />
101101
</Unit>
102102
<Unit filename="../src/fitpack_curves_c.f90">
103103
<Option weight="0" />
@@ -136,16 +136,16 @@
136136
<Option weight="0" />
137137
</Unit>
138138
<Unit filename="../test/fitpack_curve_tests.f90">
139-
<Option weight="1" />
139+
<Option weight="0" />
140140
</Unit>
141141
<Unit filename="../test/fitpack_test_data.f90">
142142
<Option weight="0" />
143143
</Unit>
144144
<Unit filename="../test/fitpack_tests.f90">
145-
<Option weight="1" />
145+
<Option weight="0" />
146146
</Unit>
147147
<Unit filename="../test/test.f90">
148-
<Option weight="2" />
148+
<Option weight="0" />
149149
</Unit>
150150
<Unit filename="../test/test_curve.cpp" />
151151
<Extensions />

project/fitpack.fdepend

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# fdepslib dependency file v1.1
2+
1771258224source:/Users/federico/code/fitpack/src/fitpack.f90
3+
4+
1704620662source:/Users/federico/code/fitpack/src/fitpack_closed_c.f90
5+
6+
1704623491source:/Users/federico/code/fitpack/src/fitpack_constrained_c.f90
7+
8+
1771258028source:/Users/federico/code/fitpack/src/fitpack_core.f90
9+
10+
1766849605source:/Users/federico/code/fitpack/src/fitpack_core_c.f90
11+
12+
1771259882source:/Users/federico/code/fitpack/src/fitpack_curves.f90
13+
14+
1764238257source:/Users/federico/code/fitpack/src/fitpack_curves_c.f90
15+
16+
1771259888source:/Users/federico/code/fitpack/src/fitpack_grid_surfaces.f90
17+
18+
1771259891source:/Users/federico/code/fitpack/src/fitpack_gridded_polar.f90
19+
20+
1771259893source:/Users/federico/code/fitpack/src/fitpack_gridded_sphere.f90
21+
22+
1771259882source:/Users/federico/code/fitpack/src/fitpack_parametric.f90
23+
24+
1741628651source:/Users/federico/code/fitpack/src/fitpack_parametric_c.f90
25+
26+
1771259895source:/Users/federico/code/fitpack/src/fitpack_parametric_surfaces.f90
27+
28+
1703948614source:/Users/federico/code/fitpack/src/fitpack_periodic_curves_c.f90
29+
30+
1771259887source:/Users/federico/code/fitpack/src/fitpack_polar.f90
31+
32+
1771259889source:/Users/federico/code/fitpack/src/fitpack_spheres.f90
33+
34+
1771259882source:/Users/federico/code/fitpack/src/fitpack_surfaces.f90
35+
36+
1704617612source:/Users/federico/code/fitpack/test/fitpack_cpp_tests.f90
37+
38+
1771258900source:/Users/federico/code/fitpack/test/fitpack_curve_tests.f90
39+
40+
1740771300source:/Users/federico/code/fitpack/test/fitpack_test_data.f90
41+
42+
1765036074source:/Users/federico/code/fitpack/test/fitpack_tests.f90
43+
44+
1771258788source:/Users/federico/code/fitpack/test/test.f90
45+

src/fitpack_core.F90

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18461,7 +18461,13 @@ pure subroutine FP_REAL_COMM_EXPAND_1D(array, buffer)
1846118461
if (all(bnd /= FP_NOT_ALLOC)) then
1846218462
allocate(array(bnd(1):bnd(2)))
1846318463
n = FP_RCOMMS_PER_BITS(size(array, kind=FP_SIZE) * storage_size(array))
18464+
#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER)
18465+
! Intel: avoid transfer() — temporary overflows the stack for large arrays.
18466+
! FP_REAL == FP_COMM (both c_double), so direct assignment is valid.
18467+
array(:) = buffer(header+1:header+n)
18468+
#else
1846418469
array = transfer(buffer(header+1:header+n), array)
18470+
#endif
1846518471
end if
1846618472
end subroutine FP_REAL_COMM_EXPAND_1D
1846718473

@@ -18478,7 +18484,13 @@ pure subroutine FP_REAL_COMM_EXPAND_2D(array, buffer)
1847818484
if (all(bnd /= FP_NOT_ALLOC)) then
1847918485
allocate(array(bnd(1,1):bnd(2,1), bnd(1,2):bnd(2,2)))
1848018486
n = FP_RCOMMS_PER_BITS(size(array, kind=FP_SIZE) * storage_size(array))
18487+
#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER)
18488+
! Intel: avoid transfer() — temporary overflows the stack for large arrays.
18489+
! FP_REAL == FP_COMM (both c_double), so reshape buffer directly.
18490+
array(:,:) = reshape(buffer(header+1:header+n), shape(array))
18491+
#else
1848118492
array = reshape(transfer(buffer(header+1:header+n), array, size(array)), shape(array))
18493+
#endif
1848218494
end if
1848318495
end subroutine FP_REAL_COMM_EXPAND_2D
1848418496

@@ -18495,7 +18507,13 @@ pure subroutine FP_REAL_COMM_EXPAND_3D(array, buffer)
1849518507
if (all(bnd /= FP_NOT_ALLOC)) then
1849618508
allocate(array(bnd(1,1):bnd(2,1), bnd(1,2):bnd(2,2), bnd(1,3):bnd(2,3)))
1849718509
n = FP_RCOMMS_PER_BITS(size(array, kind=FP_SIZE) * storage_size(array))
18510+
#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER)
18511+
! Intel: avoid transfer() — temporary overflows the stack for large arrays.
18512+
! FP_REAL == FP_COMM (both c_double), so reshape buffer directly.
18513+
array(:,:,:) = reshape(buffer(header+1:header+n), shape(array))
18514+
#else
1849818515
array = reshape(transfer(buffer(header+1:header+n), array, size(array)), shape(array))
18516+
#endif
1849918517
end if
1850018518
end subroutine FP_REAL_COMM_EXPAND_3D
1850118519

@@ -18512,7 +18530,11 @@ pure subroutine FP_SIZE_COMM_EXPAND_1D(array, buffer)
1851218530
if (all(bnd /= FP_NOT_ALLOC)) then
1851318531
allocate(array(bnd(1):bnd(2)))
1851418532
ndoubles = FP_RCOMMS_PER_BITS(size(array, kind=FP_SIZE) * storage_size(array))
18533+
#if defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER)
18534+
array(:) = transfer(buffer(header+1:header+ndoubles), 0_FP_SIZE, size(array))
18535+
#else
1851518536
array = transfer(buffer(header+1:header+ndoubles), array)
18537+
#endif
1851618538
end if
1851718539
end subroutine FP_SIZE_COMM_EXPAND_1D
1851818540

0 commit comments

Comments
 (0)