小编soo*_*ngk的帖子

NVIDIA GPU支持分支预测?(使用OpenACC)

我在OpenACC上使用NVIDIA GPU(NVIDIA GeForce960,编译器:PGI 15.7)

NVIDIA GPU是否支持分支预测?我的代码在长循环中有条件执行代码.但是当我在GPU上运行代码时,需要很长时间.

下面是示例代码.

#pragma acc parallel loop
for(i=0; i<1000; i++)  // NVIDIA GPU kernel with OpenACC
   for(j=0; j<1000; j++)
      if(a[i][j]==value)
         // do something...
      else if(a[i][j]==value2)
         // do another something...
      else
         // do another something...
Run Code Online (Sandbox Code Playgroud)

如果此代码在CPU上编译并运行,则CPU将对条件执行循环执行分支预测.NVIDIA GPU是否具有与CPU分支预测相同或类似的技能?

如果有,我该如何启用它?

附加问题:

PGI 15.7编译器可以编译GPU的优化代码吗?我知道通常的编译器(gcc ...等)可以使用优化技能进行编译,比如更改条件代码执行顺序.

cuda nvidia openacc

2
推荐指数
1
解决办法
1076
查看次数

OpenCL函数调用堆栈大小

我可以知道OpenCL的函数调用堆栈大小吗?

我在Ubuntu中使用NVIDIA OpenCL1.2.(NVIDIA CC = 5.2)我在测试代码中发现了一些意想不到的结果.

当某些函数调用64次时,下一个调用的函数似乎无法访问参数.

在我的想法中,调用堆栈溢出使这个问题变得复杂.

下面是我的示例代码和结果:

void testfunc(int count, int run)
{
    if(run==0) return;
    count++;
    printf("count=%d  run=%d\n", count, run);
    run = run - 1;
    testfunc(count, run);
}

__kernel void hello(__global int * in_img, __global int * out_img)
{
    int run;
    int count=0;
    run = 70;
    testfunc(count, run);   
}
Run Code Online (Sandbox Code Playgroud)

这就是结果:

count=1  run=70
count=2  run=69
count=3  run=68
count=4  run=67
count=5  run=66
count=6  run=65
count=7  run=64
   .....
count=59  run=12
count=60  run=11
count=61  run=10
count=62  run=9
count=63  run=8
count=64  run=7
count=0 …
Run Code Online (Sandbox Code Playgroud)

opencl

2
推荐指数
1
解决办法
264
查看次数

OpenCL:使用struct作为内核参数

我可以使用struct作为OpenCL内核参数吗?

我想在NVIDIA OpenCL 1.2(NVIDIA驱动程序352.39)中使用struct type作为OpenCL内核参数

我试过,但它使CL_OUT_OF_RESOURCE错误.

我的代码有什么问题?

[用于结构定义]

/* struct type definition */
typedef struct _st_foo
{
    int aaa;
    int bbb;
     .....
    int zzz;
}st_foo;      // st_foo doesn't have any pointer members
Run Code Online (Sandbox Code Playgroud)

[主机代码]

/* OpenCL initalize... */

st_foo stVar;

cl_mem cm_buffer;
cm_buffer = clCreateBuffer(cxContext, CL_MEM_READ_ONLY, sizeof(st_foo), NULL, NULL);
clSetKernelArg(ckKernel, 0, sizeof(cl_mem), (void*)&cm_buffer);
clEnqueueWriteBuffer(cqueue, cm_buffer, CL_TRUE, 0, sizeof(st_foo), &stVar, 0, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

[内核代码]

__kernel void testfunction(__global const st_foo *stVar)
{
    printf("stVar->aaa=%d\n", stVar->aaa);
}
Run Code Online (Sandbox Code Playgroud)

opencl

1
推荐指数
1
解决办法
4081
查看次数

标签 统计

opencl ×2

cuda ×1

nvidia ×1

openacc ×1