我正在写一个CUDA内核并想要__restrict__我的一些参数.我收到错误消息:
"restrict" is not allowed
是否允许某些变量类型?对于某些参数组合?因为有些编译器标志?因为我一直顽皮?
简化的内核签名:
template <typename T> foo(
const T a[],
__restrict__ SomeType b[],
const T c
) {
/* etc. */
}
Run Code Online (Sandbox Code Playgroud) 在Java中,如果要使用对象类的名称,可以编写:
String myString = this.getClass().getSimpleName();
Run Code Online (Sandbox Code Playgroud)
C ++的等效功能是什么?也就是说,如何获取具有类名称的字符串*this?
我有n个数组.这些阵列中的每一个都可以具有无限长度.(长度可以变化).所有这些n个数组都已排序.
现在我想从这些n个排序数组中取出前k个最小元素.
例如,n = 5且k = 10
2 4 6 7 9
23 45 67 78 99
1 2 6 9 1000 4567 6567 67876
45 56 67 78 89 102 103 104
91 991 9991 99991
Run Code Online (Sandbox Code Playgroud)
现在答案应该是 1 2 4 6 7 9 23 45 56 67
在最坏的情况下,它是O(n*k),即O(n ^ 2),在最好的情况下是O(k)吗?
我正在使用 nvprof 来分析某些东西(包括 CPU 工作和 GPU 工作,即我使用 nvprof 标记等),并且我得到了 nvprof 生成的二进制文件。我可以将这些导入到 NVVP(NVidia Visual Profiler;Linux 版本)中,只需稍加努力,就可以将其保存到 XML 中。
但是...... XML 不包含有关我的各种 CPU 何时执行的计时数据。它提到了他们的存在,但没有更多。此外,XML 的末尾有这个二进制 blob,可能是 Base64 编码或其他东西,位于 PDM 标记内。我不清楚那里是否有任何帮助。
我在CUDA上写了一个简单的函数.它将图像调整为双倍缩放.对于1920*1080的图像,此功能需要~20ms才能完成.我尝试了一些不同的方法来优化该功能.而我发现可能是本地记忆是关键原因.
我尝试了三种不同的方法来获取图像.
他们都不能给我带来一点改善.
然后我使用nvvp找出原因.在上述所有三个条件下,本地内存开销约为95%.
所以我转向我的代码,了解nvcc如何使用内存.然后我发现一个简单的函数就像这样:
__global__ void performDoubleImage(float* outData, size_t step, const int cols, const int rows)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
if (x >= cols)
return;
int y = threadIdx.y + blockIdx.y * blockDim.y;
if (y >= rows)
return;
((float*)((size_t)outData+y*step))[x] = tex2D(texRef, x/2, y/2);
}
Run Code Online (Sandbox Code Playgroud)
需要80字节的堆栈帧(它们在本地内存中).
而另一个功能是这样的:
__global__ void performFinalDoubleImage(const PtrStepSz<float> in, PtrStepSz<float> out)
{
out(out.rows-1, out.cols-1) = out(in.rows-1, in.cols-1);
}
Run Code Online (Sandbox Code Playgroud)
还需要88字节的堆栈帧.
问题是,为什么我的函数在这个简单的任务中使用了如此多的本地内存和寄存器?为什么OpenCV中的函数可以通过不使用本地内存来执行相同的功能(这是由nvvp测试,本地内存负载是ZERO)?
我的代码是在调试模式下编译的.我的卡是GT650(192 SP/SM,2 SM).
常用(?)的 DBMS 基准之一称为 SSB,星型模式基准)。要运行它,您需要生成模式,即包含数据的表。嗯,你可以在各种地方找到一个生成器程序(在 github 上):
\n\n也可能在其他地方。我不确定它们都有完全相同的代码,但我似乎遇到了同样的问题。我正在使用 Linux 64 位系统(Kubuntu 14.04,如果有帮助的话);并尝试从该包构建并运行“dbgen\”程序。
\n\n构建时,我收到与类型/大小相关的警告:
\n\nme@myhost:~/src/ssb-dbgen$ make\n... etc. etc. ...\ngcc -O -DDBNAME=\\"dss\\" -DLINUX -DDB2 -DSSBM -c -o varsub.o varsub.c\nrnd.c: In function \xd7\x92row_stop\xd7\x92:\nrnd.c:60:6: warning: format \xd7\x92%d\xd7\x92 expects argument of type \xd7\x92int\xd7\x92, but argument 4 has type \xd7\x92long int\xd7\x92 [-Wformat=]\n i, Seed[i].usage);\n ^\ndriver.c: In function \xd7\x92partial\xd7\x92:\ndriver.c:606:4: warning: format \xd7\x92%d\xd7\x92 expects argument of type \xd7\x92int\xd7\x92, but argument 4 has type \xd7\x92long int\xd7\x92 …Run Code Online (Sandbox Code Playgroud) 在C ++ 14维基百科页面描述的新的语言功能,通过类型的寻址元组,与您可以做写:
tuple<string, string, int> t("foo", "bar", 7);
int i = get<int>(t); // i == 7
Run Code Online (Sandbox Code Playgroud)
好吧,通常这会失败,即在通常情况下,一个元组具有多个相同类型的元素。这是一种非常特殊的(虽然我承认,这是很常见的)元组,但每个类型都有一个值。并且这种get隐含了-表示get<T>(t)形式的语义,好像不同类型中的值以某种方式相关。Tt
为什么拥有这样一种方法(在一般情况下不适用,并且似乎与某些情况相关)是一个好主意,我想您可以说出元组的子类吗?
我正在研究的这个C项目有一个脚本,它作为构建的一部分运行,这需要一些文件夹在$ PATH中.但是 - 其他项目不应该在它们的路径中,Eclipse本身也不应该.因此,这不是要替换路径,而是为特定项目附加路径.
我在Eclipse的项目设置对话框中找不到这样做的方法; 这个功能存在吗?如果没有,除了让我的脚本本身附加到$ PATH之外,你能否建议一个解决方法?
我在我的新手机上使用 Android 5.0。我正在尝试禁用通过 USB 验证应用程序(在“设置”>“开发人员选项”下);我一般都启用了开发人员选项,但此特定设置仍然呈灰色。为什么?我怎样才能禁用它?
在现代C++中,以下编译并按预期运行:
for(const auto& x : {"hello", "nice", "world"}) {
cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)
但是如果初始化列表包含不同类型的元素,我就不能再编译代码了:
for(const auto& x : {"hello", 123, '4'}) {
cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么不编译运行?这个初始化列表不能被理解为3 tuple?或者experimental::anys 的初始化列表?或者其他的东西?
笔记:
--std=c++14; --std=c++17什么都不改变.<experimental/any>.unable to deduce ‘std::initializer_list<auto>&&’ from ‘{"hello", 123, '4'}’.