我试图在cuda中添加2个char数组,但没有任何工作.我试着用:
char temp[32];
strcpy(temp, my_array);
strcat(temp, my_array_2);
Run Code Online (Sandbox Code Playgroud)
当我在内核中使用它时 - 我得到了 error : calling a __host__ function("strcpy") from a __global__ function("Process") is not allowed
在此之后,我尝试在主机中使用这些函数,而不是在内核中 - 没有错误,但是在添加之后我会得到奇怪的符号????????????????????????????????.
那么,我如何添加两个(或更多)char数组CUDA呢?
我有一个代码从CUDA示例到atomicAdd单个变量
__global__ void myadd(int *data)
{
unsigned int x = blockIdx.x;
unsigned int y = threadIdx.x;
if ( (x%2==0) && (y%2==1) ) atomicAdd(data,1);
}
int main(void)
{
int *Hdt;
Hdt = (int*)malloc(sizeof(int));
// ... CUDA initialization here
myadd<<<20, 10>>>(Hdt);
cudaFree(Hdt);
}
Run Code Online (Sandbox Code Playgroud)
它对我有用.但我正在扩展我的代码,所以我想将数组而不是数字传递给内核
__global__ void myadd(int *data)
{
unsigned int x = blockIdx.x;
unsigned int y = threadIdx.x;
unsigned int z = threadIdx.y;
if ( (x%2==0) && (y%2==1) && (z>4) ) atomicAdd(data[z],1);
}
int main(void)
{
int *Hdt;
Hdt …Run Code Online (Sandbox Code Playgroud) 我正在编写CUDA程序,将模糊效果添加到BMP文件中.我编写了在CPU上执行此操作的程序,现在我正在尝试将代码转换为CUDA.这是我想要在CUDA上工作的功能:
void blur(bitmap_header* hp, unsigned char *data)
{
int xx,yy,x,y, avgB, avgG, avgR, ile;
int blurSize = 5;
for(xx = 0; xx < hp->width; xx++)
{
for(yy = 0; yy < hp->height; yy++)
{
avgB = avgG = avgR = 0;
ile = 0;
for(x = xx; x < hp->width && x < xx + blurSize; x++)
{
for(y = yy; y < hp->height && y < yy + blurSize; y++)
{
avgB += data[x*3 + y*hp->width*3 + 0];
avgG …Run Code Online (Sandbox Code Playgroud) 我有一个模板化的静态CUDA库,我希望将其包含在一个通用的c ++项目中.当我包含库的头文件时,编译器崩溃并说它无法解析特定于CUDA的符号.当然g ++编译器无法解释这些符号.我知道这个问题,但我不知道如何使用nsight IDE解决这个问题.
我正在使用nsight,cuda/nvcc库和c ++/g ++项目.
控制台输出:
make all
Building file: ../src/MedPrak.cpp
Invoking: GCC C++ Compiler
g++ -I/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/MedPrak.d" -MT"src/MedPrak.d" -o "src/MedPrak.o" "../src/MedPrak.cpp"
In file included from ../src/cudaWrapper.cu:8:0,
from ../src/MedPrak.cpp:3:
/home/voodoocode/Praktikum/MedPrak/PrivateRepo/MedPrakCuda/src/kernel.h:15:23: error: ‘__global__’ does not name a type
template <typename T> __global__ void squareVector(T *input, T *output, int size) {
Run Code Online (Sandbox Code Playgroud)
编辑:忘了提到我有一个cuda项目,其文件与库中的文件相同.cuda项目编译正常并且运行正常,所以我认为我的代码中没有大的错误.
Edit2:避免"模板库"的想法.我有一个围绕实际模板类的包装器.所以没有"空"库.
我正在查看不同CUDA计算功能的以下最大值:
如出现在这里.嗯,它看起来像CUDA 3.5及以上,至少1 x 3> 2.这意味着虽然单个线程最多可以使用255个寄存器,但如果有太多线程尝试这样做,则会发生寄存器溢出.我的解释是否正确?或者说图1.不是真的正确,每个线程真的有64个寄存器吗?
我想在以下代码中优化随机访问读取和随机访问写入:
__global__ void kernel(float* input, float* output, float* table, size_t size)
{
int x_id = blockIdx.x * blockDim.x + threadIdx.x;
if (x_id > size)
return;
float in_f = input[x_id];
int in_i = (int)(floor(in_f));
int table_index = (int)((in_f - float(in_i)) * 1024000.0f );
float* t = table + table_index;
output[table_index] = t[0] * in_f;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,表和输出的索引在运行时确定,并且完全随机.
我知道我可以使用纹理内存或__ldg()读取这些数据.所以,我的问题是:
__ldg()?output[table_index]如上所述,随机访问写入怎么样?实际上,我在这里添加代码以给出随机访问读写的示例.我不需要代码优化,我只需要高级描述处理这种情况的最佳方法.
nvcc设备代码可以访问内置值,warpSize该值设置为执行内核的设备的warp大小(即在可预见的将来为32).通常你不能把它区分为常数 - 但是如果你试图声明一个长度为warpSize的数组,你就会抱怨它是非常量的...(使用CUDA 7.5)
所以,至少为了这个目的,你有动力去做(编辑):
enum : unsigned int { warp_size = 32 };
Run Code Online (Sandbox Code Playgroud)
在你的标题中的某个地方.但是现在 - 我应该选择哪个,何时?:warpSize,或warp_size?
编辑: warpSize显然是PTX中的编译时常量.问题仍然存在.
由于CUDA 2.0x没有atomicAdd()用于double的函数,因此我atomicAddd()根据此问题定义了“ atomicAdd()”函数,
这是设备功能的代码:
__device__ double atomicAddd(double* address, double val)
{
unsigned long long int* address_as_ull =
(unsigned long long int*)address;
unsigned long long int old = *address_as_ull, assumed;
do {
assumed = old;
old = atomicCAS(address_as_ull, assumed,
__double_as_longlong(val +
__longlong_as_double(assumed)));
} while (assumed != old);
return __longlong_as_double(old);
}
Run Code Online (Sandbox Code Playgroud)
除功能名称外,代码均相同。
这是我内核的一部分:
__global__ void test(double *dev_like, double *dev_sum){
__shared__ double lik;
// some code to compute lik;
// copy lik back to global dev_lik;
dev_like[blockIdx.x] = …Run Code Online (Sandbox Code Playgroud) 我找到了有关特斯拉P100每个SM包含多少CUDA核心的信息.它的64*FP32和32*FP64.我无法找到GTX 1070的任何数字.
也是后续问题.由于特斯拉的核心比例为1:2,这意味着双精度性能是单精度内核性能的最大值的一半吗?
我正在编写一个简单的代码,尝试获取设备数量。
#include <cuda.h>
#include <iostream>
int main(){
CUcontext cudaContext;
int deviceCount = 0;
CUresult result = cuDeviceGetCount(&deviceCount);
std::cout << "device count = " << deviceCount << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
编译命令:g ++ test.cpp -lcuda
当我尝试获取设备的计数时,即使我有gpu,我也得到零。
还是应该为零?