void buffer_reset(char *p, char val, int size) { int local_size; while (size > 0) { local_size = wmin(size, 1023); HWLOOP(local_size) { *p = val; p++; } END_HWLOOP; size -= local_size; } }/* end buffer_reset() */
void buffer_reset(char *p, char val, int size) { /* The compiler generates ubyte access, cast to int to force reset * of msb as well */ int *p_int = (int *) p; int local_size; while (size > 0) { local_size = wmin(size, 1023); HWLOOP(local_size) { *p_int = val; p_int++; } END_HWLOOP; size -= local_size; } }/* end buffer_reset() */
void vector_copy_neg(Float *p, Float *q, int len, int incr1, int incr2) { register int ix1 AT_REG(IX1); register int ix2 AT_REG(IX2); int local_len; ix1 = incr1; ix2 = incr2; while ( len > 0 ) { local_len = wmin(len,1023); HWLOOP(local_len) { *p = wneg(*q); q += ix2; p += ix1; } END_HWLOOP; len -= local_len; } } /* end vector_copy_neg */
HugeNumber operator + ( HugeNumber &u, HugeNumber &v) // Slogenie neotrisatelnix selix chisel { word j; dword k; // Cifra perenosa word uk; // Chislo razriadov u word vk; // Chislo razriadov v word wk; // Chislo razriadov w word kw; dword p; HugeNumber w; // Zdes bydem nakaplivat rezyltat vk=v.Razr(); uk=u.Razr(); wk=wmax(uk,vk); kw=wmin(uk,vk); w.Resize(wk+1); // Delaem nygnyiy razriadnost rezyltata k=0; // Symiryem razriadi po samomy korotkomy chisly for (j=0; j<kw; j++) { p=dword(u.digit[j])+dword(v.digit[j])+k; if (p>=base) { k=1; w.digit[j] = word(p & (base-1)); } else { k=0; w.digit[j]= word(p); }; }; // Tiper nado prosymirovat ostavshiesia razriadi dlinnogo chisla i // razriad perenosa. if (k!=0) { // Bil perenos pri symmirovanii po korotkomy chisly // Nado symmirivat ostavshiesia razriady if (uk>vk) { // Symmiryem, poka est cifra perenosa for (; j<uk; j++) { p=u.digit[j]+k; if (p>=base) { k=1; w.digit[j] = word(p & (base-1)); } else { k=0; w.digit[j]= word(p); break; }; } // Kopiryem ostavshiesia razriady if (k==0) for (j++; j<uk; j++) w.digit[j]=u.digit[j]; } else { // Symmiryem, poka est cifra perenosa for (; j<vk; j++) { p=v.digit[j]+k; w.digit[j]= word(p & (base-1)); if (p>=base) { k=1; } else { k=0; break; }; } // Kopiryem ostavshiesia razriady if (k==0) for (j++; j<vk; j++) w.digit[j]=v.digit[j]; }; if (k!=0) { // Symmirovanie provedeno po vsem razriadam, no eshe est // cifra perenosa w.digit[j]=word(k); } } else { // Nebilo perenosa pri symmirovanii po korotkomy chisly // Nado prosto skopirovat ostavshiesia razriady dlinnogo chisla if (vk>uk) for (; j<vk; j++) w.digit[j]=v.digit[j]; else if (uk>vk) for (; j<uk; j++) w.digit[j]=word(u.digit[j]+k); }; return w; };
/** OWMin operator * * @param x numeric * @param w numeric * @return numeric of length 1 */ SEXP owmin(SEXP x, SEXP w) { x = prepare_arg_numeric_sorted_inc(x, "x"); return wmin(x, w); }
void btParticlesDynamicsWorld::adjustGrid() { //btVector3 wmin( BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT); //btVector3 wmax(-BT_LARGE_FLOAT, -BT_LARGE_FLOAT, -BT_LARGE_FLOAT); btVector3 wmin( BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT); btVector3 wmax(-BT_LARGE_FLOAT, -BT_LARGE_FLOAT, -BT_LARGE_FLOAT); btVector3 boxDiag(m_particleRad, m_particleRad, m_particleRad); for(int i = 0; i < m_numParticles; i++) { btVector3 pos = m_hPos[i]; btVector3 boxMin = pos - boxDiag; btVector3 boxMax = pos + boxDiag; wmin.setMin(boxMin); wmax.setMax(boxMax); } m_worldMin = wmin; m_worldMax = wmax; btVector3 wsize = m_worldMax - m_worldMin; wsize[3] = 1.0f; glBindBufferARB(GL_ARRAY_BUFFER, m_colVbo); btVector3* color = (btVector3*)glMapBufferARB(GL_ARRAY_BUFFER, GL_WRITE_ONLY); for(int i = 0; i < m_numParticles; i++, color++) { *color = (m_hPos[i] - m_worldMin) / wsize; (*color)[3] = 1.f; } glUnmapBufferARB(GL_ARRAY_BUFFER); /* wsize[0] *= 0.5f; wsize[1] *= 0.1f; wsize[2] *= 0.5f; m_worldMin -= wsize; m_worldMax += wsize; */ m_worldMin.setValue(-1.f, -1.f, -1.f); m_worldMax.setValue( 1.f, 1.f, 1.f); wsize = m_worldMax - m_worldMin; m_cellSize[0] = m_cellSize[1] = m_cellSize[2] = m_particleRad * btScalar(2.f); m_simParams.m_worldMin[0] = m_worldMin[0]; m_simParams.m_worldMin[1] = m_worldMin[1]; m_simParams.m_worldMin[2] = m_worldMin[2]; m_simParams.m_worldMax[0] = m_worldMax[0]; m_simParams.m_worldMax[1] = m_worldMax[1]; m_simParams.m_worldMax[2] = m_worldMax[2]; m_simParams.m_cellSize[0] = m_cellSize[0]; m_simParams.m_cellSize[1] = m_cellSize[1]; m_simParams.m_cellSize[2] = m_cellSize[2]; m_simParams.m_gridSize[0] = (int)(wsize[0] / m_cellSize[0]); m_simParams.m_gridSize[1] = (int)(wsize[1] / m_cellSize[1]); m_simParams.m_gridSize[2] = (int)(wsize[2] / m_cellSize[2]); m_numGridCells = m_simParams.m_gridSize[0] * m_simParams.m_gridSize[1] * m_simParams.m_gridSize[2]; m_hCellStart.resize(m_numGridCells); unsigned int memSize = sizeof(int) * m_numGridCells; cl_int ciErrNum; m_dCellStart = clCreateBuffer(m_cxMainContext, CL_MEM_READ_WRITE, memSize, NULL, &ciErrNum); oclCHECKERROR(ciErrNum, CL_SUCCESS); }