Intel Open Volume Kernel Library

Started by JeGX, October 01, 2019, 05:40:02 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

JeGX

Quote
Intel Open Volume Kernel Library (Intel Open VKL) is a collection of high-performance volume computation kernels, developed at Intel. The target users of Open VKL are graphics application engineers who want to improve the performance of their volume rendering applications by leveraging Open VKL's performance-optimized kernels, which include volume traversal and sampling functionality for a variety of volumetric data formats. The kernels are optimized for the latest IntelĀ® processors with support for SSE, AVX, AVX2, and AVX-512 instructions. Open VKL is part of the Intel oneAPI Rendering Toolkit and is released under the permissive Apache 2.0 license.

Open VKL provides a C API, and also supports applications written with the IntelĀ® SPMD Program Compiler (ISPC) by also providing an ISPC interface to the core volume algorithms. This makes it possible to write a renderer in ISPC that automatically vectorizes and leverages SSE, AVX, AVX2, and AVX-512 instructions. ISPC also supports runtime code selection, thus ISPC will select the best code path for your application.

In addition to the volume kernels, Open VKL provides tutorials and example renderers to demonstrate how to best use the Open VKL API.



Open VKL 0.7.0 (alpha)

- Initial public alpha release, with support for structured, unstructured, and AMR volumes.



Links:
- https://www.openvkl.org
- https://github.com/OpenVKL/openvkl


Intel Open Volume Kernel Library


An OpenVKL demo looks like:


#include <openvkl/openvkl.h>
#include <stdio.h>

...
...

int main()
{
  vklLoadModule("ispc_driver");

  VKLDriver driver = vklNewDriver("ispc");
  vklCommitDriver(driver);
  vklSetCurrentDriver(driver);

  int dimensions[] = {128, 128, 128};

  const int numVoxels = dimensions[0] * dimensions[1] * dimensions[2];

  VKLVolume volume = vklNewVolume("structured_regular");
  vklSetVec3i(volume, "dimensions", dimensions[0], dimensions[1], dimensions[2]);
  vklSetVec3f(volume, "gridOrigin", 0, 0, 0);
  vklSetVec3f(volume, "gridSpacing", 1, 1, 1);

  float *voxels = malloc(numVoxels * sizeof(float));

  if (!voxels) {
    printf("failed to allocate voxel memory!\n");
    return 1;
  }

  // x-grad sample volume
  for (int k = 0; k < dimensions[2]; k++)
    for (int j = 0; j < dimensions[1]; j++)
      for (int i = 0; i < dimensions[0]; i++)
        voxels[k * dimensions[0] * dimensions[1] + j * dimensions[2] + i] =
            (float)i;

  VKLData voxelData = vklNewData(numVoxels, VKL_FLOAT, voxels, 0);
  vklSetData(volume, "voxelData", voxelData);
  vklRelease(voxelData);

  vklCommit(volume);

  demoScalarAPI(volume);
  demoVectorAPI(volume);

  vklShutdown();

  free(voxels);
  return 0;}