<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Hi Gordian,</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><ol><li>Using GetBufferPointer is the right way to access raw pixel data for your case.<br></li><li>Not using ITK is more error prone way of manipulating image data.<br></li><li>I remember that with more recent versions of CUDA you have unified memory architecture, hence you can using the pointer given by GetBufferPointer to access pixel data. I don't remember whether this implies slower access (you have to account for latency of PCIe bus) or it implicitly copies the data to GPU.<br></li></ol></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Regards,</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Dženan</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 2, 2017 at 11:24 AM, Kabelitz, Gordian <span dir="ltr"><<a href="mailto:Gordian.Kabelitz@medma.uni-heidelberg.de" target="_blank">Gordian.Kabelitz@medma.uni-heidelberg.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
i want to copy my image data on the GPU. Therefore I need to retrieve my image data from the itk::Image class. The method that seems suitable is GetBufferPointer. Hence, I know the size of my image and the pixel type I could get a pointer to the image data.<br>
I cant use itk::GPUImage because my algorithm is not implemented in ITK. My idea is to get the data pointer, do my computation and<br>
My code looks like:<br>
<br>
// get float pointer to image data<br>
ImageType::Pointer image = reader->GetOutput();<br>
Image->Update();<br>
<br>
float* data = image.GetBufferPointer();<br>
// copy image data to gpu<br>
gpu_dev->setVoxels(dimension, voxelSize, data);<br>
[...]<br>
<br>
My setVoxels() method is at the end of this mail.<br>
<br>
When I try to access the memory on the gpu where the data should be stored (at least in my imagination) I get an error.<br>
The error occurs at the checking line for the data input.<br>
<br>
I read [1]  and tried the suggested methods. But I want to work directly on the data and don't want to make any copy.<br>
But couldn't get any closer to a solution.<br>
<br>
My questions are:<br>
1. Is there a good way to retrieve my image data other than suggested in [1] (less copying)?<br>
2. Is it error-prone to change the image data without using itk?<br>
3. Can I work directly on the itk::image data without making a copy?<br>
<br>
[1]: <a href="https://itk.org/CourseWare/Training/GettingStarted-V.pdf" rel="noreferrer" target="_blank">https://itk.org/CourseWare/<wbr>Training/GettingStarted-V.pdf</a><br>
<br>
Thank you.<br>
Sincerely,<br>
Gordian<br>
<br>
<br>
bool CProjection::setVoxels( const int* dimension, const float* voxelSize, const float* data)<br>
{<br>
        // check input<br>
        std::cout << "CUDA: Dimension:" << dimension[0] << ", " << dimension[1] << ", " << dimension[2] << "\n";<br>
        std::cout << "CUDA: Spacing:" << voxelSize[0] << ", " << voxelSize[1] << ", " << voxelSize[2] << "\n";<br>
        std::cout << "CUDA: Data (3 values):" << data[0] << ", " << data[10] << ", " << data[100] << std::endl;<br>
<br>
        cudaExtent volumeSize = make_cudaExtent(dimension[0], dimension[1], dimension[2]);<br>
        volArray_dev = 0;<br>
<br>
        // create 3D array<br>
        const cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>()<wbr>;<br>
        DS_ERROR_CHECK(<wbr>cudaMalloc3DArray(&volArray_<wbr>dev, &channelDesc, volumeSize));<br>
<br>
        // copy data to 3D array<br>
        cudaMemcpy3DParms copyParams = { 0 };<br>
        copyParams.srcPtr = make_cudaPitchedPtr((void*)<wbr>data, volumeSize.width * sizeof(float), volumeSize.width, volumeSize.height);<br>
        copyParams.dstArray = volArray_dev;<br>
        copyParams.extent = volumeSize;<br>
        copyParams.kind = cudaMemcpyHostToDevice;<br>
<br>
        DS_ERROR_CHECK(cudaMemcpy3D(&<wbr>copyParams));<br>
<br>
        // set texture parameters<br>
        tex_vox.normalized = false; //do not access with normalized texture coordinates<br>
<br>
        //use point access<br>
        tex_vox.filterMode = cudaFilterModePoint;<br>
        // clamp texture edges for out of boundary access<br>
        tex_vox.addressMode[0] = cudaAddressModeClamp;<br>
        tex_vox.addressMode[1] = cudaAddressModeClamp;<br>
        tex_vox.addressMode[2] = cudaAddressModeClamp;<br>
<br>
        // bind array to 3D texture<br>
        DS_ERROR_CHECK(<wbr>cudaBindTextureToArray(tex_<wbr>vox, volArray_dev, channelDesc));<br>
<br>
        //Set volume information on host and dev<br>
        for (int i = 0; i < 3; i++) {<br>
                volDimension_host[i] = dimension[i];<br>
                voxSize_host[i] = voxelSize[i];<br>
        }<br>
<br>
        DS_ERROR_CHECK(<wbr>cudaMemcpyToSymbol(dc_voxDim, volDimension_host, 3 * sizeof(int)));<br>
        DS_ERROR_CHECK(<wbr>cudaMemcpyToSymbol(dc_voxSize, voxSize_host, 3 * sizeof(float)));<br>
<br>
        voxelsSet = true;<br>
        return voxelsSet; //on success<br>
}<br>
<br>
<br>
<br>
<br>
<br>
______________________________<wbr>_______<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at<br>
<a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/<wbr>opensource/opensource.html</a><br>
<br>
Kitware offers ITK Training Courses, for more information visit:<br>
<a href="http://www.kitware.com/products/protraining.php" rel="noreferrer" target="_blank">http://www.kitware.com/<wbr>products/protraining.php</a><br>
<br>
Please keep messages on-topic and check the ITK FAQ at:<br>
<a href="http://www.itk.org/Wiki/ITK_FAQ" rel="noreferrer" target="_blank">http://www.itk.org/Wiki/ITK_<wbr>FAQ</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/insight-users" rel="noreferrer" target="_blank">http://public.kitware.com/<wbr>mailman/listinfo/insight-users</a><br>
</blockquote></div><br></div>