Reputation: 622
I'm now studying Vertorization performance testing but I meet follwing errors
1>ConsoleApplication2.obj : error LNK2001: unresolved external symbol "private: static union _LARGE_INTEGER Timer::m_freq" (?m_freq@Timer@@0T_LARGE_INTEGER@@A) 1>ConsoleApplication2.obj : error LNK2001: unresolved external symbol "private: static __int64 Timer::m_overhead" (?m_overhead@Timer@@0_JA) 1>c:\users\lara feodorovna\documents\visual studio 2012\Projects\ConsoleApplication2\Debug\ConsoleApplication2.exe : fatal error LNK1120: 2 unresolved externals
---------------timer.h (I manualy added it)---------------
#pragma once
#include <windows.h>
struct Timer
{
void Start()
{
QueryPerformanceCounter(&m_start);
}
void Stop()
{
QueryPerformanceCounter(&m_stop);
}
// Returns elapsed time in milliseconds (ms)
double Elapsed()
{
return (m_stop.QuadPart - m_start.QuadPart - m_overhead) \
* 1000.0 / m_freq.QuadPart;
}
private:
// Returns the overhead of the timer in ticks
static LONGLONG GetOverhead()
{
Timer t;
t.Start();
t.Stop();
return t.m_stop.QuadPart - t.m_start.QuadPart;
}
LARGE_INTEGER m_start;
LARGE_INTEGER m_stop;
static LARGE_INTEGER m_freq;
static LONGLONG m_overhead;
};
---------------------ConsolApplication2.cpp-----------------------
#include "stdafx.h"
#include "timer.h"
const int MAXNUM = 100000;
int a[MAXNUM];
int b[MAXNUM];
int c[MAXNUM];
int _tmain(int argc, _TCHAR* argv[])
{
Timer timer;
double time_NoVector;
double time_Vector;
//No Vectorization
timer.Start();
#pragma loop(no_vector)
for (int j=0; j<MAXNUM; j++)
{
c[j]=a[j]+b[j];
}
timer.Stop();
time_NoVector=timer.Elapsed();
//Vectorization
timer.Start();
for(int j=0; j <MAXNUM; j++)
{
c[j] = a[j] + b[j];
}
timer.Stop();
time_Vector=timer.Elapsed();
printf("---------------------------------------------\n");
printf("%-14s %10s %10s\n", "Version", "Times(s)", "Speedup");
printf("---------------------------------------------\n");
printf("%-14s %10.4f %10.4f\n", "NoVector", time_NoVector, 1.0);
printf("%-14s %10.4f %10.4f\n\n", "Vector", time_Vector, time_NoVector / time_Vector);
return 0;
}
please help me
Upvotes: 0
Views: 3685
Reputation: 3475
In layman's terms for those learning on the subject let me put it this way. You declared m_freq and m_overhead as static, which means somewhere in a implementation file (.cpp) that includes the timer.h
, you need to define the values of these members as @billz mentioned. The translation unit that @Pierre Fourgeaud mentions consists of a cpp file and the headers it includes. An example initialization would be
In main.cpp:
...
int b[MAXNUM];
int c[MAXNUM];
LARGE_INTEGER m_freq = {0}; // Define them outside of all functions
LONGLONG m_overhead = {0};
int _tmain(int argc, _TCHAR* argv[])
{
...
return 0;
}
This would get you pass the two errors you're seeing.
Upvotes: 0
Reputation: 14530
When you have static
members in a class
, you have to define it in a translation unit.
In your header:
struct Timer
{
// ...
// Declaration of your static members
static LARGE_INTEGER m_freq;
static LONGLONG m_overhead;
};
In a .cpp:
// Definitions
LARGE_INTEGER Timer::m_freq;
LONGLONG Timer::m_overhead;
It is to respect the One Definition Rule.
Upvotes: 2
Reputation: 45450
struct Timer
{
.....
static LARGE_INTEGER m_freq; // This only declares a static member not definition
static LONGLONG m_overhead;
};
You need to define below static members of Timer
in .cpp file:
LARGE_INTEGER Timer::m_freq;
LONGLONG Timer::m_overhead;
Upvotes: 1