我想听听有两种编码经验的人的意见.我自己,我只有NVIDIA的经验.
NVIDIA CUDA似乎比竞争对手更受欢迎.(只计算这个论坛上的问题标签,'cuda'优于'opencl'3:1,'nvidia'优于'ati '15:1,并且根本没有'ati-stream'标签.
另一方面,根据维基百科,ATI/AMD显卡应该具有更大的潜力,特别是每美元.目前市场上最快的NVIDIA显卡,GeForce 580(500美元),评级为1.6单精度TFlops.AMD Radeon 6970的售价为370美元,售价为2.7 TFlops.580具有512个执行单元,772 MHz.6970具有1536个执行单元,频率为880 MHz.
AMD相对于NVIDIA的纸张优势有多现实,是否可能在大多数GPGPU任务中实现?整数任务会发生什么?
图形处理单元(GPGPU)上的通用计算是一种非常有吸引力的概念,可以利用GPU的强大功能进行任何类型的计算.
我喜欢使用GPGPU进行图像处理,粒子和快速几何操作.
现在看来,这个领域的两个竞争者似乎是CUDA和OpenCL.我想知道:
任何真实世界的经验/例子/战争故事都值得赞赏.
我一直在阅读CUDA和OpenCL的编程指南,我无法弄清楚银行冲突是什么.他们只是倾向于如何解决问题而不详细说明主题本身.任何人都可以帮我理解吗?如果帮助是在CUDA/OpenCL的背景下,或者只是计算机科学中的银行冲突,我没有偏好.
使用GLSL进行计算的OpenCL有哪些特性可供选择?尽管有与图形相关的术语和非实用的数据类型,但对OpenGL有什么实际的警告吗?
例如,可以通过使用其他纹理渲染纹理来完成并行函数评估.减少操作可以通过迭代渲染到越来越小的纹理来完成.另一方面,无法以任何有效的方式进行随机写访问(唯一的方法是通过纹理驱动的顶点数据渲染三角形).这可能与OpenCL有关吗?OpenGL还有什么不可能实现的?
我开始学习Keras,我认为它是Tensorflow和Theano之上的一层.但是,我只能访问AMD GPU,例如AMD R9 280X.
如何设置我的Python环境,以便通过Keras/Tensorflow支持OpenCL来使用我的AMD GPU?
我在OSX上运行.
虽然"googl'ing"并进行了一些研究,但我无法在AMD硬件上找到任何用于科学GPGPU计算和OpenCL的严肃/流行框架/ sdk .我错过了哪些文献和/或软件?
特别是我对深度学习感兴趣.
据我所知,deeplearning.net推荐使用NVIDIA硬件和CUDA框架.此外,我所知道的所有重要的深度学习框架,如Caffe,Theano,Torch,DL4J,......都专注于CUDA而不打算支持OpenCL/AMD.
此外,人们可以找到大量科学论文以及基于CUDA的深度学习任务的相应文献,但基于OpenCL/AMD的解决方案几乎没有.
在2015/16学年,是否有可能出现基于OpenCL/AMD的新解决方案或现有科学框架?
使用OpenCL/AMD进行深度学习的良好开端是什么?有文献吗?教程?杂项来源?
我知道OpenCL可以控制GPU的内存架构,因此可以实现更好的优化,但是,除此之外,我们可以使用Compute Shaders进行矢量运算(加法,乘法,反演等)吗?
我最近将我的volumeraycaster从OpenGL移植到OpenCL,这使得raycaster的性能降低了大约90%.我跟踪了OpenCL的图像采样功能的性能下降,这比相应的OpenGL纹理采样功能慢得多.通过删除图像采样功能和纹理采样功能,两个raycaster实现具有大致相同的速度.为了轻松地在不同的硬件上使用功能,并在其余的RT代码中排除一些愚蠢的错误,我写了一个小的基准测试,将OpenCL采样速度与OpenGL采样速度进行比较,并在不同的机器上进行测试但是OpenCL仍然只占OpenGL性能的10%左右.
基准测试的OpenCL HostCode(至少是其中最重要的部分):
void OGLWidget::OCLImageSampleTest()
{
try
{
int size=8;
float Values[4*size*size*size];
cl::Kernel kernel=cl::Kernel(program,"ImageSampleTest",NULL);
cl::ImageFormat FormatA(CL_RGBA,CL_FLOAT);
cl::Image3D CLImage(CLcontext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR ,FormatA,size,size,size,0,0,Values,NULL);
cl::ImageFormat FormatB(CL_RGBA,CL_UNSIGNED_INT8);
cl::Image2D TempImage(CLcontext, CL_MEM_WRITE_ONLY,FormatB,1024,1024,0,NULL,NULL );
kernel.setArg(0, CLImage);
kernel.setArg(1, TempImage);
cl::Sampler Samp;
Samp() = clCreateSampler( CLcontext(), CL_TRUE, CL_ADDRESS_REPEAT, CL_FILTER_LINEAR, NULL);
kernel.setArg(2, Samp);
QTime BenchmarkTimer=QTime();
BenchmarkTimer.start();
cl::KernelFunctor func = kernel.bind(queue, cl::NDRange(1024,1024), cl::NDRange(32,32));
func().wait();
int Duration = BenchmarkTimer.elapsed();
printf("OCLImageSampleTest: %d ms \n", Duration);
}
catch (cl::Error& err)
{
std::cerr << "An OpenCL error occured, " << err.what()
<< "\nError num …
Run Code Online (Sandbox Code Playgroud) 通过NVIDIA论坛搜索,我发现了这些问题,我也感兴趣,但在过去四天左右没有人回答过这些问题.你能帮我吗?
深入研究OpenCL阅读教程有些事情对我来说还不清楚.以下是关于本地和全球工作规模的问题集.
必须
global_work_size
小于CL_DEVICE_MAX_WORK_ITEM_SIZES
?在我的机器上CL_DEVICE_MAX_WORK_ITEM_SIZES
= 512,512,64.是否
CL_KERNEL_WORK_GROUP_SIZE
推荐work_group_size
使用内核?
- 或者这
work_group_size
是GPU允许的唯一?在我的机器上CL_KERNEL_WORK_GROUP_SIZE
= 512我是否需要分成工作组,或者我只能有一个,但没有指定
local_work_size
?
- 当我只有一个工作组时,我需要注意什么?
什么
CL_DEVICE_MAX_WORK_GROUP_SIZE
意思?在我的机器上CL_DEVICE_MAX_WORK_GROUP_SIZE
= 512,512,64
- 这是否意味着,我可以拥有一个与工作组一样大的工作组
CL_DEVICE_MAX_WORK_ITEM_SIZES
?有
global_work_size
要的除数CL_DEVICE_MAX_WORK_ITEM_SIZES
?在我的代码global_work_size
= 20.
在OpenCL中,我的理解是您可以使用该barrier()
函数来同步工作组中的线程.我(通常)了解它们的用途以及何时使用它们.我也知道工作组中的所有线程都必须遇到障碍,否则会出现问题.但是,每次我尝试使用障碍到目前为止,它似乎导致我的视频驱动程序崩溃,或者有关访问某种无效内存的错误消息.到目前为止,我已经在2张不同的显卡上看过这个(1个ATI,1个NVIDIA).
所以,我的问题是:
barrier(CLK_LOCAL_MEM_FENCE)
和之间有什么区别barrier(CLK_GLOBAL_MEM_FENCE)
?我阅读了文档,但对我来说并不清楚.barrier(CLK_LOCAL_MEM_FENCE)
vs. 有一般规则barrier(CLK_GLOBAL_MEM_FENCE)
吗?barrier()
用错误的参数类型调用可能会导致错误?