我正在尝试实现一种类似洪水填充的算法。问题是我不确定我应该以什么方式实现它,例如递归 - 非递归。
我知道每个都有其缺陷,但其中一个必须比另一个更快。当非递归每次分配 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) 最近我一直在使用推力很多.我注意到为了使用推力,必须始终将数据从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用作包装器,但这仍然无法解决我的问题.
谢谢!
是否可以使用过剩创建一个固定大小的窗口,因此任何窗口尺寸的变化都将被忽略.
切换回SDL或类似的东西有点太迟了.
我试图用来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阵列?
谢谢!
我创建了一个小程序,它在一个新的桌面上启动.
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) 我正在尝试计算包含点(x,y)的某个数组的平均值.
是否有可能使用推力来找到表示为(x,y)点的平均点?我也可以将数组表示为thrust::device_vector<int>每个单元格包含点的绝对位置的时间,这意味着i*numColumns + j虽然我不确定平均数字代表平均单元格.
谢谢!
我收到以下消息:
不支持Double.降级为漂浮
我将以下命令添加到编译器中:-arch=sm_20但我仍然收到该消息.
我使用sdk 4与Nvida G105M.
这条消息是什么意思?
我在这里得到一个恼人的消息,我不太确定我做错了什么.
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()"无法调用使用给定的参数列表
谢谢!
这里描述的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版本完全协调.
我习惯使用旧的WinAPI调用CreateThread(),并使用等待函数检查线程的状态,例如WaitForSingleObject(),一旦发出线程线程信号WAIT_OBJECT_0,我使用它关闭它CloseHandle().
最近我决定转移beginthread并以某种方式避免未初始化的crt和可能发生的意外内存泄漏的风险.
这样做让我很困惑.
endthread()什么?为什么当我调用CloseHandle()main函数时,在执行线程后,CloseHandle()崩溃时会出现无效句柄?beginthread吗?endthread,据我所知,一旦我的功能超出范围,线程会自动调用,所以我应该在我超出范围之前调用它吗?CloseHandle()1.From线程从哪里获取其句柄的引用/实例.2.如果我坚持使用endthread(),它应该是线程中的最后一个命令吗?谢谢
编辑:这里描述泄漏的MSDN论文.