在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()用错误的参数类型调用可能会导致错误?在CUDA中,存在warp的概念,其被定义为可以在单个处理元件内同时执行相同指令的最大线程数.对于NVIDIA,目前市场上所有卡的经线尺寸均为32.
在ATI卡中,有一个类似的概念,但在这种情况下的术语是波前.经过一番狩猎后,我发现我所拥有的ATI卡的波前大小为64.
我的问题是,在运行时为OpenCL查询此SIMD宽度我该怎么办?
谁能为我提供一个并行算法来计算稀疏Cholesky分解?它必须适合在GPU上执行.我们非常感谢CUDA,OpenCL甚至伪代码中的任何答案.
我知道C++ AMP由支持DirectX 11的GPU加速.
但是,我的问题是,如果编译的C++ AMP程序在没有DirectX 11兼容GPU的机器上运行,会发生什么?
是否可以通过DirectCompute的某些软件实现来模拟?
它是否在CPU上执行(可能使用SSE样式指令)?
或者,它是否无法执行?
我正在使用安装了Update 3的Visual Studio 2012.我正在使用C#定位.NET framework 4.5.
我有一个像这样开始的方法:
public void Open(System.String filePath)
{
if (!System.IO.File.Exists(filePath))
throw new FileNotFoundException(. . .);
. . .
}
Run Code Online (Sandbox Code Playgroud)
filePath参数的值是这样的:
"C:\\Users\\Jonathan.DeCarlo\\Source\\Repos\\PoliticalClassifier\\src\\PoliticalClassifier.DataSource.Tests\\TestFiles\\Social_Economic_DataMicro.xlsx"
那条路确实存在于我的机器上.此应用程序编译为"任何CPU".我在安装了Windows 7 x64的计算机上运行它.如果我让应用程序作为x64进程运行,FileNotFoundException即使文件存在,也会抛出.如果我强制应用程序作为x86进程运行,则不抛出异常(应该是这种情况).
System.IO.File.Exists(filePath)当应用程序作为x64进程而不是x86进程运行时,为什么返回不同的结果?
我正在寻找一种算法来测试 2 条线段是否以 GPU 友好的方式相交。线段是二维的。虽然网络上讨论了许多用于执行此操作的算法,但我所见过的所有算法都使用了大量分支指令。在 CPU 上,这不是一个问题。但是,在 GPU 上,大量分支指令会降低性能。
有谁知道适合这种环境的好算法?任何示例伪代码、CUDA 代码、OpenCL 代码或 DirectCompute 计算将不胜感激。
跟进
如果有人感兴趣,这(基本上)就是我最终得到的。我把它删减了,所以它更像是伪代码而不是 OpenCL C,但希望它能理解要点。
__kernel void findCrossingLines(__global float2 p1, __global float2 p2,
__global float2 p3, __global float2 p4,
__global bool* output)
{
int result = 0;
float2 A = p2;
float2 a = p2 - p1;
float2 B = p4;
float2 b = p4 - p3;
float2 c = B - A;
float2 b_perp = (float2)(-b.y, b.x);
float numerator = dot(b_perp, c);
float denominator = dot(b_perp, …Run Code Online (Sandbox Code Playgroud) 我有一个CUDA程序似乎在某种资源的某种限制,但我无法弄清楚该资源是什么.这是内核函数:
__global__ void DoCheck(float2* points, int* segmentToPolylineIndexMap,
int segmentCount, int* output)
{
int segmentIndex = threadIdx.x + blockIdx.x * blockDim.x;
int pointCount = segmentCount + 1;
if(segmentIndex >= segmentCount)
return;
int polylineIndex = segmentToPolylineIndexMap[segmentIndex];
int result = 0;
if(polylineIndex >= 0)
{
float2 p1 = points[segmentIndex];
float2 p2 = points[segmentIndex+1];
float2 A = p2;
float2 a;
a.x = p2.x - p1.x;
a.y = p2.y - p1.y;
for(int i = segmentIndex+2; i < segmentCount; i++)
{
int currentPolylineIndex = segmentToPolylineIndexMap[i];
// …Run Code Online (Sandbox Code Playgroud)