static CALimage createCALImage(const char* src, CALtarget target)
{
    CALobject obj;
    CALresult rc;
    CALimage img;

    if (!src)
        return NULL;

    obj = createCALBinary(src, target);
    if (!obj)
        return NULL;

    rc = calclLink(&img, &obj, 1);
    calclFreeObject(obj);
    if (rc != CAL_RESULT_OK)
    {
        warn("Error linking image (%d) : %s\n", rc, calclGetErrorString());
        return NULL;
    }

    return img;
}
示例#2
0
A5IlPair::A5IlPair(A5Il* cont, int dev, int dp, int rounds,A5JobQueue* q) :
    mNumRounds(rounds),
    mController(cont),
    mState(0),
    mDp(dp),
    mWaitState(false),
    mTicks(0),
    mAttention(0),
    mFreeRound(0),
    mSingleMode(false),
    mJobQueue(q)
{
    mDevNo = dev;
    mMaxCycles = 327650;

    // CAL setup
    assert((dev>=0)&&(dev<CalDevice::getNumDevices()));
    mDev = CalDevice::createDevice(dev);
    assert(mDev);
    mNum = mDev->getDeviceAttribs()->wavefrontSize *
        mDev->getDeviceAttribs()->numberOfSIMD;

    printf("Num threads %i\n", mNum );

    mResState = mDev->resAllocLocal1D(4*mNum, CAL_FORMAT_UINT_4, 
                                      CAL_RESALLOC_CACHEABLE|
                                      CAL_RESALLOC_GLOBAL_BUFFER);
    mResRoundFunc = mDev->resAllocLocal1D(MAX_RFTABLE_ENTRIES,
                                          CAL_FORMAT_UINT_2, 0);
    mResAttention = mDev->resAllocLocal1D(mNum, CAL_FORMAT_UINT_2,
                                          CAL_RESALLOC_CACHEABLE);
    mResAttentionSingle = mDev->resAllocLocal1D(mNum, CAL_FORMAT_UINT_1,
                                          CAL_RESALLOC_CACHEABLE);

    /* Lazy check to ensure that memory has been allocated */
    assert(mResState);
    assert(mResRoundFunc);
    assert(mResAttention);
    assert(mResAttentionSingle);

    /**
     * Load Compile and Link kernels
     */
    unsigned char* kernel = getKernel(0);
    assert(kernel);
    if (calclCompile(&mObjectDouble, CAL_LANGUAGE_IL, (const CALchar*)kernel,
                     mDev->getDeviceInfo()->target) != CAL_RESULT_OK) {
        assert(!"Compilation failed.");
    }
    freeKernel(kernel);

    if (calclLink (&mImageDouble, &mObjectDouble, 1) != CAL_RESULT_OK) {
        assert(!"Link failed.");
    }
#if DISASSEMBLE
    gDisFile = fopen("disassembly_double.txt","w");
    calclDisassembleImage(mImageDouble, logger);
    fclose(gDisFile);
#endif
    mCtx = mDev->getContext();
    mModuleDouble = new CalModule(mCtx);
    if (mModuleDouble==0) {
        assert(!"Could not create module");
    }
    if (!mModuleDouble->Load(mImageDouble)) {
        assert(!"Could not load module image");
    }

    /* repeat for single kernel */
    kernel = getKernel(1);
    assert(kernel);
    if (calclCompile(&mObjectSingle, CAL_LANGUAGE_IL, (const CALchar*)kernel,
                     mDev->getDeviceInfo()->target) != CAL_RESULT_OK) {
        assert(!"Compilation failed.");
    }
    freeKernel(kernel);

    if (calclLink (&mImageSingle, &mObjectSingle, 1) != CAL_RESULT_OK) {
        assert(!"Link failed.");
    }
#if DISASSEMBLE
    gDisFile = fopen("disassembly_single.txt","w");
    calclDisassembleImage(mImageSingle, logger);
    fclose(gDisFile);
#endif
    mCtx = mDev->getContext();
    mModuleSingle = new CalModule(mCtx);
    if (mModuleSingle==0) {
        assert(!"Could not create module");
    }
    if (!mModuleSingle->Load(mImageSingle)) {
        assert(!"Could not load module image");
    }


    unsigned int *dataPtr = NULL;
    CALuint pitch = 0;
    
    if (mSingleMode) {
        mModule = mModuleSingle;
        mModule->Bind("o0",mResAttentionSingle);
    } else {
        mModule = mModuleDouble;
        mModule->Bind("o0",mResAttention);
    }
    mModule->Bind("g[]",mResState);
    mModule->Bind("i0",mResRoundFunc);

    /* Init debug counters */
    if (!Ext_calCtxCreateCounter) {
        calExtGetProc( (CALvoid**)&Ext_calCtxCreateCounter, CAL_EXT_COUNTERS,
                       "calCtxCreateCounter");
    }
    Ext_calCtxCreateCounter( &mCounter, *mCtx, CAL_COUNTER_IDLE );
    if (!Ext_calCtxBeginCounter) {
        calExtGetProc( (CALvoid**)&Ext_calCtxBeginCounter, CAL_EXT_COUNTERS,
                       "calCtxBeginCounter");
    }
    Ext_calCtxBeginCounter( *mCtx, mCounter );
    if (!Ext_calCtxEndCounter) {
        calExtGetProc( (CALvoid**)&Ext_calCtxEndCounter, CAL_EXT_COUNTERS,
                       "calCtxEndCounter");
    }
    if (!Ext_calCtxDestroyCounter) {
        calExtGetProc( (CALvoid**)&Ext_calCtxDestroyCounter, CAL_EXT_COUNTERS,
                       "calCtxDestroyCounter");
    }
    if (!Ext_calCtxGetCounter) {
        calExtGetProc( (CALvoid**)&Ext_calCtxGetCounter, CAL_EXT_COUNTERS,
                       "calCtxGetCounter");
    }

    /* Init free list */
    int jobs = mNum * 2;
    mJobLimit = jobs;
    mJobs = new A5Il::JobPiece_s[jobs];
    for(int i=0; i<jobs; i++) {
        mJobs[i].next_free = i-1;
        mJobs[i].idle = true;
    }
    mFree = jobs - 1;
    mNumJobs = 0;

    populate();
};