- Marcar como nuevo
- Favorito
- Suscribir
- Silenciar
- Suscribirse a un feed RSS
- Resaltar
- Imprimir
- Informe de contenido inapropiado
My environment:
- IPP 2020
- Windows 10
- VS 2019
I'm testing ipprCopyConstBorder_16u_C1V.
It looks like it is designed to place a small image VOI into a large image.
The following code should return a ippStsSizeErr ( since dstRoiVolume.width = 7 < srcRoiVolume.width = 5 + leftBorderWidth 3 ), but it returns ippStsOk.
Please confirm:
void TestCopy() { using namespace std; const IpprVolume srcSize = { 5,5,5 }; const IpprVolume dstSize = { 7,7,7 }; const int numSrc = srcSize.width * srcSize.height * srcSize.depth; const int numDst = dstSize.width * dstSize.height * dstSize.depth; const int srcStep = srcSize.width * sizeof(unsigned short); const int srcPlaneStep = srcSize.width * srcSize.height * sizeof(unsigned short); const int dstStep = dstSize.width * sizeof(unsigned short); const int dstPlaneStep = dstSize.width * dstSize.height * sizeof(unsigned short); vector<unsigned short> srcVol(numSrc), dstVol(numDst); memset(dstVol.data(), 0, numDst * sizeof(unsigned short)); //Set src image. int i = 0; for (int z = 0; z < srcSize.depth; z++) { for (int y = 0; y < srcSize.height; y++) { for (int x = 0; x < srcSize.width; x++) { cout << " " << i; srcVol[i++] = i; } cout << endl; } cout << endl << endl; } cout << "End outputting src volume" << endl << endl; cout << "Begin outputting dst volume" << endl << endl; //Using xBorder = 3 should result in a ippStsSizeErr per the documentation! int xBorder = 3, yBorder = 2, zBorder = 2; unsigned short val = numeric_limits<unsigned short>::max(); IppStatus sts = ipprCopyConstBorder_16u_C1V(srcVol.data(), srcPlaneStep, srcStep, srcSize, dstVol.data(), dstPlaneStep, dstStep, dstSize, xBorder, yBorder, zBorder, &val); assert(sts == ippStsSizeErr); i = 0; for (int z = 0; z < dstSize.depth; z++) { for (int y = 0; y < dstSize.height; y++) { for (int x = 0; x < dstSize.width; x++) { unsigned val = dstVol[i++]; cout << " " << val; } cout << endl; } cout << endl << endl; } }
- Etiquetas:
- Bug
- Development Tools
- Intel® Integrated Performance Primitives
- Parallel Computing
- Vectorization
Enlace copiado
- Marcar como nuevo
- Favorito
- Suscribir
- Silenciar
- Suscribirse a un feed RSS
- Resaltar
- Imprimir
- Informe de contenido inapropiado
thanks Ken, we will check the problem on our side
- Marcar como nuevo
- Favorito
- Suscribir
- Silenciar
- Suscribirse a un feed RSS
- Resaltar
- Imprimir
- Informe de contenido inapropiado
Yes, we confirmed the issue with IPP v.2020 and will try to fix it into one of the next updates. We will keep this thread updated with our progress.
- Marcar como nuevo
- Favorito
- Suscribir
- Silenciar
- Suscribirse a un feed RSS
- Resaltar
- Imprimir
- Informe de contenido inapropiado
Thanks!
- Marcar como nuevo
- Favorito
- Suscribir
- Silenciar
- Suscribirse a un feed RSS
- Resaltar
- Imprimir
- Informe de contenido inapropiado
Was testing this routine again today. What it seems to do is copy an entire source volume into a destination volume. The destination volume is required to be large enough to accommodate the source volume.
The border width arguments make sense to me as the starting voxel in the destination volume, i.e. {int leftBorder, int topBorder, int forwardBorder} should be replaced by a single argument "IpprPoint startVoxel".
My experiments show that all voxels in the destination volume not covered by the copied source volume will be set to the last argument "val".
using namespace std;
void OutputVolume(const vector<unsigned short>& vol, IpprVolume size)
{
int num = static_cast<int>(vol.size());
if (size.depth * size.height * size.width != num) {
assert(false);
return;
}
int i = 0;
for (int z = 0; z < size.depth; z++) {
cout << "Begin Slice " << z << endl;
for (int y = 0; y < size.height; y++) {
for (int x = 0; x < size.width; x++) {
cout << " " << vol[i++];
}
cout << endl;
}
cout << endl << endl;
}
}
void TestCopy()
{
const IpprVolume srcSize = { 3,3,3 };
const IpprVolume dstSize = { 7,7,7 };
const int numsrc=srcSize.width * srcSize.height * srcSize.depth;
const int numDst = dstSize.width * dstSize.height * dstSize.depth;
const int srcStep = srcSize.width * sizeof(unsigned short);
const int srcPlaneStep = srcSize.width * srcSize.height * sizeof(unsigned short);
const int dstStep = dstSize.width * sizeof(unsigned short);
const int dstPlaneStep = dstSize.width * dstSize.height * sizeof(unsigned short);
vector<unsigned short> srcVol(numSrc), dstVol(numDst);
for (int i = 0; i < numSrc; i++) srcVol[i] = i + 1;
cout << "Begin outputting src volume" << endl << endl;
OutputVolume(srcVol, srcSize);
//ipprCopyConstBorder copies an entire source volume to a destination volume.
//The destination volume should be large enough to accommodate the entire source volume.
//
//Below I interpret {leftBorder, topBorder, forwardBorder} as the starting voxel in the detination volume.
//
//All voxels in the destination volume not covered by the copied source volume will get the background value (last argument to the call).
unsigned short val = 30;
for (int zStart = 0; zStart <= dstSize.depth - srcSize.depth; zStart++) {
for (int yStart = 0; yStart <= dstSize.height - srcSize.height; yStart++) {
for (int xStart = 0; xStart <= dstSize.width - srcSize.width; xStart++) {
memset(dstVol.data(), 0, numDst * sizeof(unsigned short));
IppStatus sts = ipprCopyConstBorder_16u_C1V(srcVol.data(), srcPlaneStep, srcStep, srcSize, dstVol.data(), dstPlaneStep, dstStep, dstSize, yStart, xStart, zStart, &val);
assert(sts == ippStsOk);
OutputVolume(dstVol, dstSize);
int numBackground = 0;
for (int i = 0; i < numDst; i++) if (dstVol[i] == val) numBackground++;
assert(numBackground == numDst - numSrc);
}
}
}
cout << "Done" << endl;
}
- Marcar como nuevo
- Favorito
- Suscribir
- Silenciar
- Suscribirse a un feed RSS
- Resaltar
- Imprimir
- Informe de contenido inapropiado
Ken,
Please check the version of IPP v.2020 update 2 which claims the behavior of ipprCopyConstBorder is changed.
- Marcar como nuevo
- Favorito
- Suscribir
- Silenciar
- Suscribirse a un feed RSS
- Resaltar
- Imprimir
- Informe de contenido inapropiado
Here is the output I see with your original case which linked with version 2020 update 2.
....
End outputting src volume
Begin outputting dst volume
Status ipprCopyConstBorder_16u_C1V == -6, ippStsSizeErr: Incorrect value for data size
...
========================================================================
version of IPP is: ippSP AVX2 (l9) 2020.0.2 (r0xbb6c2c1d) 2020.0.2.-1150538723
========================================================================

- Suscribirse a un feed RSS
- Marcar tema como nuevo
- Marcar tema como leído
- Flotar este Tema para el usuario actual
- Favorito
- Suscribir
- Página de impresión sencilla