Change alignment of temporary IDFT buffer in PHY_ofdm_mod
Alignment of temporary IDFT buffer was changed to 64 bytes. This is in preparation for possible use of different IDFT implementation which could use AVX-512, requiring 64-byte alignment.
This commit is contained in:
@@ -40,6 +40,9 @@ This section deals with basic functions for OFDM Modulation.
|
|||||||
#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
|
#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
|
||||||
//#define DEBUG_OFDM_MOD
|
//#define DEBUG_OFDM_MOD
|
||||||
|
|
||||||
|
// Use 64-byte alignment for IDFT output buffer to ensure no
|
||||||
|
// runtime error in case IDFT implementation uses AVX-512.
|
||||||
|
#define IDFT_OUTPUT_BUFFER_ALIGNMENT 64
|
||||||
|
|
||||||
void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms)
|
void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms)
|
||||||
{
|
{
|
||||||
@@ -163,12 +166,13 @@ void PHY_ofdm_mod(const int *input, /// pointer to complex input
|
|||||||
switch (etype) {
|
switch (etype) {
|
||||||
case CYCLIC_PREFIX: {
|
case CYCLIC_PREFIX: {
|
||||||
int *output_ptr = &output[(i * fftsize) + ((1 + i) * nb_prefix_samples)];
|
int *output_ptr = &output[(i * fftsize) + ((1 + i) * nb_prefix_samples)];
|
||||||
|
// Current idft implementation uses AVX-256: Check if buffer is already aligned to 256 bits (32 bytes)
|
||||||
if ((uintptr_t)output_ptr % 32 == 0) {
|
if ((uintptr_t)output_ptr % 32 == 0) {
|
||||||
// output ptr is aligned, do ifft inplace
|
// output ptr is aligned, do ifft inplace
|
||||||
idft(idft_size, (int16_t *)&input[i * fftsize], (int16_t *)output_ptr, 1);
|
idft(idft_size, (int16_t *)&input[i * fftsize], (int16_t *)output_ptr, 1);
|
||||||
} else {
|
} else {
|
||||||
// output ptr is not aligned, needs an extra memcpy
|
// output ptr is not aligned, needs an extra memcpy
|
||||||
c16_t temp[fftsize] __attribute__((aligned(32)));
|
c16_t temp[fftsize] __attribute__((aligned(IDFT_OUTPUT_BUFFER_ALIGNMENT)));
|
||||||
idft(idft_size, (int16_t *)&input[i * fftsize], (int16_t *)temp, 1);
|
idft(idft_size, (int16_t *)&input[i * fftsize], (int16_t *)temp, 1);
|
||||||
memcpy((void *)output_ptr, (void *)temp, sizeof(temp));
|
memcpy((void *)output_ptr, (void *)temp, sizeof(temp));
|
||||||
}
|
}
|
||||||
@@ -178,7 +182,8 @@ void PHY_ofdm_mod(const int *input, /// pointer to complex input
|
|||||||
}
|
}
|
||||||
|
|
||||||
case CYCLIC_SUFFIX: {
|
case CYCLIC_SUFFIX: {
|
||||||
c16_t temp[fftsize] __attribute__((aligned(32)));
|
// Use alignment of 64 bytes
|
||||||
|
c16_t temp[fftsize] __attribute__((aligned(IDFT_OUTPUT_BUFFER_ALIGNMENT)));
|
||||||
idft(idft_size, (int16_t *)&input[i * fftsize], (int16_t *)temp, 1);
|
idft(idft_size, (int16_t *)&input[i * fftsize], (int16_t *)temp, 1);
|
||||||
int *output_ptr = &output[(i * fftsize) + (i * nb_prefix_samples)];
|
int *output_ptr = &output[(i * fftsize) + (i * nb_prefix_samples)];
|
||||||
memcpy(output_ptr, temp, sizeof(temp));
|
memcpy(output_ptr, temp, sizeof(temp));
|
||||||
@@ -191,7 +196,7 @@ void PHY_ofdm_mod(const int *input, /// pointer to complex input
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case NONE: {
|
case NONE: {
|
||||||
c16_t temp[fftsize] __attribute__((aligned(32)));
|
c16_t temp[fftsize] __attribute__((aligned(IDFT_OUTPUT_BUFFER_ALIGNMENT)));
|
||||||
idft(idft_size, (int16_t *)&input[i * fftsize], (int16_t *)temp, 1);
|
idft(idft_size, (int16_t *)&input[i * fftsize], (int16_t *)temp, 1);
|
||||||
int *output_ptr = &output[i * fftsize];
|
int *output_ptr = &output[i * fftsize];
|
||||||
memcpy(output_ptr, temp, sizeof(temp));
|
memcpy(output_ptr, temp, sizeof(temp));
|
||||||
|
|||||||
Reference in New Issue
Block a user