Understanding shared memory bank conflict for struct

Hi, I have a kernel that has an array of some struct Foo in shared memory, like so:

__shared__ Foo foo_array[];

do_something(foo_array[threadIdx.x].member_1);
do_something_else(foo_array[threadIdx.x].member_2);
// ...

such that each thread more or less exclusively work on one elements.

Is it reasonable to assume under SIMT model, that members of Foo would be access simultaneously by all the threads in a warp?
If alignof(Foo) == 16. Is the best one can hope for is consecutive element address be offset by 16 bytes or 4 banks. So access any member would at least have a 4 way bank conflict?

Thank ahead for any answer.

You’re falling into the AoS vs. SoA question.

You cannot predict bank conflicts without more information. The array elements will be stored sequentially in shared memory, just as they would be stored in any other type of memory. The organization of each struct will determine what is in each bank, and there is no reason to assume that adjacent elements will have the same pattern of bank usage.

If you force a struct alignment, then of course the storage pattern becomes known. Yes, in the case of a 16-byte struct, access of a member would have at least 4-way bank conflict, considered warp-wide.