Movatterモバイル変換


[0]ホーム

URL:


US7168069B1 - Dynamic generation of multimedia code for image processing - Google Patents

Dynamic generation of multimedia code for image processing
Download PDF

Info

Publication number
US7168069B1
US7168069B1US09/614,635US61463500AUS7168069B1US 7168069 B1US7168069 B1US 7168069B1US 61463500 AUS61463500 AUS 61463500AUS 7168069 B1US7168069 B1US 7168069B1
Authority
US
United States
Prior art keywords
abstract
routine
processor
multimedia
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime, expires
Application number
US09/614,635
Inventor
Ulrich Sigmund
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
STMicroelectronics lnc USA
Original Assignee
STMicroelectronics lnc USA
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by STMicroelectronics lnc USAfiledCriticalSTMicroelectronics lnc USA
Priority to US09/614,635priorityCriticalpatent/US7168069B1/en
Assigned to RAVISENT IP, INC.reassignmentRAVISENT IP, INC.ASSIGNMENT (NUNC PRO TUNC)Assignors: RAVISENT TECHNOLOGIES, INC.
Priority to EP01305958Aprioritypatent/EP1172727A3/en
Priority to JP2001212263Aprioritypatent/JP2002132513A/en
Assigned to RAVISENT IP, INC.reassignmentRAVISENT IP, INC.ASSIGNMENT OF ASSIGNORS INTEREST (SEE DOCUMENT FOR DETAILS).Assignors: SIGMUND, ULRICH, VIONA DEVELOPMENT GMBH & CO. KG
Assigned to STMICROELECTRONICS, INC.reassignmentSTMICROELECTRONICS, INC.ASSIGNMENT OF EQUAL AND UNDIVIDED ONE-HALF INTERESTAssignors: RAVISENT IP, INC.
Priority to US11/552,124prioritypatent/US8495597B2/en
Application grantedgrantedCritical
Publication of US7168069B1publicationCriticalpatent/US7168069B1/en
Adjusted expirationlegal-statusCritical
Expired - Lifetimelegal-statusCriticalCurrent

Links

Images

Classifications

Definitions

Landscapes

Abstract

A method and apparatus for processing multimedia instruction enhanced data by the use of an abstract routine generator and a translator. The abstract routine generator takes the multimedia instruction enhanced data and generates abstract routines to compile the multimedia instruction enhanced data. The output of the abstract generator is an abstract representation of the multimedia instruction enhanced data. The translator then takes the abstract representation and produces code for processing.

Description

BACKGROUND OF THE INVENTION
1. Field of the Invention
The invention relates to the processing of multimedia data with processors that feature multimedia instruction enhanced instruction sets. More particularly, the invention relates to a method and apparatus for generating processor instruction sequences for image processing routines that use multimedia enhanced instructions.
2. Description of the Prior Art
In general, most programs that use image processing routines with multimedia instructions do not use a general-purpose compiler for these parts of the program. These programs typically use assembly routines to process such data. A resulting problem is that the assembly routines must be added to the code manually. This step requires high technical skill, is time demanding, and is prone to introduce errors into the code.
In addition, different type of processors, (for example, Intel's Pentium I w/MMX and Pentium II, Pentium III, Willamette, AMD's K-6 and AMD's K-7 aka. Athlon) each use different multimedia command sets. Examples of different multimedia command sets are MMX, SSE and 3DNow. Applications that use these multimedia command sets must have separate assembly routines that are specifically written for each processor type.
At runtime, the applications select the proper assembly routines based on the processor detected. To reduce the workload and increase the robustness of the code, these assembly routines are sometimes generated by a routine specific source code generator during program development.
One problem with this type of programming is that the applications must have redundant assembly routines which can process the same multimedia data, but which are written for the different types of processors. However, only one assembly routine is actually used at runtime. Because there are many generations of processors in existence, the size of applications that use multimedia instructions must grow to be compatible with all of these processors. In addition, as new processors are developed, all new routines must be coded for these applications so that they are compatible with the new processors. An application that is released prior to the release of a processor is incompatible with the processor unless it is first patched/rebuilt with the new assembly routines.
It would be desirable to provide programs that use multimedia instructions which are smaller in size. It would be desirable to provide an approach that adapts such programs to future processors more easily
SUMMARY OF THE INVENTION
In accordance with the invention, a method and apparatus for generating assembly routines for multimedia instruction enhanced data is shown and described.
An example of multimedia data that can be processed by multimedia instructions are the pixel blocks used in image processing. Most image processing routines operate on rectangular blocks of evenly sized data pieces (e.g. 16×16 pixel blocks of 8 bit video during MPEG motion compensation). The image processing code is described as a set of source blocks, destination blocks and data manipulations. Each block has a start address, a pitch (distance in bytes between two consecutive lines) and a data format. The full processing code includes width and height as additional parameters. All of these parameters can either be integer constants or arguments to the generated routine. All data operations are described on SIMD data types. A SIMD data type is a basic data type (e.g. signed byte, signed word, or unsigned byte) and a number or repeats (e.g. 16 pixels for MPEG Macroblocks). The size of a block (source or destination) is always the size of its SIMD data type times its width in horizontal direction and the height in vertical direction.
In the presently preferred embodiment of the invention, an abstract image generator inside the application program produces an abstract routine representation of the code that operates on the multimedia data using SIMD operations. A directed acyclic graph is a typical example of a generic version. A translator then generates processor specific assembly code from the abstract respresentation.
BRIEF DESCRIPTION OF THE DRAWINGS
FIG. 1 is a block diagram of a computer system that may be used to implement a method and apparatus embodying the invention for translating a multimedia routine from its abstract representation generated by an abstract routine generator inside the application's startup code into executable code using the code generator.
DESCRIPTION OF THE PREFERRED EMBODIMENT
InFIG. 1 thestartup code11 of theapplication program13, further referred to as the abstract routine generator, generates anabstract representation15 of the multimedia routine represented by a data flow graph. This graph is then translated by thecode generator17 into a machine specific sequence ofinstructions19, typically including several SIMD multimedia instructions. The types of operations that can be present inside the data flow graph include add, sub, multiply, average, maximum, minimum, compare, and, or, xor, pack, unpack and merge operations. This list is not exhaustive as there are operations currently performed by MMX, SSE and 3DNow for example, which are not listed. If a specific command set does not support one of these operations, the CPU specific part of the code generator replaces it by a sequence of simpler instructions (e.g. the maximum instruction can be replaced by a pair of subtract and add instruction using saturation arithmetic).
The abstract routine generator generates an abstract representation of the code, commonly in the form of a directed acyclic graph during runtime. This allows the creation of multiple similar routines using a loop inside theimage processing code21 for linear arrays, or to generate routines on the fly depending on user interaction. E.g. the bi-directional MPEG 2 motion compensation can be implemented using a set of sixty-four different but very similar routines, that can be generated by a loop in the abstract image generator. Or an interactive paint program can generate filters or pens in the form of abstract representations based on user input, and can use the routine generator to create efficient code sequences to perform the filtering or drawing operation. Examples of the data types processed by the code sequences include: SIMD input data, image input data and audio input data.
Examples of information provided by the graphs include the source blocks, the target blocks, the change in the block, color, stride, change in stride, display block, and spatial filtering.
The accuracy of the operation inside the graphs can be tailored to meet the requirements of the program. The abstract routine generator can increase its precision by increasing the level of arithmetics per pixel. For example, 7-bit processing can be stepped up to 8-bit, or 8-bit to 16-bit. E.g. motion compensation routines with different types of rounding precision can be generated by the abstract routine generator.
The abstract representation, in this case thegraph15, is then sent to thetranslator17 where it is translated intooptimized assembly code19. The translator uses standard compiler techniques to translate the generic graph structure into a specific sequence of assembly instructions. As the description is very generic, there is no link to a specific processor architecture, and because it is very simple it can be processed without requiring complex compiler techniques. This enables the translation to be executed during program startup without causing a significant delay. Also, the abstract generator and the translator do not have to be programmed in assembly. The CPU specific translator may reside in a dynamic link library and can therefore be replaced if the system processor is changed. This enables programs to use the multimedia instructions of a new processor, without the need to be changed.
Tables A–C provide sample code that generates an abstract representation for a motion compensation code that can be translated to an executable code sequence using the invention.
TABLE A
#ifndef MPEG2MOTIONCOMPENSATION_H
#define MPEG2MOTIONCOMPENSATION_H
#include “driver\softwarecinemaster\common\prelude.h”
#include “..\..\BlockVideoProcessor\BVPXMMXCodeConverter.h”
//
// Basic block motion compensation functions
//
class MPEG2MotionCompensation
{
protected:
//
// Function prototype for a unidirectional motion compensation routine
//
typedef void (_stdcall * CompensationCodeType) (BYTE * source1Base, int sourceStride,
BYTE * targetBase, short * deltaBase, int deltaStride, int num);
//
// Function prototype for a bidirectional motion compensation routine
//
typedef void (_stdcall * BiCompensationCodeType) (BYTE * source1Base, BYTE * source2Base, int sourceStride,
BYTE * targetBase, short * deltaBase, int deltaStride, int num);
//
// Motion compensation routines for unidirectional prediction. Each routine
// handles one case. The indices are
// - y-uv: if it is luma data the index is 0 otherwise 1
// - delta: error correction data is present (eg. the block is not skipped)
// - halfy: half pel prediction is to be performed in vertical direction
// - halfx: half pel prediction is to be performed in horizontal direction
//
CompensationCodeTypecompensation[2] [2] [2] [2];// y-uv delta halfy halfx
BVPCodeBlock* compensationBlock[2] [2] [2] [2];
//
// Motion compensation routines for bidirectional prediction. Each routine
// handles one case. The indices contain the same parameters as in the
// unidirectional case, plus the half pel selectors for the second source
//
BiCompensationCodeTypebicompensation[2] [2] [2] [2] [2] [2];// y-uv delta half1y half1x half2y half2x
BVPCodeBlock* bicompensationBlock[2] [2] [2] [2] [2] [2];
public:
//
// Perform a unidirectional compensation
//
void MotionCompensation(BYTE * sourcep, int stride, BYTE * destp, short * deltap, int dstride, int num, bool uv, bool delta, int halfx,
int halfy)
{
compensation[uv] [delta] [halfy] [halfx] (sourcep, stride, destp, deltap, dstride, num);
}
//
// Perform bidirectional compensation
//
void BiMotionCompensation(BYTE * source1p, BYTE * source2p, int stride, BYTE * destp, short * deltap, int dstride, int num, bool uv,
bool delta, int half1x, int half1y, int half2x, int half2y)
{
bicompensation[uv] [delta] [half1y] [half1x] [half2y] [half2x] (source1p, source2p, stride, destp, deltap, dstride, num);
}
MPEG2MotionCompensation(void);
~MPEG2MotionCompensation(void);
};
#endif
TABLE B
#include “MPEG2MotionCompensation.h”
#include “. . \ . . \BlockVideoProcessor\BVPXMMXCodeConverter.h”
//
// Create the dataflow to fetch a data element from a source block,
// with or without half pel compensation in horizontal and/or
// vertical direction.
//
BVPDataSourceInstruction * BuildBlockMerge(BVPSourceBlock *
source1BlockA,
BVPSourceBlock * source1BlockB,
BVPSourceBlock * source1BlockC,
BVPSourceBlock * source1BlockD,
int halfx, int halfy)
{
if (halfy)
{
if (halfx)
{
//
// Half pel prediction in h and v direction, the graph part
looks like this
Figure US07168069-20070123-C00001
return new BVPDataOperation
(
BVPDO_AVG,
new BVPDataOperation
(
BVPDO_AVG,
new BVPDataLoad(source1BlockA),
new BVPDataLoad(source1BlockB)
),
new BVPDataOperation
(
BVPDO_AVG,
new BVPDataLoad(source1BlockC),
new BVPDataLoad(source1BlockD)
)
);
}
else
{
//
// Half pel prediction in vertical direction
Figure US07168069-20070123-C00002
return new BVPDataOperation
(
BVPDO_AVG,
new BVPDataLoad(source1BlockA),
new BVPDataLoad(source1BlockC)
);
}
}
else
{
if (halfx)
{
//
// Half pel prediction in horizontal direction
Figure US07168069-20070123-C00003
return new BVPDataOperation
(
BVPDO_AVG,
new BVPDataLoad(source1BlockA),
new BVPDataLoad(source1BlockB)
);
}
else
{
//
// Full pel prediction
//
// <−− (LOAD source1BlockA)
//
return new BVPDataLoad(source1BlockA);
}
}
}
MPEG2MotionCompensation::MPEG2MotionCompensation(void)
{
int yuv, delta, halfy, halfx, half1y, half1x, half2y, half2x;
BVPBlockProcessor * bvp;
BVPCodeBlock * code;
BVPArgument * source1Base;
BVPArgument * source2Base;
BVPArgument * sourceStride;
BVPArgument * targetBase;
BVPArgument * deltaBase;
BVPArgument * deltaStride;
BVPArgument * height;
BVPSourceBlock * source1BlockA;
BVPSourceBlock * source1BlockB;
BVPSourceBlock * source1BlockC;
BVPSourceBlock * source1BlockD;
BVPSourceBlock * source2BlockA;
BVPSourceBlock * source2BlockB;
BVPSourceBlock * source2BlockC;
BVPSourceBlock * source2BlockD;
BVPSourceBlock * deltaBlock;
BVPTargetBlock * targetBlock;
BVPDataSourceInstruction * postMC;
BVPDataSourceInstruction * postCorrect;
BVPDataSourceInstruction * deltaData;
//
// Build unidirectional motion compensation routines
//
for (yuv = 0; yuv<2; yuv++)
{
for(delta=0; delta<2; delta++)
{
for(halfy=0; halfy<2; halfy++)
{
for(halfx=0; halfx<2; halfx++)
{
bvp = new BVPBlockProcessor( );
bvp−>AddArgument(height= new BVPArgument(false));
bvp−>AddArgument(deltaStride= new BVPArgument(false));
bvp−>AddArgument(deltaBase= new BVPArgument(true));
bvp−>AddArqument(targetBase= new BVPArgument(true));
bvp−>AddArqument(sourceStride= new BVPArgument(false));
bvp−>AddArgument(source1Base= new BVPArgument(true));
//
// Width is always sixteen pixels, so one vector of sixteen
unsigned eight bit elements,
// height may vary, therefore it is an argument
//
bvp−>SetDimension(1, height);
//
// Four potential source blocks, B is one pel to the right,
C one down and D right and down
//
bvp−>AddSourceBlock(source1BlockA = new
BVPSourceBlock(source1Base,
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source1BlockB = new
BVPSourceBlock(BVPPointer(source1Base, 1 + yuv),
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source1BlockC = new
BVPSourceBlock(BVPPointer(source1Base, sourceStride, 1, 0),
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source1BlockD = new
BVPSourceBlock(BVPPointer(source1Base, sourceStride, 1, 1 + yuv),
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
//
// If we have error correction data, we need this source
block as well
//
if (delta)
bvp−>AddSourceBlock(deltaBlock = new
BVPSourceBlock(deltaBase, deltaStride, BVPDataFormat(BVPDT_S16, 16),
0x10000));
//
// The target block to write the data into
//
bvp−>AddTargetBlock(targetBlock = new
BVPTargetBlock(targetBase, sourceStride, BVPDataFormat(BVPDT_U8, 16),
0x10000));
//
// Load a source block base on the half pel settings
//
bvp−>AddInstruction(postMC = BuildBlockMerge(source1BlockA,
source1BlockB, source1BlockC, source1BlockD, halfx, halfy));
if (delta)
{
deltaData = new BVPDataLoad(deltaBlock);
if (yuv)
{
//
// It is chroma data and we have error correction data.
The u and v
// parts have to be interleaved, therefore we need the
merge instruction
Figure US07168069-20070123-C00004
bvp−>AddInstruction
(
postCorrect =
new BVPDataConvert
(
BVPDT_U8,
new BVPDataOperation
(
BVPDO_ADD,
new BVPDataConvert
(
BVPDT_S16,
postMC
),
new BVPDataMerge
(
BVPDM_ODDEVEN,
new BVPDataSplit
(
BVPDS_HEAD,
deltaData
),
new BVPDataSplit
(
BVPDS_TAIL,
deltaData
)
)
)
)
);
}
else
{
//
// It is luma data with error correction
Figure US07168069-20070123-C00005
bvp−>AddInstruction
(
postCorrect =
new BVPDataConvert
(
BVPDT_U8,
new BVPDataOperation
(
BVPDO_ADD,
new BVPDataConvert
(
BVPDT_S16,
postMC
),
deltaData
)
)
);
}
//
// Store into the target block
//
// (STORE targetBlock) <−− . . .
//
bvp−>AddInstruction
(
new BVPDataStore
(
targetBlock,
postCorrect
)
);
}
else
{
//
// No error correction data, so store motion result into
target block
//
// (STORE targetBlock) <−− . . .
//
bvp−>AddInstruction
(
new BVPDataStore
(
targetBlock,
postMC
)
);
}
BVPXMMXCodeConverter conv;
//
// Convert graph into machine language
//
compensationBlock[yuv] [delta] [halfy] [halfx] = code =
conv.Convert(bvp);
//
// Get function entry pointer
//
compensation[yuv] [delta] [halfy] [halfx] =
(CompensationCodeType) (code−>GetCodeAddress( ));
//
// delete graph
//
delete bvp;
}
}
}
}
//
// build motion compensation routines for bidirectional prediction
//
for(yuv = 0; yuv<2; yuv++)
{
for(delta=0; delta<2; delta++)
{
for(half1y=0; half1y<2; half1y++)
{
for(half1x=0; half1x<2; half1x++)
{
for(half2y=0; half2y<2; half2y++)
{
for(half2x=0; half2x<2; half2x++)
{
bvp = new BVPBlockProcessor( );
bvp−>AddArgument(height= new
BVPArgument(false));
bvp−>AddArgument(deltaStride= new
BVPArgument(false));
bvp−>AddArgument(deltaBase= new
BVPArgument(true));
bvp−>AddArgument(targetBase= new
BVPArgument(true));
bvp−>AddArgument(sourceStride= new
BVPArgument(false));
bvp−>AddArgument(source2Base= new
BVPArgument(true));
bvp−>AddArgument(source1Base= new
BVPArgument(true));
bvp−>SetDimension(1, height);
//
// We now have two source blocks, so we need eight
blocks for the half pel
// prediction
//
bvp−>AddSourceBlock(source1BlockA = new
BVPSourceBlock(source1Base,
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source1BlockB = new
BVPSourceBlock(BVPPointer(source1Base, 1 + yuv),
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source1BlockC = new
BVPSourceBlock(BVPPointer(source1Base, sourceStride, 1, 0),
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source1BlockD = new
BVPSourceBlock(BVPPointer(source1Base, sourceStride, 1, 1 + yuv),
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source2BlockA = new
BVPSourceBlock(source2Base,
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source2BlockB = new
BVPSourceBlock(BVPPointer(source2Base, 1 + yuv),
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source2BlockC = new
BVPSourceBlock(BVPPointer(source2Base, sourceStride, 1, 0),
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
bvp−>AddSourceBlock(source2BlockD = new
BVPSourceBlock(BVPPointer(source2Base, sourceStride, 1, 1 + yuv),
sourceStride, BVPDataFormat(BVPDT_U8, 16), 0x10000));
if (delta)
bvp−>AddSourceBlock(deltaBlock = new
BVPSourceBlock(deltaBase, deltaStride, BVPDataFormat(BVPDT_S16, 16),
0x10000));
bvp−>AddTargetBlock(targetBlock = new
BVPTargetBlock(targetBase, sourceStride, BVPDataFormat(BVPDT_U8, 16),
0x10000));
//
// Build bidirectional prediction from two
unidirectional predictions
Figure US07168069-20070123-C00006
bvp−>AddInstruction
(
postMC =
new BVPDataOperation
(
BVPDO_AVG,
BuildBlockMerge(source1BlockA, source1BlockB,
source1BlockC, source1BlockD, half1x, half1y),
BuildBlockMerge(source2BlockA, source2BlockB,
source2BlockC, source2BlockD, half2x, half2y)
)
);
//
// Apply error correction, see unidirectional case
//
if (delta)
{
deltaData = new BVPDataLoad(deltaBlock);
if (yuv)
{
bvp−>AddInstruction
(
postCorrect =
new BVPDataConvert
(
BVPDT_U8,
new BVPDataOperation
(
BVPDO_ADD,
new BVPDataConvert
(
BVPDT_S16,
postMC
),
new BVPDataMerge
(
BVPDM_ODDEVEN,
new BVPDataSplit
(
BVPDS_HEAD,
deltaData
),
new BVPDataSplit
(
BVPDS_TAIL,
deltaData
)
)
)
)
);
}
else
{
bvp−>AddInstruction
(
postCorrect =
new BVPDataConvert
(
BVPDT_U8,
new BVPDataOperation
(
BVPDO_ADD,
new BVPDataConvert
(
BVPDT_S16,
postMC
),
deltaData
)
)
);
}
bvp−>AddInstruction
(
new BVPDataStore
(
targetBlock,
postCorrect
)
);
}
else
{
bvp−>AddInstruction
(
new BVPDataStore
(
targetBlock,
postMC
)
);
}
BVPXMMXCodeConverter conv;
//
// Translate routines
//
bicompensationBlock[yuv] [delta] [half1y] [half1x] [half2y] [half2x] =
code = conv.Convert(bvp);
bicompensation[yuv] [delta] [half1y] [half1x] [half2y] [half2x] =
(BiCompensationCodeType) (code−>GetCodeAddress( ));
delete bvp;
}
}
}
}
}
}
}
MPEG2MotionCompensation::~MPEG2MotionCompensation(void)
{
int yuv, delta, halfy, halfx, half1y, half1x, half2y, half2x;
//
// free all motion compensation routines
//
for(yuv = 0; yuv<2; yuv++)
{
for(delta=0; delta<2; delta++)
{
for(halfy=0; halfy<2; halfy++)
{
for(halfx=0; halfx<2; halfx++)
{
delete compensationBlock[yuv] [delta] [halfy] [halfx];
}
}
}
}
for(yuv = 0; yuv<2; yuv++)
{
for(delta=0; delta<2; delta++)
{
for(half1y=0; half1y<2; half1y++)
{
for(half1x=0; half1x<2; half1x++)
{
for(half2y=0; half2y<2; half2y++)
{
for(half2x=0; half2x<2; half2x++)
{
delete
bicompensationBlock[yuv] [delta] [half1y] [half1x] [half2y] [half2x];
}
}
}
}
}
}
}
TABLE C
#ifndef BVPGENERIC_H
#define BVPGENERIC_H
#include “BVPList.h”
//
// Argument descriptor. An argument can be either a pointer or an integer used
// as a stride, offset or width/height value.
//
class BVPArgument
{
public:
boolpointer;
intindex;
BVPArgument(bool pointer_)
: pointer(pointer_), index(0) { }
};
//
// Description of an integer value used as a stride or offset. An integer value
// can be either an argument or a constant
//
class BVPInteger
{
public:
intvalue;
BVPArgument* arg;
BVPInteger(void)
: value(0), arg(NULL) { }
BVPInteger(int value_)
: value(value_), arg(NULL) { }
BVPInteger(unsigned value_)
: value((int)value_), arg(NULL) { }
BVPInteger(BVPArgument * arg_)
: value(0), arg(arg_) { }
bool operator== (BVPInteger i2)
{
return arg ? (i2.arg == arg) : (i2.value == value);
}
};
//
// Description of a memory pointer used as a base for source and target blocks.
// A pointer can be a combination of an pointer base, a constant offset and
// a variable index with scaling
//
class BVPPointer
{
public:
BVPArgument* base;
BVPArgument* index;
intoffset;
intscale;
BVPPointer(BVPArgument * base_)
: base(base_), index(NULL), offset(0), scale(0) { }
BVPPointer(BVPPointer base_, int offset_)
: base(base_.base), index(NULL), offset(offset_), scale(0) { }
BVPPointer(BVPPointer base_, BVPInteger index_, int scale_, int offset_)
: base(base_.base), index(index_.arg), offset(offset_), scale(scale_) { }
};
//
// Base data formats for scalar types
//
enum BVPBaseDataFormat
{
BVPDT_U8,// Unsigned 8 bits
BVPDT_U16,// Unsigned 16 bits
BVPDT_U32,// Unsigned 32 bits
BVPDT_S8,// Signed 8 bits
BVPDT_S16,// Signed 16 bits
BVPDT_S32// Signed 32 bits
};
//
// Data forma descriptor for scalar and vector (multimedia simd) types
// Each data type is a combination of a base type and a vector size.
// Scalar types are represented by a vector size of one.
//
class BVPDataFormat
{
public:
BVPBaseDataFormatformat;
intnum;
BVPDataFormat(BVPBaseDataFormat _format, int _num = 1)
: format(_format), num(_num) { }
BVPDataFormat(void)
: format(BVPDT_U8), num(0) { }
BVPDataFormat(BVPDataFormat & f)
: format(f.format), num(f.num) { }
BVPDataFormat operator* (int times)
{return BVPDataFormat(format, num * times);}
BVPDataFormat operator/ (int times)
{return BVPDataFormat(format, num / times);}
int BitsPerElement(void) {static const int sz[ ] = {8, 16, 32, 8, 16, 32}; return sz[format];}
int BitsPerChunk(void) {return BitsPerElement( ) * num;}
};
//
// Operation codes for binary data operations that have the
// same operand type for both sources and the destination
//
enum BVPDataOperationCode
{
BVPDO_ADD,// add with wraparound
BVPDO_ADD_SATURATED,// add with saturation
BVPDO_SUB,// subtract with wraparound
BVPDO_SUB_SATURATED,// subtract with saturation
BVPDO_MAX,// maximum
BVPDO_MIN,// minimum
BVPDO_AVG,// average (includes rounding towards nearest)
BVPDO_EQU,// equal
BVPDO_OR,// binary or
BVPDO_XOR,// binary exclusive or
BVPDO_AND,// binary and
BVPDO_ANDNOT,// binary and not
BVPDO_MULL,// multiply keep lower half
BVPDO_MULH// multiply keep upper half
};
//
// Operations that extract a part of a data element
//
enum BVPDataSplitCode
{
BVPDS_HEAD,// extract first half
BVPDS_TAIL,// extract second half
BVPDS_ODD,// extract odd elements
BVPDS_EVEN// extract even elements
};
//
// Operations that combine to data elements
//
enum BVPDataMergeCode
{
BVPDM_UPPERLOWER,// chain first and second operands
BVPDM_ODDEVEN// interleave first and second operands
};
//
// Node types in the data flow graph
//
enum BVPInstructionType
{
BVPIT_LOAD,// load an element from a source block
BVPIT_STORE,// store an element into a source block
BVPIT_CONSTANT,// load a constant value
BVPIT_SPLIT,// split an element
BVPIT_MERGE,// merge two elements
BVPIT_CONVERT,// perform a data conversion
BVPIT_OPERATION// simple binary data operation
};
//
// Descriptor of a data block. Contains a base pointer, a stride(pitch), a
// format and an incrementor in vertical direction. The vertical block position
// can be incremented by a fraction or a multiple of the given pitch.
//
class BVPBlock
{
public:
BVPPointerbase;
BVPIntegerpitch;
BVPDataFormatformat;
intyscale;
intindex;
BVPBlock(BVPPointer _base, BVPInteger _pitch, BVPDataFormat _format, int _yscale)
: base(_base), pitch(_pitch), format(_format), yscale(_yscale) { }
};
//
// Descriptor of a source block
//
class BVPSourceBlock : public BVPBlock
{
public:
BVPSourceBlock(BVPPointer base, BVPInteger pitch, BVPDataFormat format, int yscale)
: BVPBlock(base, pitch, format, yscale) { }
};
//
// Descriptor of a target block
//
class BVPTargetBlock : public BVPBlock
{
public:
BVPTargetBlock(BVPPointer base, BVPInteger pitch, BVPDataFormat format, int yscale)
: BVPBlock(base, pitch, format, yscale) { }
};
class BVPDataSource;
class BVPDataDrain;
class BVPDataInstruction;
//
// Source connection element of a node in the data flow graph. Each node in
// the graph contains one or none source connection. A source connection is
// the output of a node in the graph. Each source connection can be connected
// to any number of drain connections in other nodes of the flow graph. The
// source is the output side of a node.
//
class BVPDataSource
{
public:
BVPDataFormatformat;
BVPList<BVPDataDrain *>drain;
BVPDataSource(BVPDataFormat _format) : format(_format) { }
virtual void AddInstructions(BVPList<BVPDataInstruction *> & instructions) { }
virtual BVPDataInstruction * ToInstruction(void) {return NULL;}
};
//
// Drain connection element of a node in the data flow graph. Each node
// can have none, one or two drain connections (but only one drain object
// to represent both). Each drain connects to exactly one source on the
// target side. As eachnode can have only two inputs, each drain is connected
// (through the node) with two sources. The drain is the input side of a
// node.
//
class BVPDataDrain
{
public:
BVPDataSource* source1;
BVPDataSource* source2;
BVPDataDrain(BVPDataSource * source1_, BVPDataSource * source2_ = NULL)
: source1(source1_), source2(source2_) { }
virtual BVPDataInstruction * ToInstruction(void) {return NULL;}
};
//
// Each node in the graph represents one abstract instruction. It has an
// instruction type that describes the operation of the node.
//
class BVPDataInstruction
{
public:
BVPInstructionTypetype;
intindex;
BVPDataInstruction(BVPInstructionType type_)
: type(type_), index(−1) { }
virtual ~BVPDataInstruction(void) { }
virtual void AddInstructions(BVPList<BVPDataInstruction *> & instructions);
virtual void GetOperationBits(int & minBits, int & maxBits);
virtual BVPDataFormat GetInputFormat(void) = 0;
virtual BVPDataFormat GetOutputFormat(void) = 0;
virtual BVPDataSource * ToSource(void) {return NULL;}
virtual BVPDataDrain * ToDrain(void) {return NULL;}
};
//
// Node that is a data source
//
class BVPDataSourceInstruction : public BVPDataInstruction, public BVPDataSource
{
public:
BVPDataSourceInstruction(BVPInstructionType type_, BVPDataFormat format_)
: BVPDataInstruction(type_), BVPDataSource(format_) { }
void GetOperationBits(int & minBits, int & maxBits);
BVPDataFormat GetOutputFormat(void) {return format;}
BVPDataFormat GetInputFormat(void) {return format;}
BVPDataInstruction * ToInstruction(void) {return this;}
BVPDataSource * ToSource(void) {return this;}
};
//
// Node that is a data source and has one or two sources connected to its drain
//
class BVPDataSourceDrainInstruction : public BVPDataSourceInstruction, public BVPDataDrain
{
public:
BVPDataSourceDrainInstruction(BVPInstructionType type_, BVPDataFormat format_, BVPDataSource * source1_)
: BVPDataSourceInstruction(type_, format_), BVPDataDrain(source1_)
{source1—>drain.Insert(this);}
BVPDataSourceDrainInstruction(BVPInstructionType type_, BVPDataFormat format_, BVPDataSource * source1_,
BVPDataSource * source2_)
: BVPDataSourceInstruction(type_, format_), BVPDataDrain(source1_, source2_)
{source1—>drain.Insert(this);source2—>drain.Insert(this);}
};
//
// Instruction to load data from a source block
//
class BVPDataLoad : public BVPDataSourceInstruction
{
public:
BVPSourceBlock* block;
intoffset;
BVPDataLoad(BVPSourceBlock * block_, int offset_ = 0)
: BVPDataSourceInstruction(BVPIT_LOAD, block_—>format), block(block_), offset(offset_) { }
void AddInstructions(BVPList<BVPDataInstruction *> & instructions);
};
//
// Instruction to store data into a target block
//
class BVPDataStore : public BVPDataInstruction, public BVPDataDrain
{
public:
BVPTargetBlock* block;
BVPDataStore(BVPTargetBlock * block_, BVPDataSource * source)
: BVPDataInstruction(BVPIT_STORE), BVPDataDrain(source), block(block_)
{source—>drain.Insert(this);}
void AddInstructions(BVPList<BVPDataInstruction *> & instructions);
BVPDataFormat GetOutputFormat(void) {return source1—>format;}
BVPDataFormat GetInputFormat(void) {return source1—>format;}
BVPDataInstruction * ToInstruction(void) {return this;}
BVPDataDrain * ToDrain(void) {return this;}
};
//
// Instruction to load a constant
//
class BVPDataConstant : public BVPDataSourceInstruction
{
public:
int value;
BVPDataConstant(BVPDataFormat format, int value_)
: BVPDataSourceInstruction(BVPIT_CONSTANT, format), value(value_) { }
};
//
// Instruction to split a data element
//
class BVPDataSplit : public BVPDataSourceDrainInstruction
{
public:
BVPDataSplitCode code;
BVPDataSplit(BVPDataSplitCode code_, BVPDataSource * source)
: BVPDataSourceDrainInstruction(BVPIT_SPLIT, source—>format / 2, source), code(code_) { }
void AddInstructions(BVPList<BVPDataInstruction *> & instructions);
BVPDataDrain * ToDrain(void) {return this;}
BVPDataFormat GetInputFormat(void) {return source1—>format;}
};
//
// Instruction to merge two data elements
//
class BVPDataMerge : public BVPDataSourceDrainInstruction
{
public:
BVPDataMergeCode code;
BVPDataMerge(BVPDataMergeCode code_, BVPDataSource * source1_, BVPDataSource * source2_)
: BVPDataSourceDrainInstruction(BVPIT_MERGE, source1_—>format * 2, source1_, source2_), code(code_) { }
void AddInstructions(BVPList<BVPDataInstruction *> & instructions);
BVPDataDrain * ToDrain(void) {return this;}
BVPDataFormat GetInputFormat(void) {return source1—>format;}
};
//
// Instruction to convert the basic vector elements of an data element into
// a different format (eg. from signed 16 bit to unsigned 8 bits).
//
class BVPDataConvert : public BVPDataSourceDrainInstruction
{
public:
BVPDataConvert(BVPBaseDataFormat target, BVPDataSource * source)
: BVPDataSourceDrainInstruction(BVPIT_CONVERT, BVPDataFormat(target, source—>format.num), source) { }
void AddInstructions(BVPList<BVPDataInstruction *> & instructions);
BVPDataDrain * ToDrain(void) {return this;}
BVPDataFormat GetInputFormat(void) {return source1—>format;}
};
//
// Basic data manipulation operation from two sources to one drain.
//
class BVPDataOperation : public BVPDataSourceDrainInstruction
{
public:
BVPDataOperationCodecode;
BVPDataOperation(BVPDataOperationCode code_, BVPDataSource * source1_, BVPDataSource * source2_)
: BVPDataSourceDrainInstruction(BVPIT_OPERATION, source1_—>format, source1_, source2_), code(code_) { }
void AddInstructions(BVPList<BVPDataInstruction *> & instructions);
BVPDataDrain * ToDrain(void) {return this;}
};
//
// Descriptor for one image block processing routine. It contains the arguments, the
// size and the dataflow graph. On destruction of the block processor all argument,
// blocks and instructions are also deleted.
//
class BVPBlockProcessor
{
public:
BVPIntegerwidth;
BVPIntegerheight;
BVPList<BVPBlock *> blocks;
BVPList<BVPDataInstruction *> instructions;
BVPList<BVPArgument *> args;
BVPBlockProcessor(void)
{
}
~BVPBlockProcessor(void);
//
// Add an argument to the list of arguments. Please note that the arguments
// are added in the reverse order of the c-calling convention.
//
void AddArgument(BVPArgument * arg)
{
arg—>index = args.Num( );
args.Insert(arg);
}
//
// Set the dimension of the operation rectangle. The width and height can
// either be constants or arguments to the routine.
//
void SetDimension(BVPInteger width, BVPInteger height)
{
this—>width = width;
this—>height = height;
}
//
// Add a source block to the processing
//
void AddSourceBlock(BVPSourceBlock * block)
{
block—>index = blocks.Num( );
blocks.Insert(block);
}
//
// Add a target block to the processing
//
void AddTargetBlock(BVPTargetBlock * block)
{
block—>index = blocks.Num( );
blocks.Insert(block);
}
//
// Add an instruction to the dataflow graph. All referenced instructions
// will also be added to the graph if they are not yet part of it.
//
void AddInstruction(BVPDataInstruction * ins)
{
ins—>AddInstructions(instructions);
}
void GetOperationBits(int & minBits, int & maxBits);
};
#endif
Although the invention is described herein with reference to the preferred embodiment, one skilled in the art will readily appreciate that other applications may be substituted for those set forth herein without departing from the spirit and scope of the present invention. Accordingly, the invention should only be limited by the claims included below.

Claims (18)

10. A method for generating processor-specific multimedia routines dynamically, comprising:
providing a computer; and
an image processing program executing on said computer, said program including multimedia enhanced instructions for processing image data;
an abstract routine generator within said image processing program for receiving a data stream comprising an image-processing routine that includes multimedia enhanced instructions and for outputting a non-processor-specific abstract representation thereof at program startup; and
a translator within said image processing program for said abstract routine generator for receiving said abstract representation; and
outputting processor-specific final code translated from said non-processor-specific abstract representation for processing multimedia input data at program startup.
US09/614,6352000-07-122000-07-12Dynamic generation of multimedia code for image processingExpired - LifetimeUS7168069B1 (en)

Priority Applications (4)

Application NumberPriority DateFiling DateTitle
US09/614,635US7168069B1 (en)2000-07-122000-07-12Dynamic generation of multimedia code for image processing
EP01305958AEP1172727A3 (en)2000-07-122001-07-10On the fly generation of multimedia code for image processing
JP2001212263AJP2002132513A (en)2000-07-122001-07-12 On-the-fly generation of multimedia code for image processing
US11/552,124US8495597B2 (en)2000-07-122006-10-23On the fly generation of multimedia code for image processing

Applications Claiming Priority (1)

Application NumberPriority DateFiling DateTitle
US09/614,635US7168069B1 (en)2000-07-122000-07-12Dynamic generation of multimedia code for image processing

Related Child Applications (1)

Application NumberTitlePriority DateFiling Date
US11/552,124ContinuationUS8495597B2 (en)2000-07-122006-10-23On the fly generation of multimedia code for image processing

Publications (1)

Publication NumberPublication Date
US7168069B1true US7168069B1 (en)2007-01-23

Family

ID=24462105

Family Applications (2)

Application NumberTitlePriority DateFiling Date
US09/614,635Expired - LifetimeUS7168069B1 (en)2000-07-122000-07-12Dynamic generation of multimedia code for image processing
US11/552,124Expired - Fee RelatedUS8495597B2 (en)2000-07-122006-10-23On the fly generation of multimedia code for image processing

Family Applications After (1)

Application NumberTitlePriority DateFiling Date
US11/552,124Expired - Fee RelatedUS8495597B2 (en)2000-07-122006-10-23On the fly generation of multimedia code for image processing

Country Status (3)

CountryLink
US (2)US7168069B1 (en)
EP (1)EP1172727A3 (en)
JP (1)JP2002132513A (en)

Cited By (15)

* Cited by examiner, † Cited by third party
Publication numberPriority datePublication dateAssigneeTitle
US20050273769A1 (en)*2004-06-072005-12-08International Business Machines CorporationFramework for generating mixed-mode operations in loop-level simdization
US20050273770A1 (en)*2004-06-072005-12-08International Business Machines CorporationSystem and method for SIMD code generation for loops with mixed data lengths
US20050283775A1 (en)*2004-06-072005-12-22International Business Machines CorporationFramework for integrated intra- and inter-loop aggregation of contiguous memory accesses for SIMD vectorization
US20050283769A1 (en)*2004-06-072005-12-22International Business Machines CorporationSystem and method for efficient data reorganization to satisfy data alignment constraints
US20050283774A1 (en)*2004-06-072005-12-22International Business Machines CorporationSystem and method for SIMD code generation in the presence of optimized misaligned data reorganization
US20050283773A1 (en)*2004-06-072005-12-22International Business Machines CorporationFramework for efficient code generation using loop peeling for SIMD loop code with multiple misaligned statements
US20060248262A1 (en)*2005-04-292006-11-02Tay-Jyi LinMethod and corresponding apparatus for compiling high-level languages into specific processor architectures
US20090307656A1 (en)*2008-06-062009-12-10International Business Machines CorporationOptimized Scalar Promotion with Load and Splat SIMD Instructions
US7669191B1 (en)*2005-06-142010-02-23Xilinx, Inc.Compile-time dispatch of operations on type-safe heterogeneous containers
CN102446100A (en)*2010-12-142012-05-09微软公司Type and length abstraction for data types
US20130086570A1 (en)*2011-10-032013-04-04International Business Machines CorporationLinking code for an enhanced application binary interface (abi) with decode time instruction optimization
US8615746B2 (en)2011-10-032013-12-24International Business Machines CorporationCompiling code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8713547B2 (en)2011-10-032014-04-29International Business Machines CorporationGenerating compiled code that indicates register liveness
CN116506637A (en)*2019-03-082023-07-28知识产权之桥一号有限责任公司Image encoding device, image encoding method, image decoding device, and image decoding method
US20240427842A1 (en)*2020-06-022024-12-26Intel CorporationMatrix operation optimization mechanism

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication numberPriority datePublication dateAssigneeTitle
JP5605228B2 (en)*2011-01-072014-10-15富士ゼロックス株式会社 Image processing apparatus and program
WO2015134611A2 (en)*2014-03-042015-09-11Michael MantheyDistributed computing systems and methods

Citations (44)

* Cited by examiner, † Cited by third party
Publication numberPriority datePublication dateAssigneeTitle
US4667290A (en)*1984-09-101987-05-19501 Philon, Inc.Compilers using a universal intermediate language
US4951194A (en)1989-01-231990-08-21Tektronix, Inc.Method for reducing memory allocations and data copying operations during program calling sequences
US5307492A (en)*1991-03-071994-04-26Digital Equipment CorporationMapping assembly language argument list references in translating code for different machine architectures
WO1995035628A1 (en)1994-06-171995-12-28Snell & Wilcox LimitedVideo compression
EP0710027A2 (en)1994-10-261996-05-01General Instrument Corporation Of DelawareSyntax parser for a video decompression processor
EP0712249A2 (en)1994-11-081996-05-15General Instrument Corporation Of DelawarePixel interpolation filters for video decompression processor
EP0735467A2 (en)1995-03-291996-10-02Sun Microsystems, Inc.Compiler with generic front end and dynamically loadable back ends
EP0735769A2 (en)1995-03-271996-10-02International Business Machines CorporationHalf pel motion estimation method for B pictures
US5590331A (en)*1994-12-231996-12-31Sun Microsystems, Inc.Method and apparatus for generating platform-standard object files containing machine-independent code
US5696974A (en)*1991-09-301997-12-09International Business Machines CorporationMethods to support multimethod function overloading with compile-time type checking
US5703887A (en)1994-12-231997-12-30General Instrument Corporation Of DelawareSynchronization and error detection in a packetized data stream
US5708473A (en)1994-08-301998-01-13Hughes Aircraft CompanyTwo stage video film compression method and system
US5758075A (en)1994-07-291998-05-26International Business Machines CorporationMultimedia communication apparatus and methods
US5778180A (en)1995-11-061998-07-07Sun Microsystems, Inc.Mechanism for reducing data copying overhead in protected memory operating systems
WO1998043167A1 (en)1997-03-211998-10-01Canal+ Societe AnonymeComputer memory organization
US5819088A (en)*1993-03-251998-10-06Intel CorporationMethod and apparatus for scheduling instructions for execution on a multi-issue architecture computer
US5835773A (en)*1996-04-171998-11-10Hewlett-Packard, Co.Method for achieving native performance across a set of incompatible architectures using a single binary file
US5850258A (en)1995-03-211998-12-15Samsung Electronics Co., Ltd.High level video decoding apparatus capable of decoding video data of a plurality of channels coded at a lower level
US5854927A (en)*1994-09-301998-12-29U.S. Philips CorporationMultimedia system receptive for presentation of mass data comprising an application program inclusive of a multiplatform interpreter, and a platform subsystem arranged for interaction with said multiplatform interpreter and mass memory for use with such s
US5875442A (en)1992-08-031999-02-23International Business Machines CorporationMethod and apparatus for enhancing access to a remote database employing dynamic buffer management
WO1999010811A1 (en)1997-08-221999-03-04Koninklijke Philips Electronics N.V.Data processor with localised memory reclamation
EP0903944A2 (en)1993-03-011999-03-24Sony CorporationApparatus for preventing rounding errors when transform coefficients representing a motion picture signal are inversely transformed
EP0914009A2 (en)1997-10-301999-05-06Matsushita Electric Industrial Co., Ltd.Method and apparatus for start code detection in a compressed bitstream
US5938734A (en)1995-09-121999-08-17Kabushiki Kaisha ToshibaReal time stream server for handling a plurality of real time stream data with different data rates
EP0948214A2 (en)1998-04-031999-10-06Nds LimitedMethod and apparatus for detecting a start code in a bitstream
US5966534A (en)1997-06-271999-10-12Cooke; Laurence H.Method for compiling high level programming languages into an integrated processor with reconfigurable logic
US6049668A (en)*1998-04-132000-04-11Intel CorporationMethod and apparatus for supporting multiple processor-specific code segments in a single executable
JP2000112849A (en)1998-10-082000-04-21Hitachi Ltd Header attachment method for communication packets
US6058143A (en)1998-02-202000-05-02Thomson Licensing S.A.Motion vector extrapolation for transcoding video sequences
US6061770A (en)1997-11-042000-05-09Adaptec, Inc.System and method for real-time data backup using snapshot copying with selective compaction of backup data
US6081883A (en)1997-12-052000-06-27Auspex Systems, IncorporatedProcessing system with dynamically allocatable buffer memory
US6081846A (en)1997-05-082000-06-27Microsoft CorporationMethod and computer program product for reducing intra-system data copying during network packet processing
US6170075B1 (en)1997-12-182001-01-023Com CorporationData and real-time media communication over a lossy network
US6226769B1 (en)1997-12-122001-05-013Com CorporationForward error correction system for packet based real time media
US6247071B1 (en)1999-10-042001-06-12B2C2, Inc.System for receiving an isochronous data stream at a computer using a main memory buffer
US6269484B1 (en)1997-06-242001-07-31Ati TechnologiesMethod and apparatus for de-interlacing interlaced content using motion vectors in compressed video streams
US6282243B1 (en)1997-06-112001-08-28Fujitsu LimitedApparatus and method for interframe predictive video coding and decoding with capabilities to avoid rounding error accumulation
US6285713B1 (en)1994-08-182001-09-04Hitachi, LtdVideo coding/decoding system and video coder and video decoder used for the same system
US6295376B1 (en)1997-06-092001-09-25Hitachi, Ltd.Image sequence coding method and decoding method
US6357039B1 (en)*1998-03-032002-03-12Twelve Tone Systems, IncAutomatic code generation
US6473897B1 (en)*1998-04-132002-10-29Intel CorporationMethod and apparatus for generating multiple processor-specific code segments in a single executable
US6490673B1 (en)*1998-11-272002-12-03Matsushita Electric Industrial Co., LtdProcessor, compiling apparatus, and compile program recorded on a recording medium
US6493467B1 (en)*1959-12-122002-12-10Sony CorporationImage processor, data processor, and their methods
US6502115B2 (en)*1998-04-302002-12-31Intel CorporationConversion between packed floating point data and packed 32-bit integer data in different architectural registers

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication numberPriority datePublication dateAssigneeTitle
US5598560A (en)*1991-03-071997-01-28Digital Equipment CorporationTracking condition codes in translation code for different machine architectures
US6091897A (en)*1996-01-292000-07-18Digital Equipment CorporationFast translation and execution of a computer program on a non-native architecture by use of background translator
US6578197B1 (en)*1998-04-082003-06-10Silicon Graphics, Inc.System and method for high-speed execution of graphics application programs including shading language instructions
US6096095A (en)*1998-06-042000-08-01Microsoft CorporationProducing persistent representations of complex data structures

Patent Citations (44)

* Cited by examiner, † Cited by third party
Publication numberPriority datePublication dateAssigneeTitle
US6493467B1 (en)*1959-12-122002-12-10Sony CorporationImage processor, data processor, and their methods
US4667290A (en)*1984-09-101987-05-19501 Philon, Inc.Compilers using a universal intermediate language
US4951194A (en)1989-01-231990-08-21Tektronix, Inc.Method for reducing memory allocations and data copying operations during program calling sequences
US5307492A (en)*1991-03-071994-04-26Digital Equipment CorporationMapping assembly language argument list references in translating code for different machine architectures
US5696974A (en)*1991-09-301997-12-09International Business Machines CorporationMethods to support multimethod function overloading with compile-time type checking
US5875442A (en)1992-08-031999-02-23International Business Machines CorporationMethod and apparatus for enhancing access to a remote database employing dynamic buffer management
EP0903944A2 (en)1993-03-011999-03-24Sony CorporationApparatus for preventing rounding errors when transform coefficients representing a motion picture signal are inversely transformed
US5819088A (en)*1993-03-251998-10-06Intel CorporationMethod and apparatus for scheduling instructions for execution on a multi-issue architecture computer
WO1995035628A1 (en)1994-06-171995-12-28Snell & Wilcox LimitedVideo compression
US5758075A (en)1994-07-291998-05-26International Business Machines CorporationMultimedia communication apparatus and methods
US6285713B1 (en)1994-08-182001-09-04Hitachi, LtdVideo coding/decoding system and video coder and video decoder used for the same system
US5708473A (en)1994-08-301998-01-13Hughes Aircraft CompanyTwo stage video film compression method and system
US5854927A (en)*1994-09-301998-12-29U.S. Philips CorporationMultimedia system receptive for presentation of mass data comprising an application program inclusive of a multiplatform interpreter, and a platform subsystem arranged for interaction with said multiplatform interpreter and mass memory for use with such s
EP0710027A2 (en)1994-10-261996-05-01General Instrument Corporation Of DelawareSyntax parser for a video decompression processor
EP0712249A2 (en)1994-11-081996-05-15General Instrument Corporation Of DelawarePixel interpolation filters for video decompression processor
US5703887A (en)1994-12-231997-12-30General Instrument Corporation Of DelawareSynchronization and error detection in a packetized data stream
US5590331A (en)*1994-12-231996-12-31Sun Microsystems, Inc.Method and apparatus for generating platform-standard object files containing machine-independent code
US5850258A (en)1995-03-211998-12-15Samsung Electronics Co., Ltd.High level video decoding apparatus capable of decoding video data of a plurality of channels coded at a lower level
EP0735769A2 (en)1995-03-271996-10-02International Business Machines CorporationHalf pel motion estimation method for B pictures
EP0735467A2 (en)1995-03-291996-10-02Sun Microsystems, Inc.Compiler with generic front end and dynamically loadable back ends
US5938734A (en)1995-09-121999-08-17Kabushiki Kaisha ToshibaReal time stream server for handling a plurality of real time stream data with different data rates
US5778180A (en)1995-11-061998-07-07Sun Microsystems, Inc.Mechanism for reducing data copying overhead in protected memory operating systems
US5835773A (en)*1996-04-171998-11-10Hewlett-Packard, Co.Method for achieving native performance across a set of incompatible architectures using a single binary file
WO1998043167A1 (en)1997-03-211998-10-01Canal+ Societe AnonymeComputer memory organization
US6081846A (en)1997-05-082000-06-27Microsoft CorporationMethod and computer program product for reducing intra-system data copying during network packet processing
US6295376B1 (en)1997-06-092001-09-25Hitachi, Ltd.Image sequence coding method and decoding method
US6282243B1 (en)1997-06-112001-08-28Fujitsu LimitedApparatus and method for interframe predictive video coding and decoding with capabilities to avoid rounding error accumulation
US6269484B1 (en)1997-06-242001-07-31Ati TechnologiesMethod and apparatus for de-interlacing interlaced content using motion vectors in compressed video streams
US5966534A (en)1997-06-271999-10-12Cooke; Laurence H.Method for compiling high level programming languages into an integrated processor with reconfigurable logic
WO1999010811A1 (en)1997-08-221999-03-04Koninklijke Philips Electronics N.V.Data processor with localised memory reclamation
EP0914009A2 (en)1997-10-301999-05-06Matsushita Electric Industrial Co., Ltd.Method and apparatus for start code detection in a compressed bitstream
US6061770A (en)1997-11-042000-05-09Adaptec, Inc.System and method for real-time data backup using snapshot copying with selective compaction of backup data
US6081883A (en)1997-12-052000-06-27Auspex Systems, IncorporatedProcessing system with dynamically allocatable buffer memory
US6226769B1 (en)1997-12-122001-05-013Com CorporationForward error correction system for packet based real time media
US6170075B1 (en)1997-12-182001-01-023Com CorporationData and real-time media communication over a lossy network
US6058143A (en)1998-02-202000-05-02Thomson Licensing S.A.Motion vector extrapolation for transcoding video sequences
US6357039B1 (en)*1998-03-032002-03-12Twelve Tone Systems, IncAutomatic code generation
EP0948214A2 (en)1998-04-031999-10-06Nds LimitedMethod and apparatus for detecting a start code in a bitstream
US6049668A (en)*1998-04-132000-04-11Intel CorporationMethod and apparatus for supporting multiple processor-specific code segments in a single executable
US6473897B1 (en)*1998-04-132002-10-29Intel CorporationMethod and apparatus for generating multiple processor-specific code segments in a single executable
US6502115B2 (en)*1998-04-302002-12-31Intel CorporationConversion between packed floating point data and packed 32-bit integer data in different architectural registers
JP2000112849A (en)1998-10-082000-04-21Hitachi Ltd Header attachment method for communication packets
US6490673B1 (en)*1998-11-272002-12-03Matsushita Electric Industrial Co., LtdProcessor, compiling apparatus, and compile program recorded on a recording medium
US6247071B1 (en)1999-10-042001-06-12B2C2, Inc.System for receiving an isochronous data stream at a computer using a main memory buffer

Non-Patent Citations (11)

* Cited by examiner, † Cited by third party
Title
"Dictionary of Computing", Fourth Edition; Oxford University Press, 1996; pp. 149.*
"Exploiting SIMD Parallelism in DSP and Multimedia Algorithms Usins the AltiVec Technology", Nguyen, Huy and John, Lizy Kurian, 1999, ACM Press, Proceedings of the 13th international conference on Supercomputing, pp. 11-20.*
"Macro-based Hardware Compilation of Java<TM> bytecodes Into a Dynamic Reconfigurable Computing System"; Filed-Programmable Custom Computing Machines 1999. Proceedings; Napa Valley Apr. 1999.
"Pipeline Vectorization for Reconfigurable Systems"; Field-Programmable Custom Computing Machines 1999, FCCM '99, Proceedings; 7th Annual IEEE Symposium on Napa Valley, CA Apr. 1999.
"The Long and Winding Road to High-Performance Image Processing with MMX/SSE"; Computer Architectures for Mahcine Perception, 2000. Proceedings. Fifth IEEE International Workshop on Padova, Italy; Sep. 2000.
Aho et al.; "Compilers: Priciples, Techniques, and Tools"; 1986; Addison Wesley Longman; pp. 1-24.*
Eddy De Greef, Francky Catthoor, Hugo De Man; Memory Size Reduction Through Storage Order Optimization for Embedded Parallel Multimedia Applications; Catholic University, Lewen, Belgium; Oct. 1996.
Foley et al., "Computer Graphics: Principles and Practice" 1987, Cornell University.
Munich Meeting of MPEG-4 Working Group; Report ISO/IEC JTC1/SC29/WG11 MPEG4/N1172; International Organization for Standardization - Organisation Internationale de Normalisation, 1996; pp. 3-49.
R. J. Clark; Providing Scalable Web Service Using Multicast Delivery; Georgia Institute of Technology, Atlanta, GA; 1995.
Woo Hyong Lee, J. Morris Chang, and Yusuf Hasan; Evaluation of a High-Performance Object Reuse Dynamic Memory Alloation Policy for C++ Programs; Illinois Institute of Technology, Chicago, IL; 2000.

Cited By (41)

* Cited by examiner, † Cited by third party
Publication numberPriority datePublication dateAssigneeTitle
US8171464B2 (en)2004-06-072012-05-01International Business Machines CorporationEfficient code generation using loop peeling for SIMD loop code with multile misaligned statements
US7478377B2 (en)*2004-06-072009-01-13International Business Machines CorporationSIMD code generation in the presence of optimized misaligned data reorganization
US20050283775A1 (en)*2004-06-072005-12-22International Business Machines CorporationFramework for integrated intra- and inter-loop aggregation of contiguous memory accesses for SIMD vectorization
US20050283769A1 (en)*2004-06-072005-12-22International Business Machines CorporationSystem and method for efficient data reorganization to satisfy data alignment constraints
US20050283774A1 (en)*2004-06-072005-12-22International Business Machines CorporationSystem and method for SIMD code generation in the presence of optimized misaligned data reorganization
US20050283773A1 (en)*2004-06-072005-12-22International Business Machines CorporationFramework for efficient code generation using loop peeling for SIMD loop code with multiple misaligned statements
US8245208B2 (en)2004-06-072012-08-14International Business Machines CorporationSIMD code generation for loops with mixed data lengths
US20080010634A1 (en)*2004-06-072008-01-10Eichenberger Alexandre EFramework for Integrated Intra- and Inter-Loop Aggregation of Contiguous Memory Accesses for SIMD Vectorization
US7367026B2 (en)2004-06-072008-04-29International Business Machines CorporationFramework for integrated intra- and inter-loop aggregation of contiguous memory accesses for SIMD vectorization
US7386842B2 (en)2004-06-072008-06-10International Business Machines CorporationEfficient data reorganization to satisfy data alignment constraints
US7395531B2 (en)2004-06-072008-07-01International Business Machines CorporationFramework for efficient code generation using loop peeling for SIMD loop code with multiple misaligned statements
US20080201699A1 (en)*2004-06-072008-08-21Eichenberger Alexandre EEfficient Data Reorganization to Satisfy Data Alignment Constraints
US7475392B2 (en)2004-06-072009-01-06International Business Machines CorporationSIMD code generation for loops with mixed data lengths
US8549501B2 (en)2004-06-072013-10-01International Business Machines CorporationFramework for generating mixed-mode operations in loop-level simdization
US20090144529A1 (en)*2004-06-072009-06-04International Business Machines CorporationSIMD Code Generation For Loops With Mixed Data Lengths
US20050273769A1 (en)*2004-06-072005-12-08International Business Machines CorporationFramework for generating mixed-mode operations in loop-level simdization
US8196124B2 (en)2004-06-072012-06-05International Business Machines CorporationSIMD code generation in the presence of optimized misaligned data reorganization
US20050273770A1 (en)*2004-06-072005-12-08International Business Machines CorporationSystem and method for SIMD code generation for loops with mixed data lengths
US8056069B2 (en)*2004-06-072011-11-08International Business Machines CorporationFramework for integrated intra- and inter-loop aggregation of contiguous memory accesses for SIMD vectorization
US8146067B2 (en)2004-06-072012-03-27International Business Machines CorporationEfficient data reorganization to satisfy data alignment constraints
US7877741B2 (en)*2005-04-292011-01-25Industrial Technology Research InstituteMethod and corresponding apparatus for compiling high-level languages into specific processor architectures
US20060248262A1 (en)*2005-04-292006-11-02Tay-Jyi LinMethod and corresponding apparatus for compiling high-level languages into specific processor architectures
US7669191B1 (en)*2005-06-142010-02-23Xilinx, Inc.Compile-time dispatch of operations on type-safe heterogeneous containers
US20090307656A1 (en)*2008-06-062009-12-10International Business Machines CorporationOptimized Scalar Promotion with Load and Splat SIMD Instructions
US8572586B2 (en)*2008-06-062013-10-29International Business Machines CorporationOptimized scalar promotion with load and splat SIMD instructions
US8255884B2 (en)*2008-06-062012-08-28International Business Machines CorporationOptimized scalar promotion with load and splat SIMD instructions
US20120290816A1 (en)*2008-06-062012-11-15International Business Machines CorporationOptimized Scalar Promotion with Load and Splat SIMD Instructions
CN102446100A (en)*2010-12-142012-05-09微软公司Type and length abstraction for data types
US8959501B2 (en)*2010-12-142015-02-17Microsoft CorporationType and length abstraction for data types
CN102446100B (en)*2010-12-142016-04-06微软技术许可有限责任公司For the type of data type and the abstract system and method for length
US20120151188A1 (en)*2010-12-142012-06-14Microsoft CorporationType and length abstraction for data types
US8607211B2 (en)*2011-10-032013-12-10International Business Machines CorporationLinking code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8612959B2 (en)*2011-10-032013-12-17International Business Machines CorporationLinking code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8615746B2 (en)2011-10-032013-12-24International Business Machines CorporationCompiling code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8615745B2 (en)2011-10-032013-12-24International Business Machines CorporationCompiling code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8713547B2 (en)2011-10-032014-04-29International Business Machines CorporationGenerating compiled code that indicates register liveness
US8756591B2 (en)2011-10-032014-06-17International Business Machines CorporationGenerating compiled code that indicates register liveness
US20130086338A1 (en)*2011-10-032013-04-04International Business Machines CorporationLinking code for an enhanced application binary interface (abi) with decode time instruction optimization
US20130086570A1 (en)*2011-10-032013-04-04International Business Machines CorporationLinking code for an enhanced application binary interface (abi) with decode time instruction optimization
CN116506637A (en)*2019-03-082023-07-28知识产权之桥一号有限责任公司Image encoding device, image encoding method, image decoding device, and image decoding method
US20240427842A1 (en)*2020-06-022024-12-26Intel CorporationMatrix operation optimization mechanism

Also Published As

Publication numberPublication date
EP1172727A2 (en)2002-01-16
US8495597B2 (en)2013-07-23
JP2002132513A (en)2002-05-10
US20070074183A1 (en)2007-03-29
EP1172727A3 (en)2005-11-09

Similar Documents

PublicationPublication DateTitle
US20070074183A1 (en)On the fly generation of multimedia code for image processing
US10747519B2 (en)Language, function library, and compiler for graphical and non-graphical computation on a graphical processor unit
US7281117B2 (en)Processor executing SIMD instructions
US10831477B2 (en)In-lane vector shuffle instructions
US20040006667A1 (en)Apparatus and method for implementing adjacent, non-unit stride memory access patterns utilizing SIMD instructions
US9626168B2 (en)Compiler optimizations for vector instructions
US9092228B2 (en)Systems and methods for software instruction translation from a high-level language to a specialized instruction set
US7509634B2 (en)SIMD instruction sequence generating program, SIMD instruction sequence generating method and apparatus
US7010177B1 (en)Portability of digital images
JP3869947B2 (en) Parallel processing processor and parallel processing method
US10642586B2 (en)Compiler optimizations for vector operations that are reformatting-resistant
US20040001066A1 (en)Apparatus and method for vectorization of detected saturation and clipping operations in serial code loops of a source program
US20040025151A1 (en)Method for improving instruction selection efficiency in a DSP/RISC compiler
Bulić et al.An extended ANSI C for processors with a multimedia extension
US20090199166A1 (en)Program converting device
Lee et al.MPEG-2 video decoding on programmable processors: computational and architectural requirements
Bulić et al.On the use of the MMC language to utilize SIMD instruction set
Hurbain et al.An empirical study of some x86 simd integer extensions

Legal Events

DateCodeTitleDescription
ASAssignment

Owner name:RAVISENT IP, INC., PENNSYLVANIA

Free format text:ASSIGNMENT (NUNC PRO TUNC);ASSIGNOR:RAVISENT TECHNOLOGIES, INC.;REEL/FRAME:011595/0289

Effective date:20010228

ASAssignment

Owner name:RAVISENT IP, INC., PENNSYLVANIA

Free format text:ASSIGNMENT OF ASSIGNORS INTEREST;ASSIGNORS:SIGMUND, ULRICH;VIONA DEVELOPMENT GMBH & CO. KG;REEL/FRAME:012117/0165

Effective date:20000630

ASAssignment

Owner name:STMICROELECTRONICS, INC., TEXAS

Free format text:ASSIGNMENT OF EQUAL AND UNDIVIDED ONE-HALF INTEREST;ASSIGNOR:RAVISENT IP, INC.;REEL/FRAME:012143/0797

Effective date:20010621

STCFInformation on status: patent grant

Free format text:PATENTED CASE

FEPPFee payment procedure

Free format text:PAYOR NUMBER ASSIGNED (ORIGINAL EVENT CODE: ASPN); ENTITY STATUS OF PATENT OWNER: LARGE ENTITY

FPAYFee payment

Year of fee payment:4

FPAYFee payment

Year of fee payment:8

MAFPMaintenance fee payment

Free format text:PAYMENT OF MAINTENANCE FEE, 12TH YEAR, LARGE ENTITY (ORIGINAL EVENT CODE: M1553)

Year of fee payment:12


[8]ページ先頭

©2009-2025 Movatter.jp