使用驱动程序 API 创建纹理对象时 JCuda 访问冲突

克福夸

我有一个 JCuda 项目,它在尝试使用驱动程序 API 创建纹理对象时遇到访问冲突。Java HotSpot 声称该错误来自 nvcuda.dll。

创建纹理的底层 CUarray 似乎已正确填充;将其内容复制回主机端浮点数组会产生与初始主机端数据相同的数组。这意味着错误本身必须在纹理声明中,对吗?

使用 cuda-memcheck 运行代码显示没有错误。

这是遇到错误的代码:

import jcuda.Pointer;
import jcuda.Sizeof;
import jcuda.driver.*;

public class Main {

    public static void main(String[] args) {
        init();

        float[] hostArray = new float[]{0, 1, 2, 3, 4, 5, 6, 7};
        int[] dims = new int[]{2,2,2};

        CUdeviceptr deviceArray = new CUdeviceptr();
        JCudaDriver.cuMemAlloc(deviceArray, hostArray.length * Sizeof.FLOAT);
        JCudaDriver.cuMemcpyHtoD(deviceArray, Pointer.to(hostArray), hostArray.length * Sizeof.FLOAT);

        // initialize the opaque array object to represent the texture's data
        CUarray cuArray = makeCudaArray(dims);

        // populate the opaque array object
        copyDataIntoCudaArray(deviceArray, cuArray, dims);

        JCudaDriver.cuMemFree(deviceArray);

        // create the various descriptors
        CUDA_RESOURCE_DESC resourceDescriptor = makeResourceDescriptor(cuArray);
        CUDA_TEXTURE_DESC textureDescriptor = makeTextureDescriptor();
        CUDA_RESOURCE_VIEW_DESC resourceViewDescriptor = makeResourceViewDescriptor(dims);

        CUtexObject texture = new CUtexObject();

        System.out.println("About to hit an access violation:");
        JCudaDriver.cuTexObjectCreate(texture, resourceDescriptor, textureDescriptor, resourceViewDescriptor);
    }

    static void init() {
        JCudaDriver.setExceptionsEnabled(true);
        JCudaDriver.cuInit(0);

        int[] deviceCount = new int[1];
        JCudaDriver.cuDeviceGetCount(deviceCount);

        CUdevice currentDevice = new CUdevice();
        JCudaDriver.cuDeviceGet(currentDevice, 0);

        CUcontext currentContext = new CUcontext();
        JCudaDriver.cuCtxCreate(currentContext, 0, currentDevice);
    }

    static CUarray makeCudaArray(int[] dims) {
        CUarray array = new CUarray();
        CUDA_ARRAY3D_DESCRIPTOR arrayDescriptor = new CUDA_ARRAY3D_DESCRIPTOR();

        arrayDescriptor.Width = dims[0];
        arrayDescriptor.Height = dims[1];
        arrayDescriptor.Depth = dims[2];
        arrayDescriptor.Format = CUarray_format.CU_AD_FORMAT_FLOAT;
        arrayDescriptor.NumChannels = 1;
        arrayDescriptor.Flags = 0;

        JCudaDriver.cuArray3DCreate(array, arrayDescriptor);
        return array;
    }

    static void copyDataIntoCudaArray(CUdeviceptr deviceArray, CUarray array, int[] dims) {
        CUDA_MEMCPY3D copyParams = new CUDA_MEMCPY3D();
        copyParams.srcMemoryType = CUmemorytype.CU_MEMORYTYPE_DEVICE;
        copyParams.srcDevice = deviceArray;
        copyParams.srcXInBytes = 0;
        copyParams.srcY = 0;
        copyParams.srcZ = 0;
        copyParams.srcPitch = (long) dims[0] * Sizeof.FLOAT;
        copyParams.srcHeight = dims[1];
        copyParams.srcLOD = 0;

        copyParams.dstMemoryType = CUmemorytype.CU_MEMORYTYPE_ARRAY;
        copyParams.dstArray = array;
        copyParams.dstXInBytes = 0;
        copyParams.dstY = 0;
        copyParams.dstZ = 0;
        copyParams.dstLOD = 0;

        copyParams.WidthInBytes = (long) dims[0] * Sizeof.FLOAT;
        copyParams.Height = dims[1];
        copyParams.Depth = dims[2];

        JCudaDriver.cuMemcpy3D(copyParams);
    }

    static CUDA_RESOURCE_DESC makeResourceDescriptor(CUarray cuArray) {
        CUDA_RESOURCE_DESC resourceDescriptor = new CUDA_RESOURCE_DESC();
        resourceDescriptor.resType = CUresourcetype.CU_RESOURCE_TYPE_ARRAY;
        resourceDescriptor.array_hArray = cuArray;
        resourceDescriptor.flags = 0;
        return resourceDescriptor;
    }

    static CUDA_TEXTURE_DESC makeTextureDescriptor() {
        CUDA_TEXTURE_DESC textureDescriptor = new CUDA_TEXTURE_DESC();
        textureDescriptor.addressMode = new int[]{
                CUaddress_mode.CU_TR_ADDRESS_MODE_CLAMP,
                CUaddress_mode.CU_TR_ADDRESS_MODE_CLAMP,
                CUaddress_mode.CU_TR_ADDRESS_MODE_CLAMP };
        textureDescriptor.filterMode = CUfilter_mode.CU_TR_FILTER_MODE_LINEAR;
        textureDescriptor.flags = 0;
        textureDescriptor.maxAnisotropy = 1;
        textureDescriptor.mipmapFilterMode = CUfilter_mode.CU_TR_FILTER_MODE_POINT;
        textureDescriptor.mipmapLevelBias = 0;
        textureDescriptor.minMipmapLevelClamp = 0;
        textureDescriptor.maxMipmapLevelClamp = 0;
        return textureDescriptor;
    }

    static CUDA_RESOURCE_VIEW_DESC makeResourceViewDescriptor(int[] dims) {
        CUDA_RESOURCE_VIEW_DESC resourceViewDescriptor = new CUDA_RESOURCE_VIEW_DESC();
        resourceViewDescriptor.format = CUresourceViewFormat.CU_RES_VIEW_FORMAT_FLOAT_1X32;
        resourceViewDescriptor.width = dims[0];
        resourceViewDescriptor.height = dims[1];
        resourceViewDescriptor.depth = dims[2];
        resourceViewDescriptor.firstMipmapLevel = 0;
        resourceViewDescriptor.lastMipmapLevel = 0;
        resourceViewDescriptor.firstLayer = 0;
        resourceViewDescriptor.lastLayer = 0;
        return resourceViewDescriptor;
    }
}

我在这里做错了什么?

马可13

这种访问冲突的原因是 JCuda 0.9.0 中的一个错误。

纹理句柄被错误地作为NULL指针传递给本机函数这已在此提交中修复,修复将成为下一个版本的一部分。

一个基于问题的代码测试案例已被添加。

更新:此问题已在JCuda 0.9.0d 中修复

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用对象指针时的访问冲突读取

使用驱动程序 API 编译 CUDA 动态并行代码时出错

Python C API:使用 MSVC 尝试示例模块时出现访问冲突

使用ADB访问SPI驱动程序

使用mongodb ruby驱动程序连接rails API应用程序与mongodb时要修改哪个文件

通过驱动程序对象访问梯度信息

使用struct时发生访问冲突

使用alloca时发生访问冲突

使用 OpenSSL 的 Camellia 时访问冲突

注销时,鼠标驱动程序突然可以访问鼠标

Wacom 驱动程序冲突?

使用Selenium的Internet Explorer驱动程序在访问外部网页时不允许处理窗口

使用C ++ Stream API发生访问冲突异常

如何使用Factual API Android驱动程序?

Win32API / Win驱动程序:如何检测是否访问了文件

使用Windows MiniFilter驱动程序拦截进程访问

如何使用docker驱动程序访问Minikube中的NodePort?

C ++程序在退出时崩溃,内存访问冲突

在Win32程序中使用XAML Hosting API导航到页面会导致访问冲突

使用Boost进程间创建消息队列-内存访问冲突

使用fstream的“访问冲突”

使用指针作为循环条件时的读取访问冲突

wcscmp-使用此功能时发生访问冲突

使用EvtSetChannelConfigProperty()函数时发生访问冲突错误

使用IFMXImageManagerService时在iOS上发生访问冲突

使用静态 std::vector 类成员时的访问冲突

使用ctypes回调功能时的访问冲突

使用Ctypes与Fortran DLL进行接口时发生访问冲突

使用 %s 格式说明符时读取访问冲突