小编iga*_*l k的帖子

哪种洪水填充算法的性能更好?

我正在尝试实现一种类似洪水填充的算法。问题是我不确定我应该以什么方式实现它,例如递归 - 非递归。
我知道每个都有其缺陷,但其中一个必须比另一个更快。当非递归每次分配 4 个新点时,递归在堆栈上打开新函数。
非迭代示例:

Stack<Point> stack = new Stack<Point>();
    stack.Push(q);
    while (stack.Count > 0)
    {
        Point p = stack.Pop();
        int x = p.X;
        int y = p.Y;
        if (y < 0 || y > h - 1 || x < 0 || x > w - 1)
                continue;
        byte val = vals[y, x];
        if (val == SEED_COLOR)
        {
                vals[y, x] = COLOR;
                stack.Push(new Point(x + 1, y));
                stack.Push(new Point(x - 1, y));
                stack.Push(new Point(x, y + 1)); …
Run Code Online (Sandbox Code Playgroud)

algorithm graphics recursion flood-fill

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

是否有更好,更快的方法使用推力从CPU内存复制到GPU?

最近我一直在使用推力很多.我注意到为了使用推力,必须始终将数据从cpu内存复制到gpu内存.
我们来看下面的例子:

int foo(int *foo)
{
     host_vector<int> m(foo, foo+ 100000);
     device_vector<int> s = m;
}
Run Code Online (Sandbox Code Playgroud)

我不太确定host_vector构造函数是如何工作的,但似乎我正在复制初始数据,来自*foo,两次 - 初始化时一次到host_vector,另一次device_vector初始化时.是否有更好的方法从cpu复制到gpu而不制作中间数据副本?我知道我可以device_ptr用作包装器,但这仍然无法解决我的问题.
谢谢!

cuda thrust

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

是否有可能创建一个固定大小的过剩窗口?

是否可以使用过剩创建一个固定大小的窗口,因此任何窗口尺寸的变化都将被忽略.

切换回SDL或类似的东西有点太迟了.

opengl glut

8
推荐指数
2
解决办法
8851
查看次数

如何通过常量减少device_vector的每个元素?

我试图用来thrust::transform减少a的每个元素的常量值device_vector.如您所见,最后一行不完整.我试图从所有元素减去常数,fLowestVal但不知道究竟是多少.

thrust::device_ptr<float> pWrapper(p);
thrust::device_vector<float> dVector(pWrapper, pWrapper + MAXX * MAXY);
float fLowestVal = *thrust::min_element(dVector.begin(), dVector.end(),thrust::minimum<float>());

// XXX What goes here?
thrust::transform(...);
Run Code Online (Sandbox Code Playgroud)

另一个问题:一旦我对其进行了更改device_vector,更改是否也适用于p阵列?

谢谢!

cuda thrust

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

新创建的桌面不会收到键盘事件

我创建了一个小程序,它在一个新的桌面上启动.

HDESK hDesktop = ::CreateDesktop(strDesktopName.c_str(),
                                    NULL, // Reserved
                                    NULL, // Reserved
                                    0, // DF_ALLOWOTHERACCOUNTHOOK
                                    GENERIC_ALL,
                                    NULL); // lpSecurity
::SetThreadDesktop(hDesktop);
Run Code Online (Sandbox Code Playgroud)

稍后,使用以下行在该桌面上启动另一个应用程序:

PROCESS_INFORMATION pi = { 0 };
STARTUPINFO         si = { 0 };

si.cb = sizeof(si);
si.lpDesktop = &strDesktop[0];
if (FALSE == ::CreateProcess(pathModuleName.file_string().c_str(), L"abc def", NULL, NULL,      FALSE, 0, NULL, NULL, &si, &pi))
    return false;

DWORD dwWaitRes = ::WaitForSingleObject(pi.hProcess, INFINITE);
Run Code Online (Sandbox Code Playgroud)

pathModuleName是一个自我获得的位置GetModuleFileName(NULL).

新创建的应用程序获取HWND到另一个窗口并使用以下命令发送窗口消息:

// bring window to front
::SetForegroundWindow(hwnd);

// set focus so keyboard inputs will be caught
::SetFocus(hwnd); …
Run Code Online (Sandbox Code Playgroud)

c++ winapi window-messages

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

如何使用Thrust计算int2数组的平均值

我正在尝试计算包含点(x,y)的某个数组的平均值.
是否有可能使用推力来找到表示为(x,y)点的平均点?我也可以将数组表示为thrust::device_vector<int>每个单元格包含点的绝对位置的时间,这意味着i*numColumns + j虽然我不确定平均数字代表平均单元格.
谢谢!

cuda average thrust

5
推荐指数
2
解决办法
2802
查看次数

编译器警告:不支持Double.降级为漂浮

我收到以下消息:

不支持Double.降级为漂浮

我将以下命令添加到编译器中:-arch=sm_20但我仍然收到该消息.
我使用sdk 4与Nvida G105M.

这条消息是什么意思?

cuda

4
推荐指数
2
解决办法
5214
查看次数

无法为thrust :: cuda min_element()函数构建比较谓词

我在这里得到一个恼人的消息,我不太确定我做错了什么.

float4 *IntsOnHost = new float4[ MAXX * (MAXY - 1) ];
//copy possible intersection points from device to host
CU_SAFE_CALL(cudaMemcpy(IntsOnHost,IntsOnDevToCpyToHost,(MAXX*(MAXY - 1)-1)*sizeof(float4),cudaMemcpyDeviceToHost));
thrust::device_vector<float4> IntsOnDev (IntsOnHost,IntsOnHost + (MAXX * (MAXY - 1)-1)*sizeof(float4)); 
//find the index of the smallest intersection point
thrust::device_vector<float4>::iterator it =  thrust::min_element(IntsOnDev.begin(),IntsOnDev.end(),equalOperator());   
Run Code Online (Sandbox Code Playgroud)

和谓词:

struct equalOperator
{
  __host__ __device__
    bool operator()(float4 x, float4 y)
    {
        return ( x.w > y.w );
    }
};
Run Code Online (Sandbox Code Playgroud)

错误信息:

1> c:\ program files \nvidia gpu computing toolkit\cuda\v4.0\include\thrust\detail\device\generic\extrema.inl(104):error:function"equalOperator :: operator()"无法调用使用给定的参数列表

谢谢!

cuda thrust

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

如何根据Windows版本正确加载GetMappedFileName

这里描述的MSDN备注部分特别提到了以下函数的加载类型之间存在差异.

由于我的模块是可移植的并且动态加载模型,因此我不允许/能够使用任何预处理器命令:

#if (PSAPI_VERSION == 2)
            (GetProcAddress("kernel32.dll", OBFUSCATE(L"K32GetMappedFileNameW")));
#elif (PSAPI_VERSION == 1)
            (GetProcAddress("psapi.dll", OBFUSCATE(L"GetMappedFileNameW")));
#endif
Run Code Online (Sandbox Code Playgroud)

此外 -

Windows 7和Windows Server 2008 R2上的Kernel32.dll; Windows 7和Windows Server 2008 R2上的Psapi.dll(如果PSAPI_VERSION = 1); Windows Server 2008,Windows Vista,Windows Server 2003和Windows XP上的Psapi.dll

不清楚Windows版本如何与PSAPI版本完全协调.

c++ windows winapi windows-xp windows-7

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

如何正确使用_beginthread和endthread

我习惯使用旧的WinAPI调用CreateThread(),并使用等待函数检查线程的状态,例如WaitForSingleObject(),一旦发出线程线程信号WAIT_OBJECT_0,我使用它关闭它CloseHandle().

最近我决定转移beginthread并以某种方式避免未初始化的crt和可能发生的意外内存泄漏的风险.

这样做让我很困惑.

  1. 目的是endthread()什么?为什么当我调用CloseHandle()main函数时,在执行线程后,CloseHandle()崩溃时会出现无效句柄?
  2. 我应该关闭退回的手柄beginthread吗?
  3. endthread,据我所知,一旦我的功能超出范围,线程会自动调用,所以我应该在我超出范围之前调用它吗?
  4. 根据msdn,endthread已经调用CloseHandle()1.From线程从哪里获取其句柄的引用/实例.2.如果我坚持使用endthread(),它应该是线程中的最后一个命令吗?

谢谢

编辑:这里描述泄漏的MSDN论文.

c++ winapi multithreading

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