我正在开发一个混合 OpenCL 应用程序,它必须在运行时决定是否使用 GPU 实现。
是否有跨平台(即对于 intel、nvidia 和 ati)的方式来确定运行应用程序的计算机是否具有 opencl 框架支持,而不会导致应用程序崩溃?一开始我只是为 Windows 平台开发。
#include <CL/cl.h>
#include <iostream>
int main()
{
std::cout << "Start cross paltform testing" << std::endl;
cl_platform_id platform[1];
clGetPlatformIDs(1, platform, 0);
std::cout << "End cross paltform testing" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
目前我收到错误:
The application was unable to start correctly (0xc000007b)...
Run Code Online (Sandbox Code Playgroud)
如果我尝试在我上面描述的情况下启动它。
注意:实际上,至少对于 nvidia 来说应该是可能的。我已经在这个场景中测试了来自 nvidia GPU SDK 的 oclDeviceQuery 并且它工作正常。只需将 Windows/System 文件夹中的“opencl.dll”复制到应用程序文件夹中。我不知道为什么我的应用程序在相同的情况下崩溃。
先感谢您。
我有一个非常复杂的OpenGL应用程序在带有ATI图形芯片的嵌入式设备上运行,运行RT linux.应用程序的部分通过单元测试进行测试.它们都通过,没有报告内存泄漏或无效访问.但是,应用程序有一些怪癖,有些事情表现不佳.
今天我尝试使用valgrind运行这个应用程序,在初始化期间我看到一些无效的内存读/写,所有这些都与ATI驱动程序有关:
==14347== Invalid read of size 8
==14347== at 0x67C3868: ??? (in /usr/lib/catalyst/libGL.so.1.2)
==14347== Address 0x8f6b398 is 208 bytes inside a block of size 212 alloc'd
==14347== at 0x400AE44: malloc (vg_replace_malloc.c:270)
==14347== by 0x6762701: ??? (in /usr/lib/catalyst/libGL.so.1.2)
==14347== by 0x8F6B05F: ???
==14347==
==14347== Syscall param ioctl(generic) points to uninitialised byte(s)
==14347== at 0x8A57B9: ioctl (in /lib/libc-2.14.1.so)
==14347== by 0x6A0E345: ukiCreateContext (in /usr/lib/catalyst/libatiuki.so.1.0)
==14347== by 0xA9D4570: ??? (in /usr/lib/dri/fglrx_dri.so)
==14347== Address 0xbeceacb4 is on thread 1's stack
==14347==
==14347== …Run Code Online (Sandbox Code Playgroud) 我真的很奇怪,我pin down现在几天都不能.我正在制作一个简单的每顶点照明,它可以正常工作Nvidia,但不会渲染任何带灯光的阴影AMD/ATI.我追踪了与属性有关的问题 - 特别是颜色属性.
这是我的顶点着色器:
#version 140
uniform mat4 modelViewProjectionMatrix;
in vec3 in_Position; // (x,y,z)
in vec4 in_Color; // (r,g,b,a)
in vec2 in_TextureCoord; // (u,v)
out vec2 v_TextureCoord;
out vec4 v_Color;
uniform bool en_ColorEnabled;
uniform bool en_LightingEnabled;
void main()
{
if (en_LightingEnabled == true){
v_Color = vec4(0.0,1.0,0.0,1.0);
}else{
if (en_ColorEnabled == true){
v_Color = in_Color;
}else{
v_Color = vec4(0.0,0.0,1.0,1.0);
}
}
gl_Position = modelViewProjectionMatrix * vec4( in_Position.xyz, 1.0);
v_TextureCoord = in_TextureCoord;
}
Run Code Online (Sandbox Code Playgroud)
这是像素着色器:
#version …Run Code Online (Sandbox Code Playgroud) 我可以通过安装ATI Stream SDK在Nvidia GPU上编码我的OpenCL应用程序(因为它可以让我加速我的CPU,Nvidia编程SDK也不会)
我在2012 Mac Pro上安装了ATI Radeon HD 5770 GPU.
当我在我的程序中运行以下代码时:
std::cout << glGetString(GL_RENDERER) << std::endl;
std::cout << glGetString(GL_VENDOR) << std::endl;
std::cout << glGetString(GL_VERSION) << std::endl;
std::cout << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
Run Code Online (Sandbox Code Playgroud)
我得到的输出如下:
ATI Radeon HD 5770 OpenGL Engine
ATI Technologies Inc.
2.1 ATI-1.24.35
1.20
Run Code Online (Sandbox Code Playgroud)
但是使用OpenGL Extensions Viewer我得到以下内容

有没有办法可以使用4.1?为什么它一直告诉我版本是2.1?