- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am haveing trouble compiling a program that offloads ipp function to the mic. I just need something simple like this:
What linking and compiling options need to be enabled?
Currently it just says:
error: undefined reference to `ippsMul_32f'
<pre class="brush:cpp">
double mult_mic_ipp(float* a,float* b, float *c, int nsize)
{
double start = 0;
double stop = 0;
int numt = 0;
#pragma offload target (mic) in(a,b:length(nsize)) out(c:length(nsize)) inout(start,stop,numt)
{
start = omp_get_wtime();
ippsMul_32f(a,b,c,nsize);
stop = omp_get_wtime();
}
return stop-start;
}
</pre>
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you very much i got it working. Final code listed below. I was using a two step compile and link in QT here is the final commands:
icpc -c -fopenmp -qoffload-option,mic -O2 -falign-functions=16 -ansi-alias -fstrict-aliasing -w1 -Wall -Wcheck -wd1572,873,2259,2261 -fPIE -I/opt/Qt5.3.2/5.3/gcc_64/mkspecs/linux-icc-64 -I/home/eric-burke/Development/c++/Mic_IPP_Final -I. -o main.o /home/eric-burke/Development/c++/Mic_IPP_Final/main.cpp
icpc -fopenmp -Wl,-rpath,/opt/Qt5.3.2/5.3/gcc_64 -o Mic_IPP_Final main.o -qoffload-option,mic,link,-L/opt/intel/composer_xe_2015.0.090/ipp/lib/mic/\ -lipps\ -lippcore -L/opt/intel/composer_xe_2015.0.090/ipp/lib/intel64 -lipps -lippcore
#include <iostream> using namespace std; #pragma offload_attribute(push, target(mic)) #include <iostream> #include <omp.h> #include <ipp.h> #include <ipps.h> void ipp_mic(); #pragma offload_attribute(pop) __declspec(target(mic)) void ipp_mic(){ int thread_count; int nsize = 10000; Ipp32f* a = ippsMalloc_32f(nsize); Ipp32f* b = ippsMalloc_32f(nsize); Ipp32f* c = ippsMalloc_32f(nsize); ippsVectorRamp_32f(a,nsize,0,1); ippsVectorRamp_32f(b,nsize,0,1); double start = omp_get_wtime(); ippsMul_32f(a,b,c,nsize); double stop = omp_get_wtime(); cout << "Vector Call: " << stop - start<< endl; thread_count = omp_get_num_threads(); thread_count = omp_get_num_threads(); int nleng = nsize/thread_count; if(omp_get_thread_num()==thread_count); nleng = nsize - (nleng*thread_count); start = omp_get_wtime(); #pragma omp parallel { ippsMul_32f(a,b,c,nleng); } stop = omp_get_wtime(); cout << "Vector Call: " << stop - start<< endl; #pragma omp parallel { #pragma omp single thread_count = omp_get_num_threads(); } cout << "Thread count: " << thread_count << endl; cout<<c[nsize-1]<<endl; } int main() { #pragma offload target(mic) ipp_mic(); }
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
So i found this: https://software.intel.com/en-us/node/503902
But it does not work i keep getting bash: IPPROOT: command not found...
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Please take a look on ipp_thread_mic example (there are both linux and windows versions). It has makefile inside where you can find real command lines for linker and compiler. Short answer - you should use -qoffload-option,mic,link,"$(IPP_LIBS)" compiler option. This will add IPP libraries to linker stage and resolve error with undefined reference.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have looked at that example and it does not compile on my machine either again failing at the linking stage. I am on linux composer xe 2015.0.090.
Here is the out put
mkdir -p build make -C ../common -f Makefile_mic.lin make[1]: Entering directory `/opt/intel/composer_xe_2015.0.090/ipp/examples/examples/common' mkdir -p build_mic ar -rcs build_mic/common.a build_mic/vm_thread.o build_mic/vm_base.o build_mic/base_renderer.o build_mic/base.o build_mic/base_window_win.o build_mic/base_window_glx.o build_mic/base_image.o build_mic/base_image_bmp.o make[1]: Leaving directory `/opt/intel/composer_xe_2015.0.090/ipp/examples/examples/common' icpc -Qoption,link,"--no-undefined" build/ipp_thread_mic.o -o build/ipp_thread_mic ../common/build_mic/common.a -qoffload-option,mic,link,"-L/opt/intel/composer_xe_2015.0.090/ipp/lib/mic -lippcore -lippi -lipps -lippvm -lpthread" /tmp/icpcMICpIBpIp: In function `main': src/ipp_thread_mic.cpp:(.text+0xa52): undefined reference to `Image::~Image()' src/ipp_thread_mic.cpp:(.text+0xa5f): undefined reference to `Image::~Image()' src/ipp_thread_mic.cpp:(.text+0xa69): undefined reference to `DString::~DString()'
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Confirm, this package has known issue in MIC example, sorry! Example was fixed in next version IPP 8.2.1.
Please, try this workaround - in file ipp_thread_mic/src/ipp_thread_mic.cpp wrap function main() like this:
#if !defined(__MIC__) int main(int argc, char *argv[]) … } #endif
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
That fixed it thanks. I was going to update to 8.1 but im on centos 7 and the installer reported unsupported os? Is there a work around on the installer?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Sorry not fixed. Running the program reports
./ipp_thread_mic offload error: cannot find offload entry __offload_entry_ipp_thread_mic_cpp_921mainicpc259572409Z5Tmie offload error: process on the device 0 unexpectedly exited with code 1
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Eric B. wrote:
I have looked at that example and it does not compile on my machine either again failing at the linking stage. I am on linux composer xe 2015.0.090.
Here is the out put
mkdir -p build make -C ../common -f Makefile_mic.lin make[1]: Entering directory `/opt/intel/composer_xe_2015.0.090/ipp/examples/examples/common' mkdir -p build_mic ar -rcs build_mic/common.a build_mic/vm_thread.o build_mic/vm_base.o build_mic/base_renderer.o build_mic/base.o build_mic/base_window_win.o build_mic/base_window_glx.o build_mic/base_image.o build_mic/base_image_bmp.o make[1]: Leaving directory `/opt/intel/composer_xe_2015.0.090/ipp/examples/examples/common' icpc -Qoption,link,"--no-undefined" build/ipp_thread_mic.o -o build/ipp_thread_mic ../common/build_mic/common.a -qoffload-option,mic,link,"-L/opt/intel/composer_xe_2015.0.090/ipp/lib/mic -lippcore -lippi -lipps -lippvm -lpthread" /tmp/icpcMICpIBpIp: In function `main': src/ipp_thread_mic.cpp:(.text+0xa52): undefined reference to `Image::~Image()' src/ipp_thread_mic.cpp:(.text+0xa5f): undefined reference to `Image::~Image()' src/ipp_thread_mic.cpp:(.text+0xa69): undefined reference to `DString::~DString()'
Hi Eric,
This was a problem in icl compiler of version 14.x. In 15-th compiler is should be fixed. Could you provide the exact version of icl compiler that you use (just "icl -V" output)? I'll check.
Regarding your last issue with offload compiler message, it means that the offload run-time library can't find the function "main".
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Im on linux so i assume that you mean icc but here is the output. Yes is is compiling now but not running.
Intel(R) C Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 15.0.0.090 Build 20140723
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Eric,
In fact, in package 090 there is a problem with compiler in generation of C++ destructors in offload part. I have found a workaround in internal e-mailing. Add "-openmp" option to compilation command:
CXXFLAGS := -c -O2 -DUSE_MIC -qopt-report-phase:offload -openmp
in Makefile. I have just checked this workaround, it works. There's a small test to see if problem is still in compiler (below). Build and run it with commands:
$ icpc test.cpp
$ ./a.out
or, if it fails during link
$ icpc -openmp test.cpp
$ ./a.out
//------------------ #include <stdio.h> class TestObject { public: TestObject() { printf("Local object created!\n"); } ~TestObject() { printf("Local object destroyed!\n"); } }; #pragma offload_attribute(push, target(mic)) #include <stdio.h> class MicObject { public: MicObject() { printf("MIC object created!\n"); fflush(0); } ~MicObject() { printf("MIC object destroyed!\n"); fflush(0); } }; #pragma offload_attribute(pop) __declspec(target(mic)) MicObject* pMicObject = 0; template<class T> __declspec(target(mic)) void Create() { pMicObject = new T; } __declspec(target(mic)) void Create() { Create<MicObject>(); } __declspec(target(mic)) void Destroy() { delete pMicObject; } int main() { TestObject cpu_object; #pragma offload target(mic) Create(); #pragma offload target(mic) Destroy(); } //-----------------
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Yes this code compiles and works we are getting closer to what i want which is to offload IPP. But this fails to compile saying undefined reference to all things ipp. Do i need to upgrade to update 1? Will that fix the issue.
I tried to compile with this but it didn't help:
-c -O2 -DUSE_MIC -qopt-report-phase:offload -openmp -lippcore -lippi -lipps -lippvm -lpthread
#include <iostream> using namespace std; #pragma offload_attribute(push, target(mic)) #include <iostream> #include <omp.h> #include <ipp.h> #include <ipps.h> void ipp_mic(); #pragma offload_attribute(pop) __declspec(target(mic)) void ipp_mic(){ int thread_count; #pragma omp parallel { #pragma omp single thread_count = omp_get_num_threads(); } cout << "Thread count: " << thread_count << endl; Ipp32f* f = ippsMalloc_32f(100); ippsVectorRamp_32f(f,100,0,1); } int main() { #pragma offload target(mic) ipp_mic(); }
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Your example can be compiled and works with the following command line:
$ echo $IPPROOT
/opt/intel/composer_xe_2015.0.090/ipp
$ icc -I$IPPROOT/include -O2 -openmp test.cpp -qoffload-option,mic,link,"-L$IPPROOT/lib/mic -lipps -lippcore" -L$IPPROOT/lib/intel64 -lipps -lippcore
$ ./a.out
Thread count: 240
$
Looks like compiler needs both MIC libs and host CPU libs, probably to use CPU path as a fallback if MIC is not available.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you very much i got it working. Final code listed below. I was using a two step compile and link in QT here is the final commands:
icpc -c -fopenmp -qoffload-option,mic -O2 -falign-functions=16 -ansi-alias -fstrict-aliasing -w1 -Wall -Wcheck -wd1572,873,2259,2261 -fPIE -I/opt/Qt5.3.2/5.3/gcc_64/mkspecs/linux-icc-64 -I/home/eric-burke/Development/c++/Mic_IPP_Final -I. -o main.o /home/eric-burke/Development/c++/Mic_IPP_Final/main.cpp
icpc -fopenmp -Wl,-rpath,/opt/Qt5.3.2/5.3/gcc_64 -o Mic_IPP_Final main.o -qoffload-option,mic,link,-L/opt/intel/composer_xe_2015.0.090/ipp/lib/mic/\ -lipps\ -lippcore -L/opt/intel/composer_xe_2015.0.090/ipp/lib/intel64 -lipps -lippcore
#include <iostream> using namespace std; #pragma offload_attribute(push, target(mic)) #include <iostream> #include <omp.h> #include <ipp.h> #include <ipps.h> void ipp_mic(); #pragma offload_attribute(pop) __declspec(target(mic)) void ipp_mic(){ int thread_count; int nsize = 10000; Ipp32f* a = ippsMalloc_32f(nsize); Ipp32f* b = ippsMalloc_32f(nsize); Ipp32f* c = ippsMalloc_32f(nsize); ippsVectorRamp_32f(a,nsize,0,1); ippsVectorRamp_32f(b,nsize,0,1); double start = omp_get_wtime(); ippsMul_32f(a,b,c,nsize); double stop = omp_get_wtime(); cout << "Vector Call: " << stop - start<< endl; thread_count = omp_get_num_threads(); thread_count = omp_get_num_threads(); int nleng = nsize/thread_count; if(omp_get_thread_num()==thread_count); nleng = nsize - (nleng*thread_count); start = omp_get_wtime(); #pragma omp parallel { ippsMul_32f(a,b,c,nleng); } stop = omp_get_wtime(); cout << "Vector Call: " << stop - start<< endl; #pragma omp parallel { #pragma omp single thread_count = omp_get_num_threads(); } cout << "Thread count: " << thread_count << endl; cout<<c[nsize-1]<<endl; } int main() { #pragma offload target(mic) ipp_mic(); }
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page