hameeza ahmed via llvm-dev
2018-Sep-20 21:15 UTC
[llvm-dev] Vectorization width not correct using #pragma clang loop vectorize_width
Hello,
I m trying to set vector width using #pragma clang loop vectorize_width(32)
but i m getting width 8 for the following kernel;
#define M 128
#define N 128
#define SQRT_FUN(x) sqrtf(x)
int main(int argc, char** argv)
{
/* Variable declaration/allocation. */
double float_n = (double)N;
double data[N*M];
double corr[M*M];
double mean[M];
double stddev[M];
uint32_t i,j,k;
/*Initialize array(s). */
#pragma clang loop vectorize_width(1) //no vectorize
for (i = 0; i < N*M; i++)
{
data[i] = (50.0)*i;
}
kernel_1:
#pragma clang loop vectorize_width(32)
for (j = 0; j < M; j++)
{
mean[j] = 0.0;
}
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
mean[j] += data[(i*M) + j];
}
for (j = 0; j < M; j++)
{
mean[j] /= float_n;
}
kernel_2:
for (j = 0; j < M; j++)
{
stddev[j] = 0.0;
}
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
stddev[j] += (data[(i*M) + j] - mean[j]) * (data[(i*M)+j] -
mean[j]);
}
}
for (j = 0; j < M; j++)
{
stddev[j] /= float_n;
}
for (j = 0; j < M; j++)
{
stddev[j] = SQRT_FUN(stddev[j]);
}
kernel_3:
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
data[(i*M) + j] -= mean[j];
}
}
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
{
data[(i*M) + j] /= SQRT_FUN(float_n) * stddev[j];
}
}
kernel_4:
for (i = 0; i < M*M; i++)
{
corr[i] = 0.0;
}
for (k = 0; k < N; k++)
{
for (i = 0; i < M-1; i++)
{
for (j = i+1; j < M; j++)
{
corr[(i*M)+j] += (data[(k*M)+i] *
data[(k*M)+j]);
}
}
}
printf("Corr[0]: %lf\n",mean[0]);
printf("Corr[0]: %lf\n",mean[M-1]);
printf("Corr[0]: %lf\n",stddev[0]);
printf("Corr[0]: %lf\n",stddev[M-1]);
printf("Corr[0]: %lf\n",corr[0]);
printf("Corr[(M*M)-1]: %lf\n",corr[(M*M)-1]);
printf("Corr[0]: %lf\n",data[0]);
printf("Corr[(M*M)-1]: %lf\n",data[(M*M)-1]);
return 0;
}
*i m getting following output when i compiled;*
*clang -O3 correlation.c -Rpass=loop-vectorize -emit-llvm -march=knl
-S -o 1.llcorrelation.c:38:9: remark: vectorized loop (vectorization
width: 8, interleaved count: 4) [-Rpass=loop-vectorize] for (j = 0;
j < M; j++) ^correlation.c:41:5: remark: vectorized loop
(vectorization width: 8, interleaved count: 4) [-Rpass=loop-vectorize]
for (j = 0; j < M; j++) ^correlation.c:53:9: remark: vectorized loop
(vectorization width: 8, interleaved count: 4)
[-Rpass=loop-vectorize] for (j = 0; j < M; j++)
^correlation.c:58:5: remark: vectorized loop (vectorization width: 8,
interleaved count: 4) [-Rpass=loop-vectorize] for (j = 0; j < M; j++)
^correlation.c:71:9: remark: vectorized loop (vectorization width: 8,
interleaved count: 4) [-Rpass=loop-vectorize] for (j = 0; j < M;
j++) ^correlation.c:78:9: remark: vectorized loop (vectorization
width: 8, interleaved count: 4) [-Rpass=loop-vectorize] for (j = 0;
j < M; j++) ^correlation.c:98:13: remark: vectorized loop
(vectorization width: 8, interleaved count: 4)
[-Rpass=loop-vectorize] for (j = i+1; j < M; j++)*
*why is that so?*
*although i m able to set width to 32 of the example code given on site.*
*Why Pragmas are not setting vector width correctly here in my kernel?*
*What is the issue?*
*Please help..*
*Thank You*
*Regards*
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20180921/a072e1c9/attachment.html>
Friedman, Eli via llvm-dev
2018-Sep-20 22:29 UTC
[llvm-dev] Vectorization width not correct using #pragma clang loop vectorize_width
On 9/20/2018 2:15 PM, hameeza ahmed wrote:> Hello, > I m trying to set vector width using #pragma clang loop > vectorize_width(32) but i m getting width 8 for the following kernel; > > *i m getting following output when i compiled;* > * > * > *clang -O3 correlation.c -Rpass=loop-vectorize -emit-llvm > -march=knl -S -o 1.ll > correlation.c:38:9: remark: vectorized loop (vectorization width: 8, > interleaved count: 4) [-Rpass=loop-vectorize] > for (j = 0; j < M; j++) > ^ > *With AVX-512, an instruction can operate on at most 8 double-precision lanes. The vectorizer recognizes that, and interleaves the loop so you get 8*4==32 scalar iterations per iteration of the vectorized loop. -Eli -- Employee of Qualcomm Innovation Center, Inc. Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180920/13c67b42/attachment.html>
hameeza ahmed via llvm-dev
2018-Sep-20 22:40 UTC
[llvm-dev] Vectorization width not correct using #pragma clang loop vectorize_width
Thank you. I am working on a machine with greater vector widths. How to enable the emission of greater and different vector widths in loop codes through pragma ? and automatically. On Friday, September 21, 2018, Friedman, Eli <efriedma at codeaurora.org> wrote:> On 9/20/2018 2:15 PM, hameeza ahmed wrote: > > Hello, > I m trying to set vector width using #pragma clang loop > vectorize_width(32) but i m getting width 8 for the following kernel; > > *i m getting following output when i compiled;* > > > > > > *clang -O3 correlation.c -Rpass=loop-vectorize -emit-llvm > -march=knl -S -o 1.ll correlation.c:38:9: remark: vectorized loop > (vectorization width: 8, interleaved count: 4) [-Rpass=loop-vectorize] > for (j = 0; j < M; j++) ^ * > > > With AVX-512, an instruction can operate on at most 8 double-precision > lanes. The vectorizer recognizes that, and interleaves the loop so you get > 8*4==32 scalar iterations per iteration of the vectorized loop. > > -Eli > > -- > Employee of Qualcomm Innovation Center, Inc. > Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180921/745710b9/attachment.html>