我试图了解手写内核的每个CUDA线程的资源使用情况.
我把我的kernel.cu文件编译成了一个kernel.o文件nvcc -arch=sm_20 -ptxas-options=-v
我得到了以下输出
ptxas info : Compiling entry function 'searchkernel(octree, int*, double, int, double*, double*, double*)' for 'sm_20'
ptxas info : Function properties for searchkernel(octree, int*, double, int, double*, double*, double*)
72 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 46 registers, 176 bytes cmem[0], 16 bytes cmem[14]
Run Code Online (Sandbox Code Playgroud)
看看上面的输出,这是正确的
我在理解输出方面也遇到了一些问题.
我的内核调用了很多c++filt函数.IS 72字节是__device__和__global__函数堆栈帧的内存总和?
__device__和之间有什么区别0 byte spill stores …
我有两个数组values,keys两个长度相同.我想values使用keys数组作为键对数组进行排序.我被告知boost的zip迭代器只是将两个数组锁定在一起并同时对它们进行处理的正确工具.
这是我尝试使用boost :: zip_iterator来解决无法编译的排序问题gcc.有人可以帮我修复这段代码吗?
问题在于线
std::sort ( boost::make_zip_iterator( keys, values ), boost::make_zip_iterator( keys+N , values+N ));
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <algorithm>
#include <boost/iterator/zip_iterator.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
int main(int argc, char *argv[])
{
int N=10;
int keys[N];
double values[N];
int M=100;
//Create the vectors.
for (int i = 0; i < N; ++i)
{
keys[i] = rand()%M;
values[i] = 1.0*rand()/RAND_MAX;
} …Run Code Online (Sandbox Code Playgroud) 所以我对C++中虚函数的概念不熟悉,像这样的线程很好地销售了这个概念.好的,我确信.
但为什么虚拟功能称为"虚拟"?我的意思是这些功能与通常的功能/方法一样"具体"不是吗?如果有人能够解释"虚拟"这个词的选择来命名这个概念,那就太好了.
我对以下代码的输出感到困惑.
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int a[] = {1,2,3};
cout << a << " " << &a << endl;
cout << sizeof(a) << " " << sizeof(&a) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
0xbfcd3ae4 0xbfcd3ae4
12 4
Run Code Online (Sandbox Code Playgroud)
如何能a与&a打印相同的表达,但有不同的大小?我一直认为对于任何数组,其名称始终具有第一个字节的value =地址.
也&a应该没有意义,因为一个地址(通过&运算符获得)不能到地址(a的值).然而,代码根据输出给出输出和实际上'a ==&a'.
同样,为什么sizeof(a) = 12数组的输出(占用的总内存)?a作为"指针"本身sizeof(a)= 4字节(在我的32位Ubuntu 11.04上)
显然我有一些误解.有人可以为我解决这个问题吗?
可能重复:
构造函数初始化列表评估顺序
在为类编写C++构造函数时,为什么初始化成员字段的顺序应该是它们的声明顺序?
请考虑以下C++代码.在使用gcc(gcc -g -Wall foo.cpp)进行编译时,我收到了警告
g++ -g -Wall main.cpp
main.cpp: In constructor ‘myclass::myclass(int, int, int, int, int, int)’:
main.cpp:12: warning: ‘myclass::z’ will be initialized after
main.cpp:11: warning: ‘int myclass::y’
main.cpp:26: warning: when initialized here
Run Code Online (Sandbox Code Playgroud)
这是代码.在此,成员z出现在构造函数类的初始化列表中,y并抛出上述警告.
#include <iostream>
#include <iomanip>
class myclass
{
public:
int x;
int y;
int z;
myclass(int num1, int num2, int num3, int num4, int num5, int num6);//constructor for the class
private:
int a;
int b;
int c;
};
myclass::myclass(int num1, …Run Code Online (Sandbox Code Playgroud) 加速应用程序的常用方法是使用MPI或更高级别的库来并行化应用程序,例如使用MPI的PETSc.
然而,现在每个人似乎都有兴趣使用CUDA来并行化他们的应用程序或使用MPI和CUDA的混合来解决更大的问题.
使用混合MPI + CUDA编程模型比传统的,经过试验和测试的并行编程MPI模型有明显的优势吗?我特别在粒子方法的应用领域中提出这个问题
我提出这个问题的一个原因是网络上的任何地方我都看到"粒子方法自然地映射到GPU的架构"这一陈述或其中的一些变体.但他们似乎没有理由为什么我会更好地使用CUDA而不是仅使用MPI来完成相同的工作.
假设我有一个键向量
thrust::device_vector<int> keys(10);
keys[0] = 51; // ----->
keys[1] = 51;
keys[2] = 72; // ----->
keys[3] = 72;
keys[4] = 72;
keys[5] = 103; //----->
keys[6] = 103;
keys[7] = 504; // ------>
keys[8] = 504
keys[9] = 504 ;
Run Code Online (Sandbox Code Playgroud)
我事先就知道4这个向量中有不同的键值。我想填充两个设备数组
pidx[4]和pnum[4].
该pidx数组为我提供了键向量中每个不同键的第一个位置,即---->上面代码片段中标记的位置。所以,在这个例子中,我应该有pidx[4] = {0, 2, 5, 7}.
该pnum数组为我提供了每个键的出现次数。所以,在这个例子中,我应该有
pnum[4] = {2, 3, 2, 3}.
如何使用 CUDA Thrust 执行上述操作?
是否可以在MATLAB或Octave中定义自己的概率密度函数并用它来生成随机数?
MATLAB和Octave有默认函数,比如rand,randn内置从统一或正态分布中随机绘制点,但似乎没有关于如何定义我自己的proability密度函数的文档.
我很好奇为什么cin会以下列方式行事.我想我可能对它的行为有一些误解.
考虑这个简单的代码.此代码要求输入一些输入,所有输入都在最后一个语句中打印出来.
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char** argv) {
cout << "Please enter your input: " ;
int a=3, b=87; // initialized to some random integers
string s = "Mary" ; // initialized to a random string
cin >> a ;
cin >> b ;
getline(cin,s);
cout << "You entered the following " << a << " " << b << " " << s << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在如果输入是12 …
我有关于析构函数的基本问题.
假设我有以下课程
class A
{
public:
int z;
int* ptr;
A(){z=5 ; ptr = new int[3]; } ;
~A() {delete[] ptr;};
}
Run Code Online (Sandbox Code Playgroud)
现在析构函数应该破坏对象的实例化.上面的析构函数完全是这样,释放由new分配的动态分配的内存.
但是这个变量z怎么样?我应该如何手动销毁它/释放分配的内存z?当课程超出范围时会自动销毁吗?