我正在使用在Windows 7上运行的开源触觉和3D图形库Chai3D.我已经用Nvidia nvision重写了库来做立体3D.我正在使用带有GLUT的OpenGL,并使用glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_STEREO)来初始化显示模式.它在Quadro卡上运行良好,但在GTX 560m和GTX 580卡上,它表示像素格式不受支持.我知道显示器能够显示3D,我知道这些显卡能够呈现它.我已经尝试调整屏幕的分辨率和我能想到的其他一切,但似乎没有任何效果.我已经在各个地方阅读过使用OpenGL的立体3D仅在全屏模式下工作.因此,我能想到的唯一可能的原因是我在窗口模式下启动.如何在启用3D的情况下强制应用程序以全屏模式启动?任何人都可以使用OpenGL在后来的GTX型号卡上提供四缓冲立体3D的代码示例吗?
编辑:按照建议,我将纹理目标更改为GL_TEXTURE_2D. 所以初始化现在看起来像这样:
void initTexture( int width, int height )
{
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width,
height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL );
glGenerateMipmap(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
}
Run Code Online (Sandbox Code Playgroud)
由于它是 a GL_TEXTURE_2D,因此需要定义 mipmap。这应该如何反映在 OpenCL Image2D 的初始化上?
texMems.push_back(Image2DGL(clw->context, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, tex, &err));
Run Code Online (Sandbox Code Playgroud)
不过我还是收到了CL_INVALID_GL_OBJECT。所以问题仍然是:如何在初始化 OpenCL Image2D 时检查纹理完整性?
以前的方法:
我正在使用avcodec解码视频文件。结果是一个AVFrame. 我可以在GL_TEXTURE_RECTANGLE_ARB.
这是我的纹理初始化的摘录,在 gl (glew) 上下文初始化之后:
GLuint tex = 0; …Run Code Online (Sandbox Code Playgroud) 我已多次看到这个问题,但从未找到Windows的答案.我最近将我的CUDA代码移植到OpenCL.使用ATI卡进行测试时,Catalyst驱动程序包含CPU OpenCL驱动程序,因此我可以在CPU上运行OpenCL代码.使用NVIDIA卡进行测试时,CPU没有驱动程序.
问题是:如何在运行Nvidia卡时安装(和部署)CPU驱动程序?
非常感谢
根据我在CUDA方面的经验,我最喜欢使用带有CUDA数组引用的纹理内存,因为它具有2D / 3D空间缓存机制,并且大多数时候我的输入数据可以安排为2D纹理。现在我有一个问题,我可以同时将输入建模为线性数组和2D纹理。(顺便说一句,当我谈论纹理内存时,我总是指将其与2D CUDA数组引用一起使用。)我知道,在使用常规全局内存时,合并的访问模式非常重要。如果warp中的线程读取的基本地址与64字节边界对齐的连续地址,则可以通过单个内存访问(合并访问)为整个warp服务。我想知道,合并的访问模式对于纹理存储是否也很重要。我认为不应该 因为纹理存储的目的是不同的;据我所知,它针对彼此接近的2D / 3D访问进行了优化,并且使用所需的像素以及周围的一些行和列来更新纹理缓存。因此,我认为2D纹理存储器中连续的行访问模式将无济于事,相比之下,它可能会污染周围行列数据的纹理缓存并降低性能。无论如何,这只是我阅读了《编程指南》和其他资源后的想法,并且我想确定一下:合并的访问模式对纹理内存是否很重要,就像在常规全局内存中一样?据我所知,它针对彼此接近的2D / 3D访问进行了优化,并且使用所需的像素以及周围的一些行和列来更新纹理缓存。因此,我认为2D纹理存储器中连续的行访问模式将无济于事,相比之下,它可能会污染周围行列数据的纹理缓存并降低性能。无论如何,这只是我阅读了《编程指南》和其他资源后的想法,并且我想确定一下:合并的访问模式对纹理内存是否很重要,就像在常规全局内存中一样?据我所知,它针对彼此接近的2D / 3D访问进行了优化,并且使用所需的像素以及周围的一些行和列来更新纹理缓存。因此,我认为2D纹理存储器中连续的行访问模式将无济于事,相比之下,它可能会污染周围行列数据的纹理缓存并降低性能。无论如何,这只是我阅读了《编程指南》和其他资源后的想法,并且我想确定一下:合并的访问模式对纹理内存是否很重要,就像在常规全局内存中一样?相反,它可能会用周围的行列数据污染纹理缓存,并降低性能。无论如何,这只是我阅读了《编程指南》和其他资源后的想法,并且我想确定一下:合并的访问模式对纹理内存是否很重要,就像在常规全局内存中一样?相反,它可能会用周围的行列数据污染纹理缓存,并降低性能。无论如何,这只是我阅读了《编程指南》和其他资源后的想法,并且我想确定一下:合并的访问模式对纹理内存是否很重要,就像在常规全局内存中一样?
假设我正在尝试对数组大小n进行简单的缩减,比如保持在一个工作单元内...说添加所有元素.一般策略似乎是在每个GPU上生成许多工作项,这会减少树中的项目.天真地看起来似乎采取了log n步骤,但它并不像第一波线程所有这些线程一次性进行,是吗?它们被安排在经线中.
for(int offset = get_local_size(0) / 2;
offset > 0;
offset >>= 1) {
if (local_index < offset) {
float other = scratch[local_index + offset];
float mine = scratch[local_index];
scratch[local_index] = (mine < other) ? mine : other;
}
barrier(CLK_LOCAL_MEM_FENCE);
}
Run Code Online (Sandbox Code Playgroud)
因此,并行添加了32个项目,然后该线程在屏障处等待.另外32人去,我们在障碍物等待.另外32个,我们在屏障处等待,直到所有线程都完成了必要的n/2次添加以进入树的最顶层,然后我们绕过循环.凉.
这看起来不错,但也许很复杂?我理解指令级并行是一个大问题,所以为什么不产生一个线程并做类似的事情
while(i<array size){
scratch[0] += scratch[i+16]
scratch[1] += scratch[i+17]
scratch[2] += scratch[i+17]
...
i+=16
}
...
int accum = 0;
accum += scratch[0]
accum += scratch[1]
accum += scratch[2]
accum += scratch[3]
...
Run Code Online (Sandbox Code Playgroud)
这样所有的添加都发生在经线内.现在你有一个线程可以保持gpu的忙碌程度.
现在假设指令级并行性不是真的.如下所示,工作大小设置为32(warp数).
for(int i …Run Code Online (Sandbox Code Playgroud) 我正在研究一个随机过程,我希望每次运行程序时,如果CUDA内核中的随机数生成不同的序列.这类似于我们在C++中通过声明seed = time(null)后跟srand(seed)和rand()
我可以通过内核将种子从主机传递到设备但是这样做的问题是我必须将每个线程的整个种子数组传递到内核中,以便每次都有不同的随机种子.有没有办法可以生成随机种子/进程if/machine time或类似内核之外的东西并将其作为种子传递?
我想在没有 CPU-RAM 的情况下直接将数据从 GPU0-DDR 复制到 GPU1-DDR。
如第 15 页所述:http : //people.maths.ox.ac.uk/gilesm/cuda/MultiGPU_Programming.pdf
Peer-to-Peer Memcpy
? Direct copy from pointer on GPU A to pointer on GPU B
? With UVA, just use cudaMemcpy(…, cudaMemcpyDefault)
? Or cudaMemcpyAsync(…, cudaMemcpyDefault)
? Also non-UVA explicit P2P copies:
? cudaError_t cudaMemcpyPeer( void * dst, int dstDevice, const void* src,
int srcDevice, size_t count )
? cudaError_t cudaMemcpyPeerAsync( void * dst, int dstDevice,
const void* src, int srcDevice, size_t count, cuda_stream_t stream = 0 ) …Run Code Online (Sandbox Code Playgroud) 我试图将我的代码解耦一些,但是有些东西失败了.编译错误:
error: calling a __host__ function("DecoupledCallGpu") from a __global__ function("kernel") is not allowed
Run Code Online (Sandbox Code Playgroud)
代码摘录:
main.c(调用cuda主机函数):
#include "cuda_compuations.h"
...
ComputeSomething(&var1,&var2);
...
Run Code Online (Sandbox Code Playgroud)
cuda_computations.cu(具有内核,主机主函数并包含具有设备修正的标头):
#include "cuda_computations.h"
#include "decoupled_functions.cuh"
...
__global__ void kernel(){
...
DecoupledCallGpu(&var_kernel);
}
void ComputeSomething(int *var1, int *var2){
//allocate memory and etc..
...
kernel<<<20,512>>>();
//cleanup
...
}
Run Code Online (Sandbox Code Playgroud)
decoupled_functions.cuh:
#ifndef _DECOUPLEDFUNCTIONS_H_
#define _DECOUPLEDFUNCTIONS_H_
void DecoupledCallGpu(int *var);
#endif
Run Code Online (Sandbox Code Playgroud)
decoupled_functions.cu:
#include "decoupled_functions.cuh"
__device__ void DecoupledCallGpu(int *var){
*var=0;
}
#endif
Run Code Online (Sandbox Code Playgroud)
汇编:
nvcc -g --ptxas-options = -v -arch = sm_30 -c …
我有一个nvidia GTX 750 Ti卡,它被宣传为具有640个CUDA核心.实际上,nvidia设置应用程序也报告了这一点.
我正在尝试使用此卡在Linux上进行OpenCL开发.现在,我已经从OpenCL环境(通过PyOpenCL,如果它有所作为)报告计算单元的数量是5.我的理解是nvidia设备上的一个计算单元映射到一个多处理器,我理解为32 SIMD单位(我假设是CUDA核心).
显然,5*32不是640(相当于预期的四分之一).
我是否遗漏了有关nvidia工作单位含义的内容?该卡还驱动图形输出,它将使用一些计算能力 - 是为图形使用保留的处理能力的一部分?(如果是的话,我可以改变吗?).
我有一个nvidia gpu,我需要安装opencl作为我使用的库的依赖.我一直在寻找解决方案几个小时.以下是我做的步骤:
2-解压缩tarball
3-将rpm文件更改为deb
for f in *.rpm; do
fakeroot alien --to-deb $f
done
for f in *.deb; do
sudo dpkg -i $f
done
Run Code Online (Sandbox Code Playgroud)
然后,我通过这一行下载了Nvidia提供的OpenCL设备查询文件
g++ -o oclDeviceQuery.cpp -I/opt/intel/opencl-1.2-sdk-6.0.0.1049/include oclDeviceQuery.cpp -lOpenCL
Run Code Online (Sandbox Code Playgroud)
它给了我一个错误 #include <oclUtils.h>
fatal error: oclUtils.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我试图检查我需要的库是否会看到OpenCL,但它没有.我做错了什么,但我无法理解.