Software Archive
Read-only legacy content
Announcements
FPGA community forums and blogs have moved to the Altera Community. Existing Intel Community members can sign in with their current credentials.
17060 Discussions

Compiler error with some MIC intrinsics

Sebastian_v_
Beginner
565 Views

I'm currently trying to use intrinsics to speed up my application. However I'm having problems with some intrinsics that won't compile. This is some test code:

#pragma offload_attribute(push, target(mic))
#include "immintrin.h"
void foo()
{
  //_mm_clevict(0, _MM_HINT_T0);
  //_mm_prefetch(0, _MM_HINT_ET1);
}
#pragma offload_attribute(pop)

int main()
{
  #pragma offload target(mic:0)
  {
    foo();
  }  
}

If I compile this with the commandline "icc test.cpp" and comment out the _mm_clevict line I'm getting a "undefined reference to `_mm_clevict'" error. If I comment out the _mm_prefetch I'm getting an "internal error: 04010002_1809". However if I compile this as a native application using "icc test.cpp -mmic" everything compiles fine. Also if I move the call to _mm_clevict or _mm_prefetch into the offload region in the main function everything compiles fine. How do I use these intrinsics correctly? My compiler version is: icc version 15.0.0 (gcc version 4.4.7 compatibility)

0 Kudos
3 Replies
Kevin_D_Intel
Employee
565 Views

I reproduced the internal error and will report that to Development (see internal tracking id below) since that should not happen regardless of the program correctness.

These intrinsics require using the __MIC__ predefine so they only participate in the target-side compilation for the offloaded code. Without this they participate in both the host and target compilations where they will be problematic on the host. So consider something like:

#ifdef __MIC__
  _mm_clevict(0, _MM_HINT_T0);
  _mm_prefetch(0, _MM_HINT_ET1);
#endif

(Internal tracking id: DPD200365512)

0 Kudos
pbkenned1
Employee
565 Views

Actually, it looks like the ICE is caused by not defining __MIC__, so perhaps that is a workaround. 

I made some slight modifications -- this works for offload or native:

[U538762]$ cat U538762-MIC.cpp
#include <omp.h>
#pragma offload_attribute(push, target(mic))
int global_nt;
#include "immintrin.h"
#include <stdio.h>
void foo()
{
#ifdef __MIC__
  _mm_clevict(0, _MM_HINT_T0);
  _mm_prefetch(0, _MM_HINT_ET1);
#pragma omp parallel
   global_nt = omp_get_num_threads();
  printf("\n Number of threads = % d \n",global_nt);
#endif
}
#pragma offload_attribute(pop)

int main()
{
  #pragma offload target(mic:0)
  {
    foo();
  }
}
[U538762]$

 

***OFFLOAD MODE****

[U538762]$ icc -V
Intel(R) C Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 15.0.1.133 Build 20141023
Copyright (C) 1985-2014 Intel Corporation.  All rights reserved.

[U538762]$ icc -openmp U538762-MIC.cpp -o U538762-MIC-host.x
[U538762]$ ./U538762-MIC-host.x

 Number of threads =  224
[U538762]$

 

***NATIVE MODE****

[U538762]$ icc -openmp -mmic -wd161 U538762-MIC.cpp -o U538762-MIC-mic.x
[U538762]$
[root@dpdmic09-mic0 pbkenned]# ./U538762-MIC-mic.x

 Number of threads =  228
[root@dpdmic09-mic0 pbkenned]#

 

Patrick

0 Kudos
Sebastian_v_
Beginner
565 Views

Hi,

thanks for your replies. Soon after posting my question I also realized that the errors were caused by the host compiler, so using #ifdef __MIC__ solves the problem. However I'm still wondering why this wasn't a problem with other intrinsics. Also the internal compiler error only occurs with this specific hint. Using _MM_HINT_ET0, _MM_HINT_T0 and _MM_HINT_T1 as hint for _mm_prefetch is also compiling fine. But I'll just use #ifdef __MIC__ in the future when working with MIC specific intrinsics.

0 Kudos
Reply