【发布时间】:2022-01-24 02:11:28
【问题描述】:
我是一名在 CUDA 中研究并行列表排名算法的初学者。我不知道为什么在使用“nvcc ParallelListRanking.cu -o ParallelListRanking”进行编译时,会出现未定义的对 threadIdx.x、blockDim.x 和 blockIdx.x 的引用错误,并显示消息“ld 返回了退出 1 状态”。添加 #include "device_launch_parameters.h" 和 #include "cuda.h" 没有帮助。有什么想法可以解决这个问题?
#include<stdio.h>
#include <device_launch_parameters.h>
#include <cuda.h>
__global__ void set_up(unsigned long int n, unsigned long int *dS, unsigned long long int *dQR){
unsigned long int i = threadIdx.x + blockDim.x * blockIdx.x;
if (i < n) {
dS[i] = i + 1;
dS[n-1] = 0;
if (dS[i] != 0) {
dQR[i] = (dQR[i]%(1ull<<32)) + (1ull<<32) * 1ull;
}
else {
dQR[i] = (dQR[i]%(1ull<<32)) + (1ull<<32) * 0ull;
}
dQR[i] = ((unsigned long long int) dS[i])%(1ull<<32) + (1ull<<32)*(dQR[i]/(1ull<<32));
}
}
__global__ void update(unsigned long int n, unsigned long long int *dQR) {
unsigned long int i = threadIdx.x + blockDim.x * blockIdx.x;
if (i < n) {
unsigned long int tempdQ = (unsigned long int) (dQR[i]%(1ull<<32));
unsigned long int tempdQQ = (unsigned long int) (dQR[tempdQ]%(1ull<<32));
if (tempdQ != 0 && tempdQQ != 0) {
unsigned long long int tmpdQRQ = dQR[tempdQ];
unsigned long int tempdR = (unsigned long int) dQR[i]/(1ull<<32);
unsigned long long int tempdRQ = tmpdQRQ/(1ull<<32);
dQR[i] = ((unsigned long long int) tempdQQ)%(1ull<<32) + (((unsigned long long int) tempdR) + tempdRQ)*(1ull<<32);
tempdQ = tempdQQ;
tempdQQ = (unsigned long int) dQR[tempdQ]%(1ull<<32);
}
}
}
int main() {
unsigned long int n = 1000;
unsigned long int *dS =(unsigned long int *) cudaMalloc((int **)n, sizeof(unsigned long int));
unsigned long long int *dQR = (unsigned long long int *) cudaMalloc((int **)n, sizeof(unsigned long long int));
unsigned long int i = threadIdx.x + blockDim.x * blockIdx.x;
set_up<<< 100, 100 >>>(n, dS, dQR);
for (int t = 1; t < n; t++) {
update<<< 100, 100>>>(n, dQR);
}
printf("%lu", (unsigned long int) (dQR[i]%(1ull<<32)));
printf("\n");
printf("%lu", (unsigned long int) (dQR[i]/(1ull<<32)));
cudaFree(dQR);
cudaFree(dS);
return 0;
}
【问题讨论】:
标签: cuda