Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Build OpenCL构建->;因无用的错误而崩溃_Build_Crash_Opencl_Nvidia_Intel - Fatal编程技术网

Build OpenCL构建->;因无用的错误而崩溃

Build OpenCL构建->;因无用的错误而崩溃,build,crash,opencl,nvidia,intel,Build,Crash,Opencl,Nvidia,Intel,对于一个小项目,我一直在尝试使用OpenCL结合使用相关python绑定(pyOpenGL和PyOpenCL)的OpenGL构建一个应用程序。更精确一点,它应该是一个广义的光线跟踪器 安装OpenCL英特尔SDK和英伟达CUDA工具包后,使用IDE由英特尔编写程序,我遇到了一个问题: 当我尝试编译程序时,英特尔编译器“停止工作”或英伟达一个给我一个“无效值”消息。然而,如果我只编译程序,一切都很顺利,没有什么不好的事情发生 如果我故意在代码中放了一个错误,两个编译器都会返回正确的编译器错误以及行

对于一个小项目,我一直在尝试使用OpenCL结合使用相关python绑定(pyOpenGL和PyOpenCL)的OpenGL构建一个应用程序。更精确一点,它应该是一个广义的光线跟踪器

安装OpenCL英特尔SDK和英伟达CUDA工具包后,使用IDE由英特尔编写程序,我遇到了一个问题:

当我尝试编译程序时,英特尔编译器“停止工作”或英伟达一个给我一个“无效值”消息。然而,如果我只编译程序,一切都很顺利,没有什么不好的事情发生

如果我故意在代码中放了一个错误,两个编译器都会返回正确的编译器错误以及行号等等

我能够将问题缩小到
\uuu内核
函数,但我真的不明白为什么它不构建但仍然编译?有什么我遗漏的吗

(请原谅可能很糟糕的opencl代码。我第一次用类似C的语言编写代码)

核心:

__kernel void raytrace(__write_only image2d_t renderTexture,
                       int2 pos, __constant float projectionsMatrix[16],
                       //Mesh Data
                       __constant int* meshIndecies, __constant float3* meshVertices,
                       __constant float3* meshNormals, __constant float2* meshUV,
                       __constant int* meshTriangleIndecies, __constant int* meshTriangles,
                       //Material Data
                       __constant float4* emissions, __constant float4* ambients,
                       __constant float4* diffuses, __constant float4* speculars,
                       __constant float* shininesses,
                       //Object Data
                       __constant float* matricies, __constant int* meshes,
                       __constant int* materials) {

    Mesh* meshData;
    int pcMeshv = 0;
    int pcMesht = 0;
    for (int cMesh = 0; cMesh < sizeof(meshIndecies)/sizeof(int); cMesh++) {
        Mesh data;

        //assign data
        for (int index = 0; index < meshIndecies[cMesh] - pcMeshv; index++) {
            data.vertices[index] = meshVertices[pcMeshv + index];
            data.normals[index] = meshNormals[pcMeshv + index];
            data.uv[index] = meshUV[pcMeshv + index];
        }

        pcMeshv = meshIndecies[cMesh];
        for (int index = 0; index < meshTriangleIndecies[cMesh] - pcMesht; index++) {
            data.triangles[index] = meshTriangles[pcMesht + index];
        }
        pcMesht = meshTriangleIndecies[cMesh];

        //add data to array
        meshData[cMesh] = data;
    }

    Material* materialData;
    for (int index = 0; index < sizeof(shininesses)/sizeof(float); index++) {
        Material data;
        data.emission = emissions[index];
        data.ambient = ambients[index];
        data.diffuse = diffuses[index];
        data.specular = speculars[index];
        data.shininess = shininesses[index];
        materialData[index] = data;
    }

    Object* objectData;
    for (int index = 0; index < sizeof(meshes)/sizeof(int); index++) {
        Object data;
        data.mesh = &meshData[meshes[index]];
        data.material = &materialData[materials[index]];

        for (int i = 0; i < 16; i++) {
            data.matrix[i] = matricies[index*16 + i];
        }

        objectData[index] = data;
    }

    //begin trace
    trace(renderTexture, pos, projectionsMatrix,
          objectData, 0);
}
谢谢你的帮助,

Benproductions1

首先,您可能有太多的常量参数__恒定内存用于少量数据。该规范要求所有设备必须至少支持8个组合大小为64kB及以上的不同参数。更多的都取决于设备。您应该改为使用u全局常量*restrict。我还想知道编译内核和构建内核是什么意思?OpenCL1.1对此并没有任何概念。你可以建立一个程序,就这样。我无法再编辑我的帖子了。我只需要指出,您可能正在使用NVidia不支持的OpenCL1.2特定功能(单独的编译和链接阶段)。它们只支持OpenCL1.1。如果你想让你的程序在他们的平台上可用,你必须坚持OpenCL1.1。如果你想改变现状,就向他们投诉。他们有能力支持OpenCL1.2,但出于战略原因拒绝这样做。我同意sharpneli的观点。您甚至将结构定义为´´常量´。删除代码中所有的常量。只有在你真正需要的时候才使用它们。你可能遇到的另一个问题是争论的数量。如果设置太多,编译器将使用崩溃。尝试将您的输入以某种方式分组到结构中。谢谢您的指针。我已经用另一种方法重新编写了大部分代码,但是这仍然不能解释编译器在构建时崩溃的原因,或者为什么它会给我一条奇怪的错误消息:“无效值-”。。。
typedef struct {
    float3* vertices;
    float3* normals;
    float2* uv;
    uint* triangles;
} Mesh;

typedef struct {
    float shininess;
    float4 specular;
    float4 emission;
    float4 ambient;
    float4 diffuse;
} Material;

typedef struct {
    Mesh* mesh;
    Material* material;
    float matrix[16];
} Object;

typedef struct {
    __constant float4 ambient;
    __constant float4 specular;
    __constant float4 diffuse;
    __constant float4 position;

    __constant float3 spotDirection;
    __constant float spotExponent;
    __constant float spotCutoff;

    __constant float constantAttenuation;
    __constant float linearAttenuation;
    __constant float quadraticAttenuation;
} Light;

typedef struct {
    float3 origin;
    float3 direction;
} Ray;

typedef struct {
    float3 point;
    float3 normal;
    float3 bary;
    float dist;
    uint triangle_index;
    Object* object;
} RaycastHit;