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